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?
谢谢
答案 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帧,通常这意味着接收到所有依赖的帧。