原因:前面简单分析了FFmpeg针对HLS协议和m3u8文件的简单调用,但是TS数据流的解析却没有介绍,故在此介绍一下TS流的数据格式及解析.
概况:ts(transport stream)可以简单理解为传输文件,内部封装pes(packet elemental stream),而pes内部封装es(elemental stream)数据,而我们用于解码的数据即原始的es数据。可以简单理解为pes比pes多了一些数据头,而数据头内部包含了pts和dts等信息。故重点就是如何找到es数据的起始地址。
流程介绍:为了想要找到es数据,首先需要了解PAT表和PMT表,PAT(program association table)节目关联表:内部包含 TS流中所有的节目。PMT(program map table)节目映射表:内部包含对应节目中包含的音视频数据流描述信息。那么如何关联PAT和PMT以及真实数据流?那么就使用到了PID。
TS包类型解析如下:总共占用4个字节.重点就是获取pid数据,通过获取的pid可以得ts包类型.
typedef struct transport_packet
{
//占用8bit,同步字节,默认为0x47
unsigned sync_byte : 8;
//占用1bit,传输错误指示位,1:表示传输包中至少有一个不可纠正的错误位,一般为0.
unsigned transport_error_indicator : 1;
//占用1bit,负载单元起始标识位,1:表示起始数据 0:表示累加数据.一个TS包固定为188字节,而一帧数据将会被分割为多个包,故通过起始标识符可以得知是否为新的数据帧.
unsigned payload_unit_start_indicator : 1;
//占用1bit,传输优先级
unsigned transport_priority : 1;
//占用13bit,pid
unsigned PID : 13;
//占用2bit,加密标识.一般为00
unsigned transport_scrambling_control : 2;
//占用2bit,负载自适应字节标识符.00: