学习总结1—TS解码和打包总结

最近一直在做一个关于TS流解析和打包的工作,这里是做一次总结,也是第一次总结,以后将陆续尝试些更多的总结。

首先,网上其实能找到很多关于ts流的信息,其实总结出来就是很简单的几点。一个ts流,我们能使用的通常是这样的格式,这里可以参考https://blog.csdn.net/occupy8/article/details/43115765

1.     在ts的前面四个字节中,如果PID==0,表明这里是PAT表,这个时候需要解析PAT信息,得到PMT表的PID。然后寻找下一个ts包。

2    在TS头中,PID等于PMT表的PID,这个时候解析PMT表,得到音频和视频的PID。解析下一个TS流。

3    在TS头中,如果PID等于视频或者音频的PID,进入相应的解析中。这里以视频为例。

3.1   TS头的PID等于视频PID,此时第一个TS包中会有一个七个字节的自适应区,里面放有PCR信息,参考https://blog.csdn.net/evsqiezi/article/details/51781057,比如47 40 08 32 07 10 00 b9 f8 23 fe 00,此时PCR中与后面PES流中的PTS和DTS存在对应关系,通常PTS==DTS==PCR。不过注意PCR种有部分是填充字节。一会儿再来补充如何寻找对应关系。

3.2    而另一个需要注意的是,在一个TS流中,我们需要注意的是PAT表的TS头计数器也是不断递增的,从0-f,然后循环,同理也有PMT表的计数器也在0-f递增变化,当然,对于视频流也是一样的。

3.3   在正常的视频编解码中,一般情况00 00 01 06 后面放的是SEI信息。

3.4 然后00 00 01 e0,这里表示视频,如果是c0就应该是音频

只要这几个因素都满足后,基本就可以将压缩好的H264码流编码或者解码成功了。

下面讲讲PCR中的信息如何和PTS和DTS对应。如一个PCR是00 c9 29 8B 7e,一个PTS是31 06 49 ab 2d,如此,对应的二进制就是0000 0000 1100 1001 0010 1001 1000 1011 0111 1110和0001 0001 0000 0110 0100 1001 1010 0110 0010 1101

这就是对应关系。而PTS和时间的转换关系,就是如下:

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天。

PCR分两部分编码:一个以系统时钟频率的 1/300 为单位,称为PCR_base,共33bit;另一个以系统时钟频率为单位,称为PCR_ext,共9bit,共42bit。
具体规定如下:
PCR_base(i) = ((系统时钟频率 x t(i)) div 300) % 2^33
PCR_ext(i) = ((系统时钟频率 x t(i)) div 1) % 300

PCR(i) = PCR_base(i) x 300 + PCR_ext(i)

例如:
  时间"03:02:29.012"的PCR计算如下:
  03:02:29.012 = ((3 * 60) + 2) * 60 + 29.012 = 10949.012s
  PCR_base = ((27 000 000 * 10949.012) / 300) % 2^33 = 98 541 080
  PCR_ext   = ((27 000 000 * 10949.012) / 1  ) % 300  = 0 
  PCR = 98 541 080 * 300 + 0 = 295 623 324 000

程序的计算,明天放进来。

然后PES的讲解如下:

参考

https://www.cnblogs.com/mingzhang/p/8036868.html

猜你喜欢

转载自blog.csdn.net/zp704393004/article/details/81636349
今日推荐