CMMB中的H264和AAC打包成ts流

参照tstools这个开源项目完成了CMMB的merge aac with 264 to TS.

在做的过程中,分成了几个阶段。先试着将H264打包成TS,这花了最大的精力和时间;接着将AAC打包成TS;最后将其合并起来。

一、处理H264
     1、H264 -> pes
     在查找了大量资料后,对H264有了初步的认识。H264的结构从大到小依次为视频序列(sequence )、图像(picture ,相当于帧)、片组、片(slice)、宏块(MacroBlock)、子块(SubBlock)。
     
          
     其中,帧率是针对于图像来说的,例如25Hz的帧率,就差不多是每个40ms显示1个图像。
     图像分为 I图像、P图像、B图像。
     每个图像又由多个片组组成,片组由多个片组成。
     每个片又由多个宏块组成。片分为I_slice、P_slice、B_slice。宏块有I、P、B三种宏块。
     I_slice里只有I_MB,  p_slice里可有P_MB和I_MB,  B_slice里可有B_MB和I_MB。
     通常的一个图像里就含一种片,这次的CMMB里的H264比较简单,是Baseline的profile,只含有I、P帧,而且每个图像就1个slice。

     对于H264按功能层次划分,又分为视频编码层VCL(video coding layer)和网络抽象层 NAL(Network abstraction layer).
     每个NAL单元包含:NAl头+负荷
                                 NAl的头一般为00 00 01 或者00 00 00 01,然后到下一个头之间都为这一个nalu的数据。

     所以,对于封装成ts流,只需要去读取H264的原始文件,然后找到这个nal头,再将这个nalu(包含头和负荷)当成数据打包成pes再打成ts即可。

     在打包成pes的时候,需要注意的一个问题就是pts/dts,其单位应该是系统时钟。需要在找到每个图像的起始slice的时候,在打包成pes的时候加上pts/dts。这次的CMMB中,其视频帧只含I/P图像(帧),且每个图像只有1个片,所以就在读取264原始数据时读到I_slice或P_slice的时候,一并打入pts。CMMB流正好又有现成的pts,只需读出来,按照CMMB中的换算方法,每22500就是1秒,就能得出pts的值,而不需要我自己手动的去计算添加。

      例如,视频帧率为25HZ的时候,即1秒25帧,每帧的间隔40ms。按90Khz的视频频率来算的话,其对应的系统时钟数应该是
      1/25*90000 = 3600 个clk。
     所以当分析pes时,其pts字段的33个bit算出来的话,就是按这个clk为单位的。相邻的视频帧的pts之差值为3600.

     2、pes -> ts
     h264打包成ts的时候,还需要打入pat和pmt。pmt里指定了视频的类型和pid。
     pes打包的时候,按ts协议格式封装即可。
     PCR使用和视频一样的pid,这里把pts当成pcr打进ts包。

二、处理AAC
     AAC的ts封装相对于H264来说就简单多了。这次的CMMB采用的是aac的adts格式封装,同h264类似,也有其自己的分界符,然后两分界符之间就是数据,分界符为1111 1111 1111,即FFF。依次读取AAC的原始文件,遇到一个FFF时,将其后的数据连同这个FFF的头看成整体,作为负载封入PES。同样的,每帧都需要打入pts。CMMB流中也附有AAC的pts,读取后计算写入PES即可。也省了我去根据采样率,每帧的样本率去计算pts。

三、合并H264和AAC的ts流
     做完了上两步工作,最后一步就更简单了。
     先是打入PAT、PMT。PMT需要稍微修改,因为加入了音频,所以要在其中指明音频的类型和pid。
     接着就是视频、音频的ts包依次打。打的时候稍微注意要判断下视频和音频的pts值,保持同步。

对于H264更底层的东西,就没研究下去了。对于H264的SPS获取PTS,也没整太明白。还有PCR这方面,都还不太清楚。后面再找时间慢慢研究吧~
     
     
     


















     
     
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值