我想了解将mpeg4 AVC / H.264编码视频封装到Transport Stream容器(用于HTTP Live Streaming等流协议)时,如何对I,B,P图片进行打包和多路复用。如我所知,对于mpeg2编解码器视频,每个PES都从一个新的TS数据包开始,但是在单个PES中可能存在I,B,P图片的重叠。
但是对于mpeg4 AVC视频,谁能解释I,B,P帧如何复用到PES中?它们是否可以在PES中重叠,这意味着单个TS数据包丢失可能会丢失多个I / B / P帧?我尝试遍历RFC和其他一些文档中的有效负载结构,但是不清楚。
最佳答案
由于不同的帧具有不同的DTS和PTS,因此I,B,P帧不进行复用,但是在单个PES包中,只能指定一对DTS / PTS。多路复用器的作用是将帧(I,B或P)打包在PES数据包中,然后将DTS和PTS放在数据包上,仅此而已。下一帧将打包在另一个PES中。有时,取决于编码器和复用器,当一帧非常大(例如HD视频的I帧)时,会将其打包到具有相同DTS / PTS的多个PES数据包中。
但是,h264流的SPS和PPS与I帧一起打包到单个PES数据包中。这意味着,如果丢失了包含SPS和PPS的TS数据包,则解码器将不得不等待,直到发送下一个SPS和PPS,因为没有它们,它将无法解码流。
请不要以为这只是大多数(如果不是全部)编码器和复用器工作的方式。该标准没有(也不可能)描述每种情况。
关于ffmpeg - mpeg4 AVC视频的PES结构,用于封装到传输流中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32773707/