我想使用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。但请注意,目前仅在Qt的Mac版本上进行了测试。
答案 0 :(得分:7)
由于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)。
答案 1 :(得分:7)
要将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
属性来实现的。
答案 2 :(得分:3)
VLC版本是基于QT的视频播放器(自0.99版本起)。它也允许流式传输或读取流:您可以在此处找到所需的所有信息:http://wiki.videolan.org/Developers_Corner。您只需创建播放器的实例并将其与窗口小部件相关联。然后你可以完全控制玩家。
我已经测试了它(在Linux和Windows上)播放本地音乐和视频文件,它运行正常。
试一试,亲眼看看。
希望有所帮助。
修改强> 看来如果您想使用VLC,您需要编写或查找(我不知道是否存在)GStreamer编解码器作为videolan wiki的解释。我想我会这样做。