我试图在Linux上的Qt小部件播放video。
如何在Qt中实现一个基于GStreamer的video小部件?
上述问题与我想要的非常接近,但6岁。 QApplication::syncX();
在qt5中不再存在,所以我放弃了这一点。 我也更改gst_x_overlay_set_xwindow_id()
gst_video_overlay_set_window_handle
为gstreamer版本更改。
我的pipe道工程,如果我没有通过video接收器的任何窗口句柄(它只是popup一个新的video窗口)。 我不知道是否我错过了一些东西来让它在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);
如果这里的目的只是渲染视频,你可以使用autovideosink
为你创建一个合适的窗口,你不需要担心手动处理。
但是,如果您仍然想要在小部件窗口上渲染它,请尝试使用appsink
,读取接收器上的帧并使用小部件中的onPaint
事件来渲染帧。 只要确保这些帧的格式可以像RGB那样渲染,你可以通过videoconvert
或通过capsfilter
确保格式。 你也可以使用glimagesink
并传递你的窗口ID来渲染帧。
如果你想使用appsink
提到的qvideowidget
在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);