前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多媒体文件格式剖析:TS篇

多媒体文件格式剖析:TS篇

作者头像
马上就说
发布2020-12-11 15:26:54
4.2K0
发布2020-12-11 15:26:54
举报
文章被收录于专栏:码上就说码上就说码上就说

前情提要

我记得之前在多媒体文件格式剖析:M3U8篇中讲解了什么是流式视频,什么不是流式视频?其实有一个更简单更明确的解释,能够用于直播的格式是流式视频格式,反之则不是。

现在我们回看一下,MP4封装格式是不能用于直播的,当然因为MP4的BOX结构并不适用于直播,那么FLV和M3U8就是妥妥为直播而生的,我们平时看直播的时候从中间任何一个时间点进入都是可以播放的,说明流式视频格式是没有冗余的封装部分的,它所包含的必定是简洁的、直观的用于解析播放的数据。

之前分享过M3U8格式,我们知道M3U8是有一个一个TS分片数据组成的,现在我们就要研究一下TS的格式。


TS介绍

TS是一种音视频封装格式,全称为MPEG2-TS。其中TS即"Transport Stream"的缩写。

从上面分析已经获知TS是流式格式,所以MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。

我们可以看出,TS格式是主要用于直播的码流结构,具有很好的容错能力。通常TS流的后缀是.ts、.mpg或者.mpeg,多数播放器直接支持这种格式的播放。TS流中不包含快速seek的机制,只能通过协议层实现seek。HLS协议基于TS流实现的。


TS格式分析

TS文件(流)可以分为三层:TS层(Transport Stream)、PES层(Packet Elemental Stream)、ES层(Elementary Stream)。

ES层就是音视频数据,PES层是在音视频数据上加了时间戳等对数据帧的说明信息,TS层是在PES层上加入了数据流识别和传输的必要信息。TS文件(码流)由多个TS Packet组成的。

下图是TS文件(码流)的分层结构图:

  • TS层

TS包大小固定为188字节,TS层分为三个部分:TS Header、Adaptation Field、Payload。

TS Header固定4个字节;Adaptation Field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;Payload是PES数据。

1.TS Header

TS包的包头提供关于传输方面的信息。

TS包的包头长度不固定,前4个字节是固定的,后面可能跟有自适应字段(适配域)。4个字节是最小包头。包头的结构体字段如下:


sync_byte(同步字节):固定为0x47;该字节由解码器识别,使包头和有效负载可相互分离。

ransport_error_indicator(传输错误标志):’1‘表示在相关的传输包中至少有一个不可纠正的错误位。当被置1后,在错误被纠正之前不能重置为0。

payload_unit_start_indicator(负载起始标志):为1时,表示当前TS包的有效载荷中包含PES或者PSI的起始位置;在前4个字节之后会有一个调整字节,其的数值为后面调整字段的长度length。因此有效载荷开始的位置应再偏移1+[length]个字节。

transport_priority(传输优先级标志):‘1’表明当前TS包的优先级比其他具有相同PID, 但此位没有被置‘1’的TS包高。

PID:指示存储与分组有效负载中数据的类型。

transport_scrambling_control(加扰控制标志):表示TS流分组有效负载的加密模式。空包为‘00’,如果传输包包头中包括调整字段,不应被加密。其他取值含义是用户自定义的。

adaptation_field_control(适配域控制标志):表示包头是否有调整字段或有效负载。‘00’为ISO/IEC未来使用保留;‘01’仅含有效载荷,无调整字段;‘10’ 无有效载荷,仅含调整字段;‘11’ 调整字段后为有效载荷,调整字段中的前一个字节表示调整字段的长度length,有效载荷开始的位置应再偏移[length]个字节。空包应为‘10’。

continuity_counter(连续性计数器):随着每一个具有相同PID的TS流分组而增加,当它达到最大值后又回复到0。范围为0~15。

2.TS Adaptation Field

Adaptation Field的长度要包含传输错误指示符标识的一个字节。

PCR是节目时钟参考,PCR、DTS、PTS都是对同一个系统时钟的采样值,PCR是递增的,因此可以将其设置为DTS值,音频数据不需要PCR。

打包TS流时PAT和PMT表是没有Adaptation Field的,不够的长度直接补0xff即可。

视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

3.TS Payload

TS包中Payload所传输的信息包括两种类型:视频、音频的PES包以及辅助数据;节目专用信息PSI。

TS包也可以是空包。空包用来填充TS流,可能在重新进行多路复用时被插入或删除。

视频、音频的ES流需进行打包形成视频、音频的 PES流。辅助数据(如图文电视信息)不需要打成PES包。

  • PES层

PES结构如上图。PES层是在每一个视频/音频帧上加入了时间戳等信息,PES包内容很多,下面我们说明一下最常用的字段:

  • pes start code:开始码,固定为0x000001。
  • stream id:音频取值(0xc0-0xdf),通常为0xc0;视频取值(0xe0-0xef),通常为0xe0。
  • pes packet length:后面pes数据的长度,0表示长度不限制,只有视频数据长度会超过0xffff。
  • pes data length:后面数据的长度,取值5或10。
  • pts:33bit值
  • dts:33bit值

关于时间戳PTS和DTS的说明:

  • PTS是显示时间戳、DTS是解码时间戳。
  • 视频数据两种时间戳都需要,音频数据的PTS和DTS相同,所以只需要PTS。

有PTS和DTS两种时间戳是B帧引起的,I帧和P帧的PTS等于DTS。如果一个视频没有B帧,则PTS永远和DTS相同。

从文件中顺序读取视频帧,取出的帧顺序和DTS顺序相同。DTS算法比较简单,初始值 + 增量即可,PTS计算比较复杂,需要在DTS的基础上加偏移量。

音频的PES中只有PTS(同DTS),视频的I、P帧两种时间戳都要有,视频B帧只要PTS(同DTS)。

  • ES 层

ES层指的就是音视频数据。一般的,视频为H.264视频,音频为AAC音频。


TS流生成及解析流程

1.TS 流生成流程

  • 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。
  • 对ES(基本码流)进行打包形成PES。
  • 在PES包中加入时间戳信息(PTS/DTS)。
  • 将PES包内容分配到一系列固定长度的传输包(TS Packet)中。
  • 在传输包中加入定时信息(PCR)。
  • 在传输包中加入节目专用信息(PSI) 。
  • 连续输出传输包形成具有恒定比特率的MPEG-TS流。

2. TS 流解析流程

  • 复用的MPEG-TS流中解析出TS包;
  • 从TS包中获取PAT及对应的PMT;
  • 从而获取特定节目的音视频PID;
  • 通过PID筛选出特定音视频相关的TS包,并解析出PES;
  • 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;
  • 将ES交给解码器,获得压缩前的原始音视频数据。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频平凡之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TS流生成及解析流程
    • 1.TS 流生成流程
      • 2. TS 流解析流程
      相关产品与服务
      云直播
      云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档