H.264 打包 MPEG-TS 流
– 作者 Amour Wang
1.简要说明
本文主要介绍了H264打包成MPEG-TS 流的关键部分,及中间碰到的一些问题。至于H264 和TS 流的相关标准这边不再做详细介绍。
2.H264 打包TS 流过程
TS 流组成说明(这边针对本文例子中的情况,其他情况参照TS 标准):
TS 流以包为单位,每个包的大小为188,主要包含了几种不同类型的包
1. PAT 表:这个表定义了当前TS流中所有的节目,其PID为0x0000,它是PSI的根节点,要查寻找节目必须从PAT表开始查找。主要包含了TS 流 ID,节目频道号,PMT 的ID
2. PMT 表 : 节目映射表,包含频道中所有的PID信息,根据PID 就可以从包中过滤出对应的视频或音频数据
3. PES:简单说PES 就是对H264 的描述的一些信息的标准
打包过程:
1. TS header: 所有包都是以4 个字节的包头开始的,针对比较难理解的部分说明一下
负载单元开始:这个文档上写的很官方,其实就是当一段数据超过一个包的大小必须分成几个包,第一个包的这个标志为1,其他包为0.
PID: 用来表示这个包的类型,这个好理解,但是是重要的标志位,所以强调一下
自适应区域控制:目前只用到0x3 和 0x1,分别表示有和没有自适应区域
连续计数器:这个地方要注意一下,各个类型的包的计数是各自计数的
2. PAT构造,这个部分大部分数据都是比较固定的,自己定义一下PMT 的ID ,其他基本就按照标准进行填写就行,这边PAT 比较简单所以一个包负载就够了.
int ts_pat_header(char *buf) {
BITS_BUFFER_S bits;
if (!buf) {
return 0;
}
bits_initwrite(&bits, 32, (unsigned char *) buf);
bits_write(&bits, 8, 0x00); // table id, 固定为0x00
bits_write(&bits, 1, 1); // section syntax indicator, 固定为1
bits_write(&bits, 1, 0); // zero, 0
bits_write(&bits, 2, 0x03); // reserved1, 固定为0x03
bits_write(&bits, 12, 0x0D); // section length, 表示这个字节后面有用的字节数, 包括CRC32
bits_write(&bits, 16, 0x0001); // transport stream id, 用来区别其他的TS流
bits_write(&bits, 2, 0x03); // reserved2, 固定为0x03
bits_write(&bits,