11

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

有没有人成功地做到这一点?(我想是的,因为有基于 GStreamer 的基于 Qt 的视频播放器。)有人能指出我正确的方向吗?

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

更新 1

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

更新 2

经过一些实验,我最终得到了这个工作示例。它依赖于我自己的小 GstSupport 库中的GstWidget.hGstWidget.cpp 。但是,请注意,目前仅在 Mac 版本的 Qt 上进行了测试。

4

3 回答 3

8

要将 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在小部件级别设置属性来实现的。

于 2009-12-17T11:58:36.870 回答
7

由于 Phonon 基于 gstreamer,查找详细信息的地方是 Phonon 源代码树(可在此处获得:http: //gitorious.org/phonon/import/trees/master)。对于视频播放器,您很可能需要一个视频显示小部件,例如gstreamer/videowidget.h ( cpp ),后者又使用 X11 渲染器 ( gstreamer/x11renderer.h , cpp )。使用的接收器是xvimagesink ,如果第一个无法创建,则返回到ximagesink 。

基本技巧是用视频输出覆盖 VideoWidget。执行此操作所需的 X11 句柄是使用QWidget::winId方法检索的,该方法是特定于平台的(与接收器一样,所以没什么大不了的)。

此外,如果覆盖不可用,则使用QWidgetVideoSink,它将视频帧转换为WidgetRenderer类的单独帧。反过来,此类使当前帧可用作 QImage 对象,为任何类型的处理做好准备。

因此,要回答您的问题 -使用覆盖(作为 X11Renderer)或从视频流中提取单个 QImage(作为 QWidgetVideoSink)

于 2009-12-14T09:46:00.280 回答
3

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

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

试一试,自己看看。

希望有帮助。

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

于 2009-12-09T11:17:56.860 回答