当前位置: 首页 > news >正文

ts复合流讲解

一、什么是复合流

复合流指的是一条音视频数据流中同时包含了音频ES和视频ES数据(ES指的是从编码器出来的音视频裸流比如H264,AAC)。在音视频开发中最常见的复合流一般是TS、MP4、flv等。TS和flv一般用于网络传输,MP4一般用于本地保存。

二、TS流的介绍

TS流,英文全称是 Transport Stream(传输流)。它是由MPEG公司推出来的全新的MPEG2的压碎标准,TS流的出现是为了让音视频事实交互更加方便,并且随着数字电视的发展,TS流数据在电视领域、网络音视频通信方面也扮演者举足轻重的地位。

三、TS流的数据格式

 

 TS流的数据分为三层,分别是Transport Stream层、Packet Element Stream层、Element Stream层。

 3.1Transport Stream层

Transport Stream层包含了三部分,TS Header、 Adaption Field、TS Payload。TS Header是TS层的头部,固定为4字节,Adaption Field的作用是填充188个字节,TS Payload是pes(Packet Elementary Stream层)的具体数据。

Transport Stream层主要内容包含了:PAT表、PMT表、音频流、视频流。PAT表的作用是通过PMT找到对应的音视频流。PAT表的PID值一般为0,而PAT和PMT需要不定时插入TS流。

 TS Header表格

sync byte8b字节同步,固定0x47
transport_errror_indicator1b传输错误字节符号一般为0
payload start indicator1b负载单元起始标识符,通常为1
transport priority1b传输的优先级,通常为0,0代表低优先级,1代表高优先级
PID13bTS流的PID
transport scrambling control2b传输加密控制,0b00表示没有加密
adaptional filed control2b自适应区间的判断,00代表保留,01代表无自适应区间,仅含有效负载,10仅含自适应区域,无有效载荷,11代表的是既有自适应区域和有效载荷
continutiy counter4b递增计数器,数指必须连续

Adaption Field具体内容(B表示字节)

Adaptional Field Lengt指的是自适应长度,他主要包含传输错误标识符的字节。PCR是节目时钟参考表,PCR的PTS和DTS都是对同一系统时间进行采样,PCR的值是逐渐递增的。在对TS流进行打包时,PAT表和PMT表是没有Adaptional Field的,若长度不够则使用0xff

 PAT表定义了当前TS流的所有节目、要查询节目必须从PAT表开始,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

PMT表(查询当前节目中所有的PID信息,比如说有多少个VIDEO,AUDIO)

 
typedef struct TS_program_map_section{unsigned Table_id                    :8  //标志PSI分段的内容,对于PMT,此值为0x02unsigned Section_syntax_indicator    :1  //置为1unsigned Zero                        :1  //固定为0unsigned 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 //循环校检位
}
//:1表是占用1bit

 3.2PES层

PES层的结构是包含在TS层PAYLOAD里的,PES主要功能是在每一帧音视频数据帧添加时间戳内容。比方说在FFPLAY或VLC播发TS文件时,会出现关于PTS、DTS的数据,这就是PES的作用。

 PTS:指的就是显示时间戳,单位为90MS

 DTS:指的是解码时间戳,单位是90MS

 PCR:指的是节目时间参考,单位是90300毫秒

 3.3ES层结构

ES数据指的就是音视频裸流数据,音频裸流:H264/H265,音频裸流AAC

四、总结

ES音视频裸流加上时间戳和头部信息形成PES流,PES流加上PAT、PMT节目形成TS流


http://www.mrgr.cn/news/23961.html

相关文章:

  • 燃气涡轮发动机性能仿真程序GSP12.0.4.2使用经验(二):使用GSP建立PG9351FA燃气轮机性能仿真模型
  • 使用xml文件创建虚拟机
  • Qt事件处理机制
  • 代码随想录打卡Day28
  • 大牛直播SDK最经典的一句
  • 12寸厂甲方PM在启动会上宣贯的项目日常管理制度
  • 网络编程9.10
  • 说说这些年我做的副业
  • 第十九次CCF计算机软件能力认证题目解析(详细题解+代码+个人解读+持续跟新)
  • linux下安装单机minio环境
  • 【modou网络库】Reactor架构与TCP通信机制分析
  • [针对于个人用户] 显卡与计算卡性能对比表
  • Groovy -> Groovy数据类型和字符串
  • 0910作业+思维导图
  • 《C++》解密--算法复杂度
  • HTML5+CSS+JS制作中秋佳节页面
  • redis的基础数据结构-list列表
  • 0. 阿里大模型API获取步骤
  • LVGL 控件之线条(lv_line)
  • TwinCAT3 实时核中ADS实现C++ server、clinet数据传输