【问题标题】:Play RTP video stream using Qt?使用 Qt 播放 RTP 视频流?
【发布时间】:2026-01-02 09:35:02
【问题描述】:

我想创建一个 Qt 小部件,它可以播放传入的 RTP 流,其中视频编码为 H264 并且不包含音频。

我的基本实施计划是这样的:

  • 创建一个 Phonon MediaSource 对象(流类型)。
  • 将其与提供数据的QIODevice 子类连接
  • 使用以下任一方法获取视频数据:
    • JRTPLIB 客户端库
    • GStreamergstrtpbin 插件。这个插件负责卸载包和解码视频。也许这会提高 Phonon 识别数据的机会。

我的环境:

  • Ubuntu 9.10
  • Qt 4.6

我的问题:

  • 我的方法好不好?也许我忽略了一个更明显或更简单的解决方案?
  • 我目前遇到了这个问题:尝试播放视频流时,MediaObject 的状态变为 ErrorState,errorType 为 FatalError。谁能告诉我我做错了什么?

编辑
我发现的一个解决方案是将 libVLC 与 Qt 结合使用,这是我在thread 中了解到的。这里有一个code sample 给感兴趣的人。 我仍在寻找基于声子的解决方案。
理想情况下,我只需要提供一个 SDP 文件即可完成工作。

【问题讨论】:

    标签: c++ qt video-streaming gstreamer


    【解决方案1】:

    我能够使用 libVLC 解决方案让它工作。我不能保证这是 最好的 解决方案,因为我只是停止照顾它。

    这是link to the libVLC sample

    【讨论】:

    • 您似乎已删除此文件。是否有机会再次发布代码,还是已经丢失了时间?
    • 感谢您告诉我。修复了网址。
    • @StackedCrooked 还是要使用这些文件从 IP 摄像机获取流?
    【解决方案2】:

    我理解 Phonon 至少在 Windows 中工作的方式是 QT 为 DirectShow (\plugins\phonon_backend\phonon_ds94.dll) 和 GStreamer 提供了一个 phonon 后端插件。然后,您将获得或编写自己的 DirectShow 过滤器,该过滤器可以接受 RTP 流作为源。 DirectShow 负责解码,Phonon 负责渲染。

    所以如果后端工作,应用程序代码很简单:

            Phonon::MediaObject *media = new Phonon::MediaObject();
            Phonon::VideoWidget *video = new Phonon::VideoWidget();
            Phonon::createPath(media, video);
            media->setCurrentSource(source);
            media->play();
    

    似乎问题在于 GStreamer 后端接受 RTP 作为源。您可以在独立的 GStreamer 中毫无问题地播放该源吗?

    【讨论】:

    • 我还没有成功。播放本地文件有效,但是当我尝试加载 RTP 流(通过读取 RTP 数据包的 MediaSource(QIODevice) 对象)时,VideoPlayer 保持在 LoadingState。现在我正在尝试另一种方法:我正在使用 GStreamer 的 gstrtpbin 插件来读取传入的 RTP 数据、解码视频流并以某种方式将其连接到 Qt 小部件。