mpegts介绍

声明:
    这里主要介绍FFmpeg 中mpegts这个封装格式,希望可以对大家有所帮助。

介绍:

    mpegts : 对应的是封装层代码,在解码过程中对应的是下面的解封装。经过解封装之后,获得音视频对应的es数据。

 

mpegts介绍_第1张图片

    我们看电视的时候之所以可以每次切台都可以接着看,而DVD换碟片就要重头开始看,这是因为电视在切台后会发送PAT和PMT。通过PAT我们可以确定PMT的pid,同时接收有与之pid匹配的PMT,而通过PMT我们可以知道将要获得的音视频的pid。之后我们接收与PMT中相对应的pid的音视频数据。而对于一些不规范的服务器会在正常播放的时候改变pid或者音视频的格式,这个时候就会出现播放卡住的现象。这个时候我们可以通过抓取网络包,同时从网络包中提取卡住前后的ts切片对比就可以了。

    TS ---------》 PES------------》ES 他们关系如下图:

 

mpegts介绍_第2张图片

 

TS:    

而说到mpegts就要介绍ts的格式。如下图:

 

mpegts介绍_第3张图片

 

mpegts介绍_第4张图片

    开始的一个字节为同步字节,对于ts包来说是以0x47开始的。

    之后一个字节中的第二位用来标识是不是开始标识,而对于PES来说proload unit start indicator用来标识是不是PES的其实位置,对于每个PES这个标识位都会设置为1.

    而之后的PID占用了13位。他用来标识不同的pid。PAT一般对应的pid为0x0,而在PAT中会指明PMT的pid。而解析完PMT的时候,他也会指明对应接收的音视频的pid。而之后接收的ts包中就是根据这个PID来区分音视频,并从中取出对应的数据放到PES的数据中。

    transport scrambling control标识位一般用来标识加密使用。

    在ts包中,proload 区可能是数据,也有可能不是数据,当不是数据的时候就需要adaptation field来填充0xff来,而区分是否有adaptation field 就要看 adaptation field control 这个标识位了。而对于PAT和PMT来说是没有adaptation field 的。同时可以通过adaptation field control为不同的值来区分proload中为什么样的值。

  •         0x1 : proload为纯数据(为音视频数据)
  •         0x2 : 为adaptation field数据,
  •         0x3 : 既有音视频数据又有adaptation field数据。

 

    而如果有adaptation数据,我们可以通过ts包的第5字节来获取adaptation field的长度。而adaptation field其他的部分需要继续分析标志位。这里还没有详细看。

PES:

而当ts包中adaptation field control为0x1或者0x3时,表示有数据,而这个时候的数据为PES数据。通常情况下adaptation field control为0x1,而在PES首个包或者最后一个包的时候,adaptation field control可能为0x3. 而解析PE数据需要看下面的结构体:

 

mpegts介绍_第5张图片

 

mpegts介绍_第6张图片

    在PES包头的三个字节为PES的起始码标志,对于PES来说为0x00 00 01

    之后的第四字节 stream id 为数据流识别:这个时候通常使用这个id来表示是视频流还是音频流或者是其他的流。

    之后的第五字节和第六字节 PES Packet Length 表示了PES的包长。

 

    之后的两个字节,第七和第八字节是PES包头的识别标志,其中包括:

  •         10 的开始表示
  •         是否 PES加扰控制(加密传输),
  •         数据对齐指示
  •         版权
  •         pts/dts标志位:通过获得dts和pts来获得解码顺序和显示顺序。
  •         再之后的一个字节包含了PES的包头长度。
  •         而之后的区域就是各种信息区,其中有包括pts ,dts等的信息

    而PES其实就是将ES数据打包,而PES的数据部分就是ES数据了。而通过mpegts 我们可以分析ts包头来获得各种组成PES需要的数据,而同时将ts包中数据的部分放到PES包中。同样对于PES的分析可以获得关于ES的各种数据,而之后将PES数据部分提取出来就是我们需要的音视频数据了。而从ts包到es数据,这个过程就是一个解复用的过程。

 

同时强烈建议:

上面这些需要结合mpegts.c的代码来看。

参考文章:

多媒体文件格式(四):TS 格式 https://www.cnblogs.com/renhui/p/10362640.html

流媒体基础知识(二) mpegts详解 https://blog.csdn.net/WangZekun_wolf/article/details/89532912

ffmpeg--mpegts.c解析PES https://blog.csdn.net/evsqiezi/article/details/79625619

MPEG-2系统中ES,PES,PS以及TS流的介绍 https://blog.csdn.net/leopard21/article/details/24818715

mpeg-ts详细介绍 https://wenku.baidu.com/view/8f9c316caf1ffc4ffe47acae.html

上面这些需要结合mpegts.c的代码来看。

 

你可能感兴趣的:(player,mpegts,ts,es,pes,封装)