包装H.264 NALU时的合成时间(CTS)

Mr.*_*oor 7 flv cts h.264 mpeg-4

h.264硬件压缩卡通过捕获的视频处理NALU.

我试图将NALU包装成FLV,我几乎成功了.

我不知道如何为每个NALU填充FLV中的撰写时间字段.

根据FLV规范,http://download.macromedia.com/f4v/video_file_format_spec_v10_1.pdf,E.4.3.1.

CompositionTime 合成时间偏移

有关组合时间的说明,请参见ISO 14496-12,8.15.3.FLV文件中的偏移量始终以毫秒为单位

然后查看ISO 14496-12,8.15.3,第24页和第26页

提供解码时间和合成时间之间的偏移.由于解码时间必须小于合成时间,所以偏移表示为无符号数,使得 CT(n)= DT(n)+ CTTS(n)其中CTTS(n)是样本n的(未压缩的)表条目.

我如何知道每个NALU中的DT和CTTS?或者如何在没有DT和CTTS的情况下计算CT?

谢谢

kip*_*are 7

对于在MPEG-2传输中提供I帧,P帧和B帧NALU的MPEG-4 H.264转码器,得到的打包基本流(PES)带有时间戳,带有显示时间戳(PTS)和解码器时间戳. (DTS)的时间单位为1/90000秒.

NALU以重复模式的形式进入DTS时间戳顺序

I P B B B P B B B ...  
Run Code Online (Sandbox Code Playgroud)

预期的回放渲染的位置

I B B B P B B B P ... 
Run Code Online (Sandbox Code Playgroud)

(此传输策略确保在处理B帧之前B帧帧在解码器中的两个帧.)

对于FLV,时间戳(FLV规范第69页)告诉帧何时应该以毫秒为单位馈送到解码器,这是

timestamp = DTS / 90.0
Run Code Online (Sandbox Code Playgroud)

CompositionTime(FLV规范第72页)告诉渲染器何时在进入解码器后的几毫秒内执行("组合")显示设备上的视频帧; 因此它是

compositionTime = (PTS - DTS) / 90.0 
Run Code Online (Sandbox Code Playgroud)

(因为PTS> = DTS,这个delta绝不是负数.)


Mr.*_*oor 2

我想我已经理解了CTS。它仅适用于 B 帧。因为B帧可能依赖于转发帧来解码,所以CTS意味着这个B帧何时可以被解码,通常意味着所有依赖的帧都被接收到。