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

时间:2011-08-14 04:11:27

标签: h.264 mpeg-4 cts flv

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?

谢谢

2 个答案:

答案 0 :(得分: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 ...  

预期的播放渲染

I B B B P B B B P ... 

(此传输策略确保在处理B帧之前B帧桥接器位于解码器中的两个帧。)

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

timestamp = DTS / 90.0

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

compositionTime = (PTS - DTS) / 90.0 

(因为PTS> = DTS,这个delta永远不会消极。)

答案 1 :(得分:2)

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