我想使用Qt创建一个可以播放本地视频文件的简单GUI应用程序.我可以使用Phonon完成幕后的所有工作,但我需要更多的控制.我已经使用decodebin和autovideosink元素成功实现了GStreamer管道.现在我想使用Qt小部件将输出引导到.
有没有人成功过这样做?(我想是因为有基于Qt的视频播放器建立在GStreamer之上.)有人能指出我正确的方向如何做到这一点吗?
注意:此问题类似于我之前发布的有关如何将Qt与传入RTP流连接的问题.这似乎非常具有挑战性.我想这个问题会更容易回答.
Patrice建议使用libVLC非常有用.这是VLC网站上的代码的一个更简洁的版本: Qt + libVLC的示例.但是,我原来的问题仍然存在:如何将GStreamer连接到Qt小部件?
经过一些实验,我最终得到了这个工作样本.它取决于我自己的小GstSupport库中的GstWidget.h和GstWidget.cpp.但请注意,目前仅在Mac版的Qt上进行了测试.
由于Phonon基于gstreamer,所以寻找细节的地方是Phonon源树(可在此处获取:http://gitorious.org/phonon/import/trees/master).对于视频播放器,您很可能需要一个视频显示小部件,例如gstreamer/videowidget.h(cpp),后者又使用X11渲染器(gstreamer/x11renderer.h,cpp).使用的接收器是xvimagesink,如果第一个无法创建,则回落到ximagesink上.
基本技巧是将VideoWidget与视频输出重叠.使用QWidget :: winId方法检索需要执行此操作的X11句柄,该方法是特定于平台的(因为是接收器,因此没有大问题).
此外,如果覆盖不可用,则使用QWidgetVideoSink,它将视频帧转换为WidgetRenderer类的各个帧.反过来,该类使当前帧可用作QImage对象,可用于任何类型的处理.
所以要回答你的问题 - 使用叠加(作为X11Renderer)或从视频流中提取单个QImages(作为QWidgetVideoSink).
要将Gstreamer与QWidget连接起来,您需要使用窗口句柄QWidget::winId()并将其传递给gst_x_overlay_set_xwindow_id();
粗略的示例代码:
sink = gst_element_factory_make("xvimagesink", "sink");
gst_element_set_state(sink, GST_STATE_READY);
QApplication::syncX();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(sink), widget->winId());
Run Code Online (Sandbox Code Playgroud)
此外,您将希望您的窗口小部件由本机窗口支持,该窗口是通过Qt::AA_NativeWindows在应用程序级别设置属性或Qt::WA_NativeWindow在窗口小部件级别设置属性来实现的.
| 归档时间: |
|
| 查看次数: |
15720 次 |
| 最近记录: |