【发布时间】:2016-07-03 09:39:38
【问题描述】:
几个月来,我一直在尝试将 gstreamer 相机输出绘制到 QML 对象上。至少在我的 ARM 系统上,没有一个 qt-gstreamer qml 组件真正与相机输出一起工作(我可以显示测试视频源),但从来没有来自相机的任何东西。
因此,我通过以下示例进入了在常规 qt 窗口上渲染的老派:
#include <glib.h>
#include <gst/gst.h>
#include <gst/video/videooverlay.h>
#include <QApplication>
#include <QTimer>
#include <QWidget>
int main(int argc, char *argv[])
{
if (!g_thread_supported ())
g_thread_init (NULL);
gst_init (&argc, &argv);
QApplication app(argc, argv);
app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit ()));
// prepare the pipeline
GstElement *pipeline = gst_pipeline_new ("xvoverlay");
GstElement *src = gst_element_factory_make ("v4l2src", NULL);
GstElement *sink = gst_element_factory_make ("xvimagesink", NULL);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
// prepare the ui
QWidget window;
window.resize(320, 240);
window.show();
WId xwinid = window.winId();
gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), xwinid);
// run the pipeline
GstStateChangeReturn sret = gst_element_set_state (pipeline,
GST_STATE_PLAYING);
if (sret == GST_STATE_CHANGE_FAILURE) {
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
// Exit application
QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
}
int ret = app.exec();
window.hide();
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return ret;
}
这里我是 QWidget 的窗口 ID,并在其中覆盖了视频。这是唯一对我有用的东西。
但是,现在我想知道,是否可以获取底层 qt 图形元素的窗口 ID。所以,例如,如果我有类似的东西:
ApplicationWindow {
id: rootWindow
objectName: "window"
visible: true
width: 800
height: 480
color: "#FFFFFF"
Rectangle {
width: 100
height: 100
color: "red"
border.color: "black"
border.width: 5
radius: 10
}
}
是否可以获得底层图形窗口对象的 ID 或不存在?是否有一些组件具有自己的图形 ID,我可以在 QML 中使用,然后从我的 C++ 应用程序中查询并使用它来覆盖视频?
【问题讨论】:
-
它不可避免地有一个QWindow,但它会绘制视频而不是整个QML窗口。所以像这样使用 QML 几乎没有意义。
-
是的,这很难做到……我现在正在尝试一些事情,并且会更新。