TS合成中PTS间隔超过700ms的解决方案

PTS间隔超过700ms的解决方案

羋亞羅吧

问题

对某些特殊的视频,在做TS合成的时候会出现PTS间隔超过700ms的错误。

表象是:上一帧视频PES包的发出时间(即含该PES包的第一个TS包发出去时的pcr时间)和当前视频PES包的发出时间,间隔大于700ms。

例:子午书简 H264+MP2.ts取音视频重新以2Mbps的码率打包,就会出现这样的问题。

80434296字节位置,描述-PTS间隔超过700ms, 发生在PTS_PID 0x281.

140870468字节位置,描述-PTS间隔超过700ms, 发生在PTS_PID 0x281.

141520196字节位置,描述-PTS间隔超过700ms, 发生在PTS_PID 0x281.

仔细分析:

80434296字节,即第0x4cb5478字节开始发送No. 8053 帧视频(P帧),而前一帧No. 8052 帧视频(I帧,大小75393字节)在第0x4c81990字节开始发送,两者之间相差时间为

0x4cb5478 - 0x4c81990 /2×1000000/8 = 846.7 ms > 700 ms

VBV Buffer= 2Mbps × 0.7s = 175000字节

原因

经过对多个文件的统计分析,发现此问题出现的特点是:

1. 基本上都出现在H264文件中。出问题帧的前一帧为I帧,此I帧数据量较大,通常达到VBV Buffer大小的40%。

2. VBV Buffer在此时几乎为全满。

H264文件码率较小,使得VBV Buffer = TS Bitrate *0.7s就比较小,所以某些I帧数据量较大的,与VBV Buffer一比较就显的比较大。而MPEG2视频的码率通常比较大,I帧要达到VBV Buffer的40%比较难。

大I帧出现了,而VBVBuffer则几乎全满,没有地方放数据,所以会发送很多空包,从而导致超时。

解决

方法1. 减小I帧大小,这通常不可能;

方法2. 增大VBVBuffer,也较难,此Buffer大小,DVB有标准规定;

方法3. 充分利用700ms,把I帧和I帧前一帧之间的间隔时间拉长,为I帧的放入腾出空间,增大Buffer的空闲空间,这样就可以使得时间间隔都小于700ms。而且从实际观察来看,两帧间时间间隔虽然大于700ms,但是不会大很多,把此过长的时间分一些给上一个间隔就能保证两个间隔都不超时。


結果,在本機上測試方法3,通過。

猜你喜欢

转载自blog.csdn.net/samsho2/article/details/18844711
今日推荐