接上文,本篇介绍下TS的封装格式。

1.什么是TS?
TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。

2.TS的分层结构
TS文件分为三层,如下所示(可以倒序看更好理解):
◆ TS层(Transport Stream):在PES层基础上加入了数据流识别信息和传输信息。
◆ PES层(Packet Elemental Stream):在ES层基础上加入时间戳(PTS/DTS)等信息。
◆ ES层(Elementary Stream):压缩编码后的音视频数据。

 2.TS层
◆ ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。
◆ ts header固定4个字节;
◆ adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充。
◆ payload是 PES 数据,或者PAT,PMT等。
◆ ts Header + adaptation field 格式如下:

 2.1 TS Header
◆ TS Header格式如下:

◆ pid 决定了负载内容的类型,主要包括:PAT表,PMT表,视频流,音频流。常用的PID值:

PAT CAT TSDT EIT,ST RST,ST TDT,TOT,ST
PID 0x0000 0x0001 0x0002 0x0012 0x0013 0x0014

2.2 调整字段

2.3 PAT表结构(指明PMT表的PID值)

typedef struct TS_PAT{unsigned table_id                 :8  //固定位0x00,表示该表是PATunsigned section_syntax_indicator :1  //段语法标志,固定为1unsigned zero                     :1  //固定为0unsigned reserved_1               :2  //第一个保留位unsigned section_length           :12 //表示这个字节之后有用的字节数,包括CRC_32unsigned transport_stream_id      :16 //传输流的ID,区别于一个网络中其他多路复用的流unsigned reserved_2               :2  //第二个保留位unsigned version_number           :5  //表示PAT的版本号unsigned current_next_indicator   :1  //表示发送的PAT是当前有效还是下一个有效,为1时代表当前有效unsigned section_number           :8  //如果PAT分段传输,那么此值每次递增1unsigned last_section_number      :8  //最后一个分段的号码for(int i=0;i<N;i++){unsigned Program_number           :16 //节目号unsigned Reversed_3               :3  //保留位if(Program_number == 0)Network_id                    :13 //网络信息表(NIT)的PIDelseProgram_MAP_PID               :13 //节目映射表的PID,每个节目都有一个}unsigned CRC_32                   :32 //CRC32校检码
}TS_PAT

2.4 PMT表(指明音视频流的PID值)


typedef struct TS_program_map_section{unsigned Table_id                    :8  //标志PSI分段的内容,对于PMT,此值为0x02unsigned Section_syntax_indicator    :1  //置为1unsigned '0'                         :1unsigned Reserved                    :2  //保留位unsigned Section_length              :12 //指明了自此到最后CRC_32的字节数unsigned Program_number              :16 //指出该节目的节目号,与PAT表对应unsigned Reserved                    :2  //保留位unsigned Version_number              :5  //取值0-31,代表当前PMT的版本号unsigned Current_next_indicator      :1  //代表当前PMT是否有效unsigned Section_number              :8  //给出了当前所处段的数目unsigned Last_section_number         :8  //给出了最后一个分段,即分段的最大数目unsigned Reserved                    :3  //保留位unsigned PCR_PID                     :13 //指示TS包的PCR值,该TS包含有PCR字段unsigned Reserved                    :4  //保留位unsigned Program_info_length         :12 //该字段描述跟随其后对节目信息描述的字节数for(int i = 0; i < N; i++)Descriptr()for(int i = 0; i < N; i++){unsigned Stream_type             :8  //0x00:保留, 0x01:MPEG1视频,0x02:MPEG2视频,0x03:MPEG1音频,0x04:MPEG2音频,0x05:私有字段,0x06:含有私有数据的PES包 ......unsigned Reserved                :3  //保留unsigned Elementary_PID          :13 //指示TS包的PID,这些TS包含有相同的PIDunsigned Reserved                :4  //保留unsigned ES_info_length          :12 //指示跟随其后描述相关节目元素的字节数for(int j = 0; j < N2; j++)Descriptr()}unsigned CRC_32                      :32 //循环校检位
}

2.4 补充说明
◆ 打包ts流时PAT和PMT表是没有调整字段的,不够的长度直接补0xff即可。
◆ 视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

3.PES 层
◆ PES(Packetized Elementary Stream,打包的ES),在 ES 层的基础上加入了时间戳(PTS/TDS)等信息。
◆ ES数据包比较大,加入PES头时需将ES进行分割,只在第一个分割的ES上加PES头,如下图所示:

◆ PES packet length — 指示PES 包中跟随该字段最后字节的字节数。0 值指示PES 包长度既未指示也未限定并且仅在这样的PES 包中才被允许,该PES 包的有效载荷由来自传输流包中所包含的视频基本流的字节组成。
◆ PES结构如下:

◆ PES 关键字段说明

5.ES 层
◆ ES(Elementary Stream,基本码流),就是音视频编码数据流,比如视频H.264,音频AAC。
◆ 一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。

6.easyice下载链接:
easyice:https://www.easyice.cn/archives/85

音视频入门系列,同步录制了学习视频,已上传至bilibili(八小时码字员):音视频入门系列(图像、音频、字幕、视频封装格式,FFmpeg、ffplay源码分析,解码、编码、转码,流媒体协议,服务器部署)_哔哩哔哩_bilibili

音视频入门系列-视频封装格式篇(TS)相关推荐

  1. 音视频入门系列-视频封装格式篇(MP4)

    接上文,本篇介绍下MP4的封装格式. 1.MP4(MPEG-4) ◆ MP4是一套用于音频.视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的"动态图像专家组 ...

  2. 音视频入门系列-服务器篇(nginx-rtmp 的部署)

    本篇文章,我们详细介绍下使用nginx-rtmp来部署一套流媒体服务器,并用FFmpeg来推流,VLC来拉流. RTMP是Real Time Messaging Protocol(实时消息传输协议)的 ...

  3. 音视频入门系列-音频篇(AAC)

    上篇文章介绍了PCM相关知识,本篇介绍下AAC相关知识. 1.什么是AAC? AAC(Advanced Audio Coding,高级音频编码)是一种声音数据的文件压缩格式.AAC分为ADIF和ADT ...

  4. 音视频入门系列-音视频基础知识篇(录播、点播、直播)

    在学习音视频技术前,笔者还是希望可以分享给小伙伴们一些音视频方便的基本概念,掌握这些概念,有助于大家对于音视频有一个更直观和清晰的了解. 话不多说,今天笔者给大家分享下:录播.点播和直播. 录播:录播 ...

  5. 走进音视频的世界——Matroska封装格式的介绍(二)

    Matroska封装格式非常灵活.兼容性好,既适用于本地文件存储又可以进行实时流传输.本篇文章主要探讨Matroska的编解码器映射,如何封装视频流.音频流.字幕流.如果要Matroska的介绍.功能 ...

  6. 【网络通信 -- 直播】音视频常见封装格式 -- MEPG2 TS

    [网络通信 -- 直播]音视频常见封装格式 -- MEPG2 TS [1]相关码流基本概念 ES 流(Elementary Stream)基本码流,直接取自编码器的数据流,可以为音频(AAC 等).视 ...

  7. 2021年全球社交应用支出排行榜TikTok列榜首;小猪佩奇和抖音推出防沉迷系列视频 | 美通社头条...

    要闻摘要:2021年全球社交应用支出排行榜TikTok列榜首.小猪佩奇和抖音推出防沉迷系列视频.中国首个新冠病毒中和抗体联合治疗药物获国家药监局批准上市.GSK与Medicago宣布新冠植物源性佐剂候 ...

  8. 视音频数据处理入门:FLV封装格式解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  9. 走进音视频的世界——音频封装格式

    音频封装格式一般由:多媒体信息+音频流+封面流+歌词流组成.有些音乐会包含封面和歌词,则对应有封面流.歌词流.多媒体信息包括:标题.艺术家.专辑.作曲.音乐风格.日期.码率.时长.声道布局.采样率.音 ...

  10. Web音视频入门系列——音视频基础知识

    前言 21世纪以来,随着网络基础设施的不断完善,3G.4G.乃至现今5G网络的普及,互联网彻底改变了我们的生活.以前在家里看一部电影需要买DVD和播放机,现在直接打开浏览器,进各大视频网站就可以看了, ...

最新文章

  1. SP10628 COT - Count on a tree (树剖+可持久化线段树)
  2. 如何使用PXE 安装 Windows XP +PXE安装XP
  3. 字符串在内存中的存储——C语言进阶
  4. Shebang来Java了吗?
  5. Nginx 反向代理+高可用
  6. Android4.4 及以下TextView,Button等控件使用矢量图报错
  7. Linux输入子系统浅析
  8. matlab--sum函数用法
  9. 程序人生:不知道我讲了什么的回应稿
  10. php中联合运算符,PHP-串联运算符
  11. Spring中@Autowired注解的工作原理
  12. 计算机基础知识教程表格日期,EXCEL设置自动生成特殊日期
  13. 2021国赛新大陆物联网Ubuntu系统维护(中职)
  14. C语言的数据表现形式及其运算
  15. 风陵渡口初相遇,一见杨过误终身
  16. Android应用声明Open Source Licenses
  17. 软件体系结构的分析与测试,软件体系结构分析与评价,software architecture analysis and evaluation,音标,读音,翻译,英文例句,英语词典...
  18. 解决闭包问题时 setTimeout执行顺序提前的问题
  19. 如何从小白起步成为百万博主|配音运营工具必不可少
  20. Visual Studio 和 .NET Framework 词汇表

热门文章

  1. 软件测试肖sir___项目讲解之银行项目
  2. php开发人脸识别的步骤,人脸识别的流程及主要技术
  3. XJOI 9864 金字塔
  4. C++实现的一个加密文件的程序
  5. 法向量与切向量的转化
  6. vs2010格式化html,VS中的快捷键快速格式化代码,使好看,整齐
  7. apa引用要在文中吗_英文论文格式要求玩转APA
  8. python中惩罚的代码_请问SCAD惩罚函数是怎么把参数估计为0的?我这里有Python代码...
  9. juce教程005-中文显示
  10. 前端实现动画的方法总结