Log*_*ley 3 video mp4 h.264 mpeg2-ts
我正在编写一个transmuxer,将MPEG-TS文件从HLS流转换为MP4文件,然后可以在Web浏览器中播放.
我原本希望能够将TS文件简单地一对一映射到MP4文件,但事实证明,一些HLS流被分割,使得各个TS文件并不总是从IDR帧开始; 每当您穿过线段边界时,这会导致冻结图像和断断续续.
我想通过连接多个TS文件中的数据,忽略原始文件边界,自己识别视频流中的IDR帧,以及在IDR帧上启动每个新的MP4段,我可以解决这个问题.但是,如果我这样做,我担心文件末尾可能存在损坏; IDR帧保证以后的帧不能引用任何先前的数据,但没有任何东西表明早期的B帧不能向前看IDR帧.
那么,我怎么知道切割的安全位置,这样切割前的B帧不会试图超越它?
如果你在IDR框架上结束切割,我认为你没有问题.但我不是百分百肯定.
从H.264规范和例如RFC3984:
IDR图片:仅包含具有I或SI切片类型的切片的编码图片,其在解码过程中导致"重置".在解码IDR图像之后,可以解码解码顺序中的所有后续编码图像,而无需在IDR图像之前解码的任何图像进行帧间预测.
注意,帧在解码顺序中不能在IDR之前引用其他帧.
为了使B帧在IDR帧之后引用任何帧,引用的帧必须出现在文件的先前,因为它必须首先被解码.这样B帧必须在IDR帧之后.这意味着该B帧不能在IDR帧之前引用任何帧.在我看来,这没有任何意义.
例如:假设显示顺序中的以下帧:
(other frames) B IDR P
Run Code Online (Sandbox Code Playgroud)
如果P引用IDR,并且B将引用P,则必须是解码顺序:
(other frames) IDR P B
Run Code Online (Sandbox Code Playgroud)
在这个例子中,B不能引用任何其他帧,它只能引用IDR和P.
请注意,即使发生这种情况,如果在IDR之后找到IDR之后的帧,也可以检测到这一点.