gpt4 book ai didi

c++ - 如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序

转载 作者:太空狗 更新时间:2023-10-29 21:37:03 25 4
gpt4 key购买 nike

我正在尝试在 Linux 上的 Qt 小部件中播放视频。

How to implement a video widget in Qt that builds upon GStreamer?

上面的问题非常接近我想要的,但是 6 岁了。 QApplication::syncX(); 在 qt5 中不再存在,所以我放弃了它。我还针对 gstreamer 版本更改将 gst_x_overlay_set_xwindow_id() 更改为 gst_video_overlay_set_window_handle

如果我不将任何窗口句柄传递给视频接收器,我的管道就会工作(它只会弹出一个包含视频的新窗口)。我不确定我是否遗漏了一些东西来让它在 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 来渲染帧。

如果你想使用上面提到的 appsinkqvideowidget 上呈现视频,你可以尝试:

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);

关于c++ - 如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38512853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com