总结TS中的pcr、dts、pts问题

对于PTS_DTS_flags的重设

此字段在PES头语法中,标识PTS与DTS在PES分组首部的出现情况,当出于某种需求要对此标志位进行修改,例如由‘3’ 修改为‘2’,即删除DTS,但仅仅修改了这个标志位并没有达到“删除DTS”的目的。虽然VLC等播放器可以正常解码且不报任何错误,在一些严格的解码器上,会无法识别新生成的数据。例如elecard分析软件会报告“无法检测流”,ipad播放会说“无法播放此影片”

这是因为忽略了一个问题,在PTS语法中,前4个bit要求与 PTS_DTS_flags 取值相同。因此,在修改 PTS_DTS_flags 的之后,PTS语法前4bit也要做相应的修改。这样目前已知的解码器就可以正常工作

H264码流生成快进文件关键技术
对于快进/快退文件的生成,行业内一般以VLC正常播放作为鉴定标准,要使自己抽帧生成的码流在VLC播放正常,不仅仅是抽取关键帧就OK,
抽帧只是第一步,总结来说,需要以下举措:

1.抽取关键帧
这个过程中,需要抽取完整的关键帧,在264码流中,码流层次没有帧的概念,帧由若干slice组成,如果编码器编码过程采用了分片,
那么你需要将属于同一帧的slice都拿出来。一般来说,应用与广电行业的264编码器不采取分片,一个帧就是一个片。
例外情况是,当码流编码为隔行视频,一个帧被编码为两个片,每个片是一个场。隔行视频中,I片后经常紧跟一个p片,
他们具有相同的frame_num,这时你需要将p片也拿出来,否则i帧是不完整的

2.PTS, DTS PCR时间戳调整
最好的效果是调整到没有PCR精度错误,间隔错误,以及PTS错误,不过若做简单一些,保证PCR精度正确就可以。
前提是PTS变化间隔不要过大,否则影响播放效果流畅程度。

3.frame_num调整
仅当码流中关键帧为I帧时需要调整,IDR帧则不必。frame_num被解码器用于控制解码顺序,我不清楚为什么IDR帧的frame_num总为0而I帧却不是,
事实是,frame_num的不连续造成vlc播放时认为过多的迟到帧,所以需要把它调整连续

对于VLC来说,经过上述调整就可以流畅播放,而其他如mplayer类会瞬间播完,因为这类播放器按fps播放,对此你需在码流中填充零动作P帧,
以维持帧率恒定

对时间戳循环到头的处理:
ts流中的三个时间戳,pts(33bit),dts(33bit),pcr(42bit)
当时间戳增加到语法无法容纳时,产生时间戳循环,时间线开始变小,循环点计算方式是:将要设置的值减去时间戳最大值,将差值写入语法结构。
编码器设置时钟,以及解码器自己的系统时钟在达到最大值后,都根据此方式计算,不会产生时钟的不连续。

PCR能表示多长时间
    
PCR最大值是多少,多长时间会循环一次,这是个非常简单的问题,但一直以来我们对他的认识是错误的,我们认为是两天多
先说正确的应该是多少,根据:
PCR(i) = PCR_base(i)*300 + PCR_ext(i)
PCR_base 33 位,最大值:0x1FFFFFFFF
PCR_ext 9 位,根据定义,取值 0-299
因此PCR最大值为:0x1FFFFFFFF*300 + 299
可表示的小时数:(0x1FFFFFFFF*300 + 299) / 27000000 / 3600 约为 26.5 小时
以前认为是两天多,大概是这样算的,PCR一共42位,把2的42次方作为PCR最大值,算出来大约是1.8天

你可能感兴趣的:(总结TS中的pcr、dts、pts问题)