我想使用Qt创建一个可以播放本地视频文件的简单GUI应用程序。我可以使用Phonon来完成幕后的所有工作,但我需要更多的控制。我已经使用decodebin和autovideosink元素成功实现了GStreamer管道。现在我想使用Qt小部件将输出引导到。
有没有人成功过这样做? (我想是因为有基于Qt的视频播放器建立在GStreamer之上。)有人能指出我正确的方向如何做到这一点吗?
注意:此问题类似于我之前发布的有关如何将Qt与传入RTP流连接的问题。这似乎非常具有挑战性。我想这个问题会更容易回答。
Patrice建议使用libVLC非常有用。这是VLC网站上的代码更简洁的版本:Sample for Qt + libVLC。但是,我原来的问题仍然存在:如何将GStreamer连接到Qt小部件?
经过一些实验,我最终得到了this working sample。这取决于我自己的小GstSupport库中的GstWidget.h和GstWidget.cpp。但请注意,目前仅在Mac版的Qt上进行了测试。
要将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());
此外,您将希望您的窗口小部件由本机窗口支持,该窗口是通过在应用程序级别设置Qt::AA_NativeWindows
属性或在窗口小部件级别设置Qt::WA_NativeWindow
属性来实现的。
由于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)。
VLC版本是基于QT的视频播放器(自0.99版本起)。它也允许流式传输或读取流:您可以在此处找到所需的所有信息:http://wiki.videolan.org/Developers_Corner。您只需创建播放器的实例并将其与窗口小部件相关联。然后你可以完全控制玩家。
我已经测试了它(在Linux和Windows上)播放本地音乐和视频文件,它工作正常。
试一试,亲自看看。
希望有所帮助。
编辑:看来如果你想使用VLC,你需要编写或找到(我不知道是否存在)GStreamer编解码器作为videolan wiki上的解释。我想我会这样做。