如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序
Posted
技术标签:
【中文标题】如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序【英文标题】:How to add a gstreamer 1.0 video element to a qt5 app 【发布时间】:2016-07-21 19:31:54 【问题描述】:我正在尝试在 Linux 上的 Qt 小部件中播放视频。
How to implement a video widget in Qt that builds upon GStreamer?
上面的问题非常接近我想要的,但是 6 岁。 QApplication::syncX();
在 qt5 中不再存在,所以我放弃了它。我还将 gst_x_overlay_set_xwindow_id()
更改为 gst_video_overlay_set_window_handle
以更改 gstreamer 版本。
如果我不将任何窗口句柄传递给视频接收器(它只是弹出一个带有视频的新窗口),我的管道就可以工作。我不确定我是否遗漏了一些东西来让它在 Qt 中渲染。
编辑
我可以将整个应用程序窗口设置为覆盖,但不能设置主窗口小部件的子部分。此外,无法让 appsink 工作,但 glimagesink 似乎工作。
// QWidget* widget = QApplication::activeWindow(); // this works
QWidget* widget = new QWidget(ui->base_widget); // this doesn't work
widget->setAttribute(Qt::WA_NativeWindow, true);
widget->resize(320,240);
widget->update();
widget->setStyleSheet("background-color: red");
widget->show();
winId = widget->winId();
QApplication::sync();
gst_video_overlay_set_window_handle(GST_VIDEO_OVERLAY(sink) , winId);
【问题讨论】:
最好把你的一些代码贴出来看看缺少什么。 【参考方案1】:如果这里的目的只是渲染视频,您可以使用autovideosink
,它将为您创建一个合适的窗口,您无需担心手动处理。
但是,如果您仍想在小部件窗口上呈现它,请尝试使用 appsink
,读取接收器上的帧并使用小部件中的 onPaint
事件来呈现帧。只要确保帧的格式可以像 RGB 一样渲染,您可以通过 videoconvert
或通过 capsfilter
确保格式。您也许还可以使用 glimagesink
并传递您的窗口 ID 以呈现帧。
如果您想使用appsink
在qvideowidget
上呈现视频,如上所述,您可以尝试:
video_widget->setAttribute(Qt::WA_NativeWindow, true);
WId win_id = video_widget->winId();
QApplication::sync();
gst_x_overlay_set_window_handle(GST_X_OVERLAY(data->appsink), win_id);
【讨论】:
谢谢 Samer,我会试试 appsink。您建议我使用的 onPaint 事件是什么?粗略的谷歌搜索让我失望了。有没有我可以查看的参考资料。 onPaint 使用的是 Canvas 类型。有关详细信息,请参见此处:doc.qt.io/qt-5/qml-qtquick-canvas.html。最快的方法是使用带有我上面粘贴的代码的 qvideowidget。这允许您将视频小部件与应用程序接收器链接。 我在让一切正常工作时仍然遇到了一些问题,如果你觉得 Samer 没问题,可能会回来再问你几个问题 =) 当然,这就是我们都在这里的原因;) 我找不到 gst_x_overlay_set_window_handle 但我确实有 gst_video_overlay_set_window_handle。 gst_x_overlay_set_window_handle 仍然是 gstreamer 1.0 的一部分吗?以上是关于如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何通过动态链接在 GStreamer 合成器中正确播放视频?