加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:411,815
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)CMMB中的H264和AAC打包成ts流

(2012-12-28 16:24:29)
标签:

杂谈

分类: 音视频
http://blog.csdn.net/zs_pro_popper/article/details/8179734

参照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这方面,都还不太清楚。后面再找时间慢慢研究吧~
    

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有