H.264 打包 MPEG-TS 流

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, 
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值