RTP

时间:2015-09-03 02:33:53

标签: video ffmpeg h.264 rtp encoder

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

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:3)

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

  

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

我不确定我是否理解正确,但您无法重新发送"静态"每两秒钟i帧(可能是一个IDR)数据:你正在发送" old"先前解码的VCL数据到编码器,其具有重新同步流的效果。

  

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

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