MPEG2_TS(一)-结构-复用器

转自:

                    MPEG2_TS(一)-结构-复用器

一:原理

   一个复用(mux)文件或流中包含音频视频,一般都是编码之后的,例如H264 ,MP3,MP2,AAC 等等,音视频结合到一起,实现音视频同步生成一种新的复用(mux)文件或者流,例如avi,rmvb,MP4,ts等等,不同的文件或流有不同的结构和音视频流组成。本文以 H264 + MP3 = TS为例做解析。

二:流程

   1:打开文件,将要做复用的文件打开,开启两个线程做读取文件,传入要做复用的函数中做处理。

   2:循环读取音频和视频文件的一帧数据,数据长度和buf传入下一层做处理。

   3:将传入的一帧数据填写成一个PES(后面做解释)。

   4:根据处理音频线程和处理视频线程循环传入TS打包函数中。

   5:后续处理,释放内存,关闭文件等等。

三:结构

   1:H264,nal头结构

  

    2:帧类型枚举

    

     3:MP3头结构体

     

      4:TS头结构体

      

     这里要解释下,我们最终生成的TS文件是又一个一个188字节的包组成,第一个字节是 0x47,TS包头 是4个字节。

     5:pat节目相关表

     

    6:pmt,节目映射表

    

  7:PES结构体



   这里说明下,ES:一个虚拟化的概念,就是音视频数据,PES一个中间介质,里面包含了一帧音频或者视频数据,以及pts(显示时间标志),dts(解码时间标志),等等信息。我们最终生成的TS包,就是将这一帧帧的PES分片打到一个一个的TS包中。

四:细节

  1:线程方面 要加入线程锁,当音频和视频同时打入TS包中时,要互斥用BUF资源

  2:当一个一帧数据如果小于188 则要再传入pes一帧,屏蔽掉ts包打单帧的情况。例如H264视频的pps,sps帧都是很小的;



       3: ts_video_pes->PES_packet_length = 0 ;// OneFrameLen_H264 + 8;              //一帧数据的长度 不包含 PES包头 ,这个8 是 自适应的长度,填0 可以自动查找,这个一定要找对,如果数据长度不对,会产生很多问题,还要考虑溢出的情况。

       4: WriteAdaptive_flags_Head(&ts_adaptation_field_Head); //填写自适应段标志帧头
           WriteAdaptive_flags_Tail(&ts_adaptation_field_Tail); //填写自适应段标志帧尾

一帧的帧头 是有pcr的,是一种算时间的标志,(一般只打在视频上)
帧尾没有,标志全都为0,如果一帧的数据加上自适应段 都填不满 一个包 要用0xff填充。

       5:当一个PES大于188 时候要做分包 ,拆分一帧或几帧数据,分到各个包中,最后一个包要注意,

如果负载长度大于 ==182  || == 183 的时候要打两个包,因为自适应装不进去了。

      

      6:多打一些pat,pmt的包,一般是隔40个包打一个,这样在做直播的时候播放器新加入会得到TS的息。

            if ((WritePacketNum % 40) == 0)                       //每40个包打一个 pat,一个pmt
            {
             CreatePAT();                                         //创建PAT
             CreatePMT();                                         //创建PMT
            }

     7:在填写pat,pmt的crc的时候一定要注意大小端的问题,数据长度一定要算对了,我这个纠结了一天。

      PAT_CRC = Zwg_ntohl(calc_crc32(pat + 5, pointer_pat - pat - 5));

     8:pcr最大是 33位 ,如果时间长了 会溢出,这样的时候要做倒置,这个本文不涉及。

     9:

      //连续性计数器,也就是说 有多少个 pat包,几个pmt包 ,几个MP3 包,几个 h264包,0x00 - 0x0f ,然后折回到0x00。

     typedef struct Tag_Continuity_Counter
     {
        unsigned char continuity_counter_pat;
        unsigned char continuity_counter_pmt;
        unsigned char continuity_counter_video;
        unsigned char continuity_counter_audio;
     }Continuity_Counter;   

     10:还有一些长度的细节,以及位域,标志等等的东西,可以看《mpeg2(13818-2)标准中文文档》   ,或本程序了解。

     11: 关于pts的填写 可以遵循这两个公式:

        Timestamp_video += 1000* 90/framerate;   //90khz

        Timestamp_audio += 1024*1000* 90/audiosamplerate;

注: 1:本文源码在我的CSDN: http://download.csdn.net/detail/zhuweigangzwg/5611231

                          http://download.csdn.net/detail/zhuweigangzwg/5605869

     2:如果有交流的可以联系我QQ:379969650  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mpeg2-tsMPEG-2 Transport Stream)是一种用于数字广播和视频传输的协议。它的目标是将音频、视频和其他数据以数据包的形式进行传输和存储。 mpeg2-ts的在线解析涉及将以mpeg2-ts格式编码的媒体文件进行解析和分析,以便播放或进行其他操作。解析过程包括以下几个步骤: 1. 读取文件头信息:首先读取文件的头部信息,其中包括文件的标识符、版本号、编码信息等。通过分析头部信息,可以确定文件的类型和结构。 2. 解析PAT表(Program Association Table):PAT表记录了各个节目的信息和各个PID(Packet ID)的映射关系。通过解析PAT表,可以获取到TS流中的所有节目的PID。 3. 解析PMT表(Program Map Table):PMT表描述了各个节目中包含的音频、视频和其他数据的PID,并提供了流的详细信息。通过解析PMT表,可以获取到各个节目中各个流的PID以及编码格式等相关信息。 4. 解析数据包:根据PID的信息,解析相应的数据包,提取出音频、视频和其他数据。对于音视频数据,还需要进行解码和解封装操作,以便进行播放或进一步处理。 5. 分析和处理数据:分析音视频和其他数据的格式、编码方式以及其他相关信息,以便进行后续处理,如解码、转码、封装等。 通过对mpeg2-ts文件进行在线解析,可以实现对媒体文件的播放、编辑、转码等功能。同时,也可以提取音视频数据进行分析和处理,以满足不同的应用需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值