如何在Qt中实现基于GStreamer的视频小部件?

问题描述 投票:10回答:3

我想使用Qt创建一个可以播放本地视频文件的简单GUI应用程序。我可以使用Phonon来完成幕后的所有工作,但我需要更多的控制。我已经使用decodebin和autovideosink元素成功实现了GStreamer管道。现在我想使用Qt小部件将输出引导到。

有没有人成功过这样做? (我想是因为有基于Qt的视频播放器建立在GStreamer之上。)有人能指出我正确的方向如何做到这一点吗?

注意:此问题类似于我之前发布的有关如何将Qt与传入RTP流连接的问题。这似乎非常具有挑战性。我想这个问题会更容易回答。

Update 1

Patrice建议使用libVLC非常有用。这是VLC网站上的代码更简洁的版本:Sample for Qt + libVLC。但是,我原来的问题仍然存在:如何将GStreamer连接到Qt小部件?

Update 2

经过一些实验,我最终得到了this working sample。这取决于我自己的小GstSupport库中的GstWidget.hGstWidget.cpp。但请注意,目前仅在Mac版的Qt上进行了测试。

c++ qt gstreamer
3个回答
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属性来实现的。


7
投票

由于Phonon基于gstreamer,所以寻找细节的地方是Phonon源树(可在此处获取:http://gitorious.org/phonon/import/trees/master)。对于视频播放器,您很可能需要一个视频显示小部件,例如gstreamer/videowidget.hcpp),后者又使用X11渲染器(gstreamer/x11renderer.hcpp)。使用的水槽是xvimagesink,如果第一个无法创建,则回落到ximagesink

基本技巧是将VideoWidget与视频输出重叠。使用QWidget::winId方法检索需要执行此操作的X11句柄,该方法是特定于平台的(因为是接收器,因此没有大问题)。

此外,如果叠加不可用,则使用QWidgetVideoSink,它将视频帧转换为WidgetRenderer类的单独帧。反过来,该类使当前帧可用作QImage对象,可用于任何类型的处理。

所以要回答你的问题 - 使用叠加(作为X11Renderer)或从视频流中提取单个QImages(作为QWidgetVideoSink)。


3
投票

VLC版本是基于QT的视频播放器(自0.99版本起)。它也允许流式传输或读取流:您可以在此处找到所需的所有信息:http://wiki.videolan.org/Developers_Corner。您只需创建播放器的实例并将其与窗口小部件相关联。然后你可以完全控制玩家。

我已经测试了它(在Linux和Windows上)播放本地音乐和视频文件,它工作正常。

试一试,亲自看看。

希望有所帮助。

编辑:看来如果你想使用VLC,你需要编写或找到(我不知道是否存在)GStreamer编解码器作为videolan wiki上的解释。我想我会这样做。

© www.soinside.com 2019 - 2024. All rights reserved.