我正在为H264视频构建一个RTP编码器。视频数据提供者不会定期在数据中流式传输关键帧,而是为我提供了关键帧的二进制文件表示。这包括SPS-PPS-SEI,然后是8片i帧。
由于我正在编码RTP,我需要以2秒的间隔重新广播这个关键帧。我正在我的代码中执行该操作以及其他数据。我使用ffmpeg通过UDP套接字连接到RTP数据以进行显示测试。
我注意到每2秒钟,视频似乎空白并重新同步,像素化等。显然,这在视频产品中是非常不受欢迎的。我一直试图调试这个问题很长一段时间,我唯一可以确定的是它与关键帧有关。如果我只发送一次关键帧,然后发送其余数据,ffmpeg会显示视频。但是在网络环境中,我需要定期发送关键帧。
有没有人知道为什么视频会重新发生,最重要的是,如何阻止它发生?
谢谢!
答案 0 :(得分:3)
设置解码器需要SPS,PPS和SEI,并且属于non-VCL数据。这些通常在IDR帧之前的流中找到,但它们也可以在带外传送,例如,通过SDP。如果您没有用于通信SPS和PPS的带外机制,那么您确定需要在带内定期重新发送它们,以便新客户端可以初始化H.264解码器。
我注意到每2秒钟,视频似乎空白并重新同步,像素化等。显然,这在视频产品中是非常不受欢迎的。我已经尝试调试了很长一段时间,我唯一可以确定的是它与关键帧有关。如果我只发送一次关键帧,然后发送其余数据,ffmpeg会显示视频。但是在网络环境中,我需要定期发送关键帧。
我不确定我是否理解正确,但您无法重新发送"静态"每两秒钟i帧(可能是一个IDR)数据:你正在发送" old"先前解码的VCL数据到编码器,其具有重新同步流的效果。
有没有人知道为什么视频会重新发生,最重要的是,如何阻止它发生?
尝试定期仅发送非VCL NAL设备。您可以定期执行此操作,也可以仅将它们添加到流中的IDR帧,因为此时您只能开始播放视频(没有工件)。 。