MPEG-2 TS格式解析
收集了一些大神们的博客:
本文来自上面几篇文章的整理分析
MPEG2-TS介绍
MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。
TS包头
TS负载的类型
一个TS包的载荷中,可以包含PAT包、PMT包、多个音频包、多个视频包、多个PCR包、以及其他信息包。
1、视频、音频的PES包以及辅助数据。其中音视频的ES需要被打包成为PES,而辅助数据不需要被打包成PES
2、节目专用信息PSI,包括下面几种:
PAT:节目关联表。提供了节目好和对应PMT表格的PID的对应关系
PMT:节目映射表。定义了与特定节目相关的PID信息,例如:音频包的pid,视频包的pid、pcr的pid
CAT:条件接收表。用于流加扰情况下配置参数。
NIT:网络信息表。可选的,标准未详细定义
TSDT:传输流描述表。可选的。
PAT
PMT
PES
获取TS包中的音视频数据
如果给定一个TS文件,怎么去寻找解码音视频解码数据呢? 每个TS包的前4个字节的包头里都有一个PID
1、首先,一个个遍历TS包,我们找到PID为0的TS包,这个包叫PAT,这个PAT包里包含了PMT的PID号
2、遍历TS包又可以找到名为PMT的TS包,PMT里有什么呢?PMT里包含了video TS包的PID和它的codec,audio TS包的PID和它的codec 。有了codec我们知道要选择什么解码器,有PID我们就可以获得解码数据。
3、我们先来说说video数据和audio数据是怎么分散在TS包里的。video和audio其实都是以一种叫PES(Packetized Elementary Stream)的形式组织的。一帧视频就是一个PES包。我们都知道一个TS包只有188个字节,除掉包头还剩184个字节,这是不可能放下一帧的。4、实际上一个PES包是分配在连续的几个TS包中,所以如果我们要获得一帧数据,那么我们需要把连续的几个TS包里的数据全部取出来才能组合成一个PES。
5、那我们怎么知道一个PES的开始和结尾呢?那我们还是一个个遍历每一个TS包,寻找包头里payload_unit_start_indicator为1包,这个标志位代表着是一个PES的开始,那么我从这开始,一直到下一个payload_unit_start_indicator为1,这中间的TS包组成起来就是一个PES。
TS包的解析流程
解析TS流数据的流程:
1、查找PID为0x0的包,解析PAT,PAT包中的program_map_PID表示PMT的PID;
2、查找PMT,PMT包中的elementary_PID表示音视频包的PID,PMT包中的PCR_PID表示PCR的PID,3、有的时候PCR的PID跟音频或者视频的PID相同,说明PCR会融进音视频的包
4、有的时候PCR是自己单独的包;
5、CAT、NIT、SDT、EIT的PID分别为: 0x01、0x10、0x11、0x12。