截断H.264数据的安全位置?

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帧不会试图超越它?

wim*_*ica 5

如果你在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之后的帧,也可以检测到这一点.