【问题标题】:Streaming Video On Lossy Network在有损网络上流式传输视频
【发布时间】:2013-11-13 18:47:52
【问题描述】:

目前我有一个通过无线网络发送的 GStreamer 流。我有一个硬件编码器,可以将未压缩的原始视频转换为具有 h.264 编码的 MPEG2 传输流。从那里,我将数据传递到 GStreamer 管道,该管道通过 RTP 将流发送出去。一切正常,我正在看视频,但是我想知道是否有办法通过调整编码器上的某些参数来限制丢包的影响。

我正在查看的两个主要参数是 GOP 大小和 I 帧速率。两者都在编码器(Sensoray 2253)的文档中总结如下:

V4L2_CID_MPEG_VIDEO_GOP_SIZE: 整数范围 0 到 30。默认设置为 0 表示使用编解码器默认值 共和党大小。仅捕获。

V4L2_CID_MPEG_VIDEO_H264_I_PERIOD: 整数范围 0 到 100。仅适用于 H.264 编码。默认设置为 0 将 仅将第一帧编码为 IDR,否则在第一帧编码 IDR 每第 N 个共和党。

基本上,即使考虑到网络可能会丢弃数据包这一事实,我也会尽量让解码器有机会创建流畅的视频播放。增加 I 帧速率会这样做吗?即,由于 I 帧没有与先前或未来数据包相关的数据,发送“完整”图像会有所帮助吗?考虑到数据是通过有损网络发送的,上述两个参数的“理想”设置是什么?请注意,如果这意味着视频比现在更流畅,我可以接受带宽略有增加(~10%)。

我也知道这是高度依赖解码器的,所以为了争论,假设我在客户端的主要解码器是 VLC。

提前感谢所有帮助。

【问题讨论】:

    标签: networking encoding gstreamer h.264 rtp


    【解决方案1】:

    增加 I 帧的数量将有助于解码器更快地恢复。您可能还想考虑限制流的带宽,因为它更有可能让数据通过。不过,您需要注意数据大小,因为您的视频质量可能会受到很大影响,因为 I 帧远大于 P 或 B 帧,并且编码器将继续以指定的比特率为目标。

    如果您对播放有一些控制(甚至在本地捕获流并重新传输到 VLC),您可以添加 FEC 来纠正丢失的数据包。

    【讨论】:

    • 感谢您的提醒,但不幸的是,我无法控制客户端。看起来我可以将我的 GOP 大小和 IDR 都设置为 1(参见上面的定义),这只会发送 I 帧,这将有助于任何客户端解码器刷新图像,对吗?
    • 是的,但要考虑额外的数据开销。视频看起来会比标准的 15 帧 GOP 差很多。您可能想使用您的值来查看什么可以提供最好的视频而损失最少。每 5 或 6 帧执行一次关键帧可能看起来会更好,并且有合理的恢复时间。这是通过受控网络进行的吗?
    • 感谢 I 帧速率和 GOP 大小的建议。我会玩这些价值观,看看会发生什么。更改 I 帧速率时,我是否应该看到带宽显着增加?我问的原因是我现在不是,所以我也想知道代码本身是否错误地设置了这些费率。另外,为了回答您的问题,我无法控制网络,但如果可以,我可以应用或使用哪些设置来提高流质量?
    • 您不会看到带宽增加,反而会看到整体质量下降。压缩器将没有那么多位可用于生成流。至于第二个问题,不多,您可以调整比特率以与您拥有的 wifi 设备配合使用,并尝试适应 wifi 的突发性。
    最近更新 更多