H264系列(3):CMMB中的H264和AAC打包成ts流

news/2024/5/20 4:53:30 标签: pes, ts, pmt, pat
转自  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的时候,还需要打入patpmtpmt里指定了视频的类型和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这方面,都还不太清楚。后面再找时间慢慢研究吧~

http://www.niftyadmin.cn/n/1648251.html

相关文章

点直播流媒体传输协议之 —— HLS

流媒体协议分类 常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这两种协议是完全不同的实现方式。主要区别如下: 一种是分段渐近下载,一种是基于实时流来实现播放协议不同,HTTP 协议的渐近下载意味着你…

力扣经典问题:判断形状是否重叠

1.两个矩形的重叠判断&#xff1f; 判断边界即可&#xff0c;假设矩形1的left1&#xff0c;right1&#xff0c;top1&#xff0c;down1&#xff0c; 只需要left1>right2||right1<left2||top1<down2||down1>top2 两个矩形就是分开的 2.两个圆形的重叠判断&#xf…

ffmpeg 新老接口问题及对照集锦

原始出处不可靠&#xff0c;感谢原作者分享&#xff01; ffmpeg源码包里面有个apichangs文档&#xff0c;里面有各种接口改变的记录&#xff0c;如果你发现接口不能用了&#xff0c;可以去搜索那个文档&#xff0c;可以找到对应的新接口&#xff0c;然后到新接口对应的头文件中…

力扣题:634寻找错位排列

首先直接暴力的时间复杂度很大&#xff0c;下面先贴一个暴力法的结果,然后再是动态规划 class Solution { public:int num0;void dfs(int &sum,int &cur,vector<int> &re,vector<int> &der){// if(cur>re.size()) return;if(sumre.size()-1&am…

力扣题:1139. 最大的以 1 为边界的正方形

思路&#xff1a; 1 直接暴力法&#xff0c;每到一个新的节点就判断以它为左上角是否有正方形&#xff0c;在判断的过程中需要考虑多个条件&#xff0c;及时break减少时间消耗 理论上该方法的时间复杂度为O&#xff08;n*m&#xff09;*min(n,m) (因为正方形长度最大也就原…

如何准备面试的自我介绍

1.要换位思考&#xff0c;自我介绍不能是无趣的自说自话&#xff0c;要充分介绍自己的优势。 从面试官的角度去看就是两点&#xff1a;“你凭什么来我这”&#xff0c;"我为什么要录用你" 第一点意味着&#xff0c;你需要在自我介绍中展示自己跟岗位的匹配程度&…

H264系列(4):h264协议帧头数据解析

原文出自http://blog.csdn.net/season_hangzhou/article/details/51123979 对原作者表示感谢&#xff01;一、序言 h264常见的帧头数据为&#xff1a; 00 00 00 01 67 (SPS) 00 00 00 01 68 (PPS) 00 00 00 01 65 ( IDR 帧) 00 00 00 01 61 (P帧) 等等&#xff…