【问题标题】:H264 keyframe issue with RTPRTP 的 H264 关键帧问题
【发布时间】:2015-11-28 17:24:22
【问题描述】:

我正在为 H264 视频构建 RTP 编码器。视频数据提供者不会定期流式传输数据中的关键帧,而是为我提供了关键帧的二进制文件表示。这包括 SPS-PPS-SEI,然后是 i-frame 的 8 个切片。

由于我正在编码 RTP,我需要以 2 秒的间隔重新广播此关键帧。我正在我的代码中执行此操作,以及传入的其余数据。我正在使用 ffmpeg 通过 UDP 套接字连接到 RTP 数据以进行显示测试。

我注意到,每 2 秒,视频似乎会出现空白并重新同步、像素化等。显然,这在视频产品中是非常不受欢迎的。我一直在尝试调试它很长一段时间,我唯一能确定的是它与关键帧有关。如果我只发送一次关键帧,然后发送其余数据,则 ffmpeg 可以正常显示视频。但是在网络环境中,我需要定期发送关键帧。

有没有人知道为什么会发生这种视频重新同步,最重要的是,如何阻止它发生?

谢谢!

【问题讨论】:

    标签: video ffmpeg h.264 rtp encoder


    【解决方案1】:

    需要 SPS、PPS 和 SEI 来设置解码器并属于 non-VCL 数据。这些通常在 IDR 帧之前的流中找到,但它们也可以在带外进行通信,例如通过 SDP。如果您没有用于传送 SPS 和 PPS 的带外机制,那么当然,您需要定期在带内重新发送它们,以便新客户端可以初始化 H.264 解码器。

    我注意到,每 2 秒,视频似乎会出现空白并重新同步、像素化等。显然,这在视频产品中是非常不受欢迎的。我一直在尝试调试它很长一段时间,我唯一能确定的是它与关键帧有关。如果我只发送一次关键帧,然后发送其余数据,则 ffmpeg 可以正常显示视频。但是在网络环境中,我需要定期发送关键帧。

    我不确定我是否理解正确,但您不能每两秒重新发送一次“静态”i-frame(可能是 IDR)数据:您正在向编码器发送“旧”先前解码的 VCL 数据具有重新同步流的效果。

    有没有人知道为什么会发生这种视频重新同步,最重要的是,如何阻止它发生?

    尝试定期仅发送非 VCL NAL 单元。您可以定期执行此操作,也可以仅将它们添加到流中的 IDR 帧,因为此时您只能开始播放视频(没有伪影)。 .

    【讨论】:

    • 非常感谢您写得很好的解释。我的理解很清楚——“i-frame”实际上是一组 IDR 数据包,而不是 SPS/PPS/SEI 以及 IDR 数据包,对吗?我假设是这个完整的访问单元构成了 i-frame。
    • SPS/PPS/SEI 被视为同一访问单元的一部分。术语“i-frame”不适用于 H.264,其中 IDR 是由 i-slice 组成的特殊 AU,根据定义,IDR 之后的帧不会从 IDR 之前的帧预测。
    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2015-05-23
    • 2020-12-19
    • 1970-01-01
    • 2011-01-27
    • 2011-03-30
    相关资源
    最近更新 更多