代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

如何在基于gstreamer的qt中实现视频小部件?

  •  9
  • StackedCrooked  · 技术社区  · 15 年前

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

    有没有人成功做到这一点?(我想是这样的,因为有基于qt的视频播放器构建在gstreamer上。)有人能给我指明正确的方向吗?

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

    更新1

    帕特里斯建议使用libvlc已经很有帮助了。以下是VLC网站上的代码的更清晰版本: Sample for Qt + libVLC . 然而,我最初的问题仍然是: 如何将gstreamer连接到qt小部件?

    更新2

    经过一些试验,我最终 this working sample . 这取决于 GstWidget.h GstWidget.cpp 从我自己的小gstsupport库。但是,请注意,目前仅在Mac版的qt上测试。

    3 回复  |  直到 7 年前
        1
  •  7
  •   Gregory Pakosz    15 年前

    要将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
  •  7
  •   e8johan    15 年前

    由于Phonon基于gstreamer,因此查找详细信息的位置是Phonon源树(此处提供: http://gitorious.org/phonon/import/trees/master )对于视频播放器,您很可能需要一个视频显示小部件,例如 gstreamer/videowidget.h ( cpp )然后使用x11渲染器( gstreamer/x11renderer.h , cpp )。使用的水槽是 xvimagesink ,回到 ximagesink 如果无法创建第一个。

    基本技巧是用视频输出覆盖视频小部件。执行此操作所需的x11句柄是使用 QWidget::winId 方法,这是平台特定的(就像水槽一样,所以没什么大不了的)。

    此外,如果覆盖不可用,则 QWidgetVideoSink 用于将视频帧转换为 WidgetRenderer 班级。反过来,这个类使当前帧作为qimage对象可用,可以进行任何类型的处理。

    所以回答你的问题- 使用套印格式(作为x11文件夹)或从视频流中提取单个qImages(作为qWidgetVideoSink) .

        3
  •  3
  •   Patrice Bernassola    15 年前

    VLC版本是基于qt的视频播放器(从0.99版开始)。它也允许流或读取流:您可以在此处找到所需的所有信息: http://wiki.videolan.org/Developers_Corner . 您只创建了播放器的一个实例,并将其关联到一个小部件。然后你就可以完全控制这名球员了。

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

    试试看。

    希望有帮助。

    编辑: 似乎如果您想要使用VLC,您需要编写或查找(我不知道是否存在)一个gstreamer编解码器来解释 videolan wiki . 我想我会的。