TS协议之PMT(节目映射表)

2024-01-03 10:50
文章标签 协议 ts 映射 节目 pmt

本文主要是介绍TS协议之PMT(节目映射表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TS协议之PAT(节目关联表)
TS协议之PMT(节目映射表)
TS协议之PES(ES数据包)

该文档已上传:文档下载

1.概要

PMT:节目映射表,与PAT成对出现,包含了该节目下所有的节目元素。

PMT数据结构如下:

字段分析:

字段字段描述
表id标识一个TS PSI分段的内容是节目关联分段,条件访问分段还是节目映射分段。对于PMT置为0x02。
段语法标志位固定为1
0固定为0
保留位固定为0x3(每一位都是1)
分段长度自分段长度字段(不包括分段长度)后直到CRC32字段的字节数,头两位应为00
节目编号定义的该PMT节目的编号与PAT的节目标号对应上
保留位固定为0x3
版本号指示符 设置为‘1’时,版本号 必须为当前有效的节目相关表的版本号。指示符 设置为‘0’时,版本号 为下一个有效的节目相关表的版本号。注:版本号将随着此分段中内容的每一次变化而加1,达到31又回复到0;
指示符1:发送的节目相关表为当前有效的。

0:发送的该表尚未有效并且下一个表将生效。
分段号固定值为00
最后一个分段号固定值为00
保留位固定位0x7
PID节目元素的pid值,就是视频流或者音频流的PID值
保留位0xF
节目描述信息长度描述信息的长度,头两位应为00,没有描述信息设置为0即可,描述信息紧跟在该字段后面,一般设置为0,表示没有描述信息,视情况而定
节目元素单媒体流的信息
CRC32crc校验

节目元素单:

字段字段描述
流类型媒体流的类型,具体流类型参考下面的表格
保留位0x7
元素PIDTS包的PID,通过该PID找到流媒体包
保留位0xF
ES信息长度ES描述信息的长度,紧跟在该字段后面,一般设置为0表示没有信息

基本流媒体类型:参考:节目专用信息

DecimalHexadecimalDescription
00x00Reserved
10x01ISO/IEC 11172-2 (MPEG-1 video)in a packetized stream
20x02ITU-T Rec. H.262 and ISO/IEC 13818-2 (MPEG-2 higher rate interlaced video)in a packetized stream
30x03ISO/IEC 11172-3 (MPEG-1 audio)in a packetized stream
40x04ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)in a packetized stream
50x05ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 tabled data)privately defined
60x06ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 packetized data)privately defined (i.e., DVB subtitles/VBI and AC-3)
70x07ISO/IEC 13522 (MHEG)in a packetized stream
80x08ITU-T Rec. H.222 and ISO/IEC 13818-1DSM CCin a packetized stream
90x09ITU-T Rec. H.222 and ISO/IEC 13818-1/11172-1 auxiliary datain a packetized stream
100x0AISO/IEC 13818-6DSM CCmultiprotocol encapsulation
110x0BISO/IEC 13818-6DSM CCU-N messages
120x0CISO/IEC 13818-6DSM CCstream descriptors
130x0DISO/IEC 13818-6DSM CCtabled data
140x0EISO/IEC 13818-1 auxiliary datain a packetized stream
150x0FISO/IEC 13818-7 ADTS AAC (MPEG-2 lower bit-rate audio)in a packetized stream
160x10ISO/IEC 14496-2 (MPEG-4 H.263 based video)in a packetized stream
170x11ISO/IEC 14496-3 (MPEG-4 LOAS multi-format framed audio)in a packetized stream
180x12ISO/IEC 14496-1 (MPEG-4 FlexMux)in a packetized stream
190x13ISO/IEC 14496-1 (MPEG-4 FlexMux)in ISO/IEC 14496 tables
200x14ISO/IEC 13818-6DSM CCsynchronized download protocol
210x15Packetized metadata
220x16Sectioned metadata
230x17ISO/IEC 13818-6DSM CCData Carousel metadata
240x18ISO/IEC 13818-6DSM CCObject Carousel metadata
250x19ISO/IEC 13818-6 Synchronized Download Protocol metadata
260x1AISO/IEC 13818-11 IPMP
270x1BITU-T Rec. H.264 and ISO/IEC 14496-10 (lower bit-rate video)in a packetized stream
280x1CISO/IEC 14496-3 (MPEG-4 raw audio)in a packetized stream
290x1DISO/IEC 14496-17 (MPEG-4 text)in a packetized stream
300x1EISO/IEC 23002-3 (MPEG-4 auxiliary video)in a packetized stream
310x1FISO/IEC 14496-10 SVC (MPEG-4 AVC sub-bitstream)in a packetized stream
320x20ISO/IEC 14496-10 MVC (MPEG-4 AVC sub-bitstream)in a packetized stream
330x21ITU-T Rec. T.800 and ISO/IEC 15444 (JPEG 2000 video)in a packetized stream
34 - 350x22 - 0x23Reserved.
360x24ITU-T Rec. H.265 and ISO/IEC 23008-2 (Ultra HD video)in a packetized stream
37 - 650x25 - 0x41Reserved.
660x42Chinese Video Standardin a packetized stream
67 - 1260x43 - 0x7eReserved.
1270x7fISO/IEC 13818-11 IPMP (DRM)in a packetized stream
1280x80ITU-T Rec. H.262 and ISO/IEC 13818-2 with DES-64-CBC encryption for DigiCipher IIor PCM audio forBlu-rayin a packetized stream
1290x81Dolby Digital (AC-3) up to six channel audio for ATSC andBlu-rayin a packetized stream
1300x82SCTEsubtitleorDTS6 channel audio forBlu-rayin a packetized stream
1310x83Dolby TrueHDlossless audio forBlu-rayin a packetized stream
1320x84Dolby Digital Plus(enhanced AC-3) up to 16 channel audio forBlu-rayin a packetized stream
1330x85DTS8 channel audio forBlu-rayin a packetized stream
1340x86SCTE-35[5]digital program insertion cue messageorDTS8 channel lossless audio forBlu-rayin a packetized stream
1350x87Dolby Digital Plus(enhanced AC-3) up to 16 channel audio for ATSCin a packetized stream
136 - 1430x88 - 0x8FPrivately defined.
1440x90Blu-rayPresentation Graphic Stream(subtitling)in a packetized stream
1450x91ATSCDSM CCNetwork Resources table
146 - 1910x92 - 0xBFPrivately defined.
1920xC0DigiCipher II textin a packetized stream
1930xC1Dolby Digital (AC-3) up to six channel audio with AES-128-CBC data encryptionin a packetized stream
1940xC2ATSCDSM CCsynchronous dataor Dolby Digital Plus up to 16 channel audio with AES-128-CBC data encryptionin a packetized stream
195 - 2060xC3 - 0xCEPrivately defined.
2070xCFISO/IEC 13818-7 ADTS AAC with AES-128-CBC frame encryptionin a packetized stream
2080xD0Privately defined.
2090xD1BBCDirac(Ultra HD video)in a packetized stream
2100xD2Audio Video StandardAVS2 (Ultra HD video)in a packetized stream
2110xD3Audio Video StandardAVS3 Audioin a packetized stream
2120xD4Audio Video StandardAVS3 Video (Ultra HD video)in a packetized stream
213 - 2180xD5 - 0xDAPrivately defined.
2190xDBITU-T Rec. H.264 and ISO/IEC 14496-10 with AES-128-CBC slice encryptionin a packetized stream
220 - 2330xDC - 0xE9Privately defined.
2340xEAMicrosoftWindows Media Video9 (lower bit-rate video)in a packetized stream
235 - 2550xEB - 0xFFPrivately defined.

常用的流类型有:H2.64:0x1B; H2.65:0x24; AAC:0xF ,自己测试应该不区分大小写;

2.实例代码

typedef struct TS_PMT_Stream
{unsigned stream_type     : 8; //指示特定PID的节目元素包的类型。该处PID由elementary PID指定unsigned reserved_5      :3;unsigned elementary_PID  : 13; //该域指示TS包的PID值。这些TS包含有相关的节目元素unsigned reserved_6      :4;    unsigned ES_info_length  : 12; //前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数
}TS_PMT_Stream;typedef struct TS_PMT
{unsigned table_id                   : 8; //固定为0x02, 表示PMT表unsigned section_syntax_indicator    : 1; //固定为0x01unsigned zero                       : 1; //0x01unsigned reserved_1                 : 2; //0x03unsigned section_length : 12;//首先两位bit置为00,它指示段的byte数,由段长度域开始,包含CRC unsigned program_number             : 16;// 指出该节目对应于可应用的Program map PIDunsigned reserved_2                 : 2; //0x03unsigned version_number             : 5; //指出TS流中Program map section的版本号unsigned current_next_indicator  : 1; //当该位置1时,当前传送的Program map section可用//当该位置0时,指示当前传送的Program map section不可用,下一个TS流的Program map section有效unsigned section_number            : 8; //固定为0x00unsigned last_section_number      : 8; //固定为0x00unsigned reserved_3               : 3; //0x07unsigned PCR_PID                   : 13; //指明TS包的PID值,该TS包含有PCR域,//该PCR值对应于由节目号指定的对应节目,如果对于私有数据流的节目定义与PCR无关,这个域的值将为0x1FFF。unsigned reserved_4            : 4;  //预留为0x0Funsigned program_info_length  : 12; //前两位bit为00。该域指出跟随其后对节目信息的描述的byte数。std::vector<TS_PMT_Stream> PMT_Stream;  //每个元素包含8位, 指示特定PID的节目元素包的类型。该处PID由elementary PID指定unsigned CRC_32                    : 32; 
} TS_PMT; 

由代码可以看出节目元素表为:std::vector PMT_Stream;是一个容器,里面包含了该节目需要的所有媒体流:音频流,视频流,字幕流等。因此一般情况下,一个PMT里面由两个TS_PMT_Stream代表两种流(视频流,音频流),通过TS_PMT_Stream里的元素PID来获取TS协议中的流媒体数据。

封装代码如下:

TS_PMT set_pmt_pack;TS_PMT_Stream pmt_stream;set_pmt_pack.PMT_Stream.clear();//封装视频流信息pmt_stream.stream_type = 0x1b;pmt_stream.reserved_5 = 0x7;pmt_stream.elementary_PID = 0x100;pmt_stream.reserved_6 = 0xf;pmt_stream.ES_info_length = 0x0;set_pmt_pack.PMT_Stream.push_back(pmt_stream);//封装音频流信息pmt_stream.stream_type = 0xf;pmt_stream.reserved_5 = 0x7;pmt_stream.elementary_PID = 0x101;pmt_stream.reserved_6 = 0xf;pmt_stream.ES_info_length = 0x0;set_pmt_pack.PMT_Stream.push_back(pmt_stream);pat_pack.MakeTable(crc32Table);//生成crc32表set_pmt_pack.table_id = 0x2;set_pmt_pack.section_syntax_indicator = 0x1;set_pmt_pack.zero = 0x0;set_pmt_pack.reserved_1 = 0x3;set_pmt_pack.section_length = (0xd+set_pmt_pack.PMT_Stream.size()*5);set_pmt_pack.program_number = 0x0001;//频道号,表示当前的PMT关联到得频道set_pmt_pack.reserved_2 = 0x3;set_pmt_pack.version_number = 0;set_pmt_pack.current_next_indicator = 0x1;set_pmt_pack.section_number = 0;set_pmt_pack.last_section_number = 0;set_pmt_pack.reserved_3 = 0x7;set_pmt_pack.PCR_PID = 0x100;set_pmt_pack.reserved_4 = 0xf;set_pmt_pack.program_info_length = 0x0;

3. 扩展

上述代码都是不带节目描述信息和ES描述信息的,如果想带描述信息,按照官网资料如下:

program_info_length:节目描述信息长度,描述信息就跟在该字段后面;

ES_info_length:ES描述信息长度,描述信息就跟在该字段后面;

下面看一下官网定义的描述信息结构:

描述类型:

 

视频流描述信息:

字段分析:

字段字段描述
descriptor_tag描述类型,参考图I-2-39
descriptor_length描述字节个数
muitiple_frame_rate_flag1bit,为1标识视频流可能出现多种帧速率,为0表示只有一种帧速率
frame_rate_code4bit,除在muitiple_frame_rate_flag为1时所指示的特殊帧率外,也可以在视频流中出现一些其他帧率
MPEG_2_flagMPEG_2_flag1bit;0:视频流中含有H2.62或ISO 13818数据,1:视频流只含有ISO 11172-2数据
stile_picture_flagstill_picture_flag = 1:表示视频流仅包含静止图片。

still_picture_flag = 0:表示视频流可能包含运动或静止图像数据。
profile_and_level_indication指明profile和leve
chroma_format采样格式,比如01表示4:2:0。
frame_rate_extension_flagframe_rate_extension_flag = 1时在 ITU-T Rec. H.262 | ISO/IEC 13818-2视屏流中,frame_rate_extension_n、frame_rate_extension_d都是非零值

无论frame_rate_extension_flag为何值ISO/IEC 11172-2视频流的两个字段均设置为零。
Reserved保留位,固定为11111(每一位都是1,占5 bit所以是11111)。

音频流描述信息:

字段分析:

字段字段分析
descriptor_tag描述类型,参考图I-2-39
descriptor_length描述字节个数
free_format_flagfree_format_flag = 1:表示音频流可能包含一个或多个bitrate_index设置为“0000”的音频帧。

free_format_flag = 0:则在音频流的任何音频帧中,bitrate_index都不是“0000”(参考ISO/IEC 13818-3的2.4.2.3)。
IDID = 1:表示在音频流中的每个音频帧中ID字段设置为“0”(参见ISO/IEC 13818-3的2.4.2.3)。
layer与层字段相同的方式编码。此字段中指示的层应等于或高于音频流的任何音频帧中指定的最高层。
variable_rate_audio_indicatorvariable_rate_audio_indicator = 0:表示比特率字段的编码值在连续音频帧中不应改变,该连续音频帧旨在无中断地呈现。
reserved保留位,固定为111(每一位都是1,占3 bit所以是111)。

N,N1,N2官网并未说明,个人认为:

一般情况下,N和N1是相等的,都等于媒体流的数量,假如该PMT中含有音频流,视频流,字幕流三种流的PID,则N和N1就等于3;而N中的descriptor()就包含了音频流,视频流,字幕流三种流的描述。

而N2是在N1内部,只能代表一种媒体流,要么音频,要么视频,所以N2一般情况下为1.

后期会更新更多音视频技术知识,喜欢的关注我,一起学习交流

这篇关于TS协议之PMT(节目映射表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565452

相关文章

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java中基于注解的代码生成工具MapStruct映射使用详解

《Java中基于注解的代码生成工具MapStruct映射使用详解》MapStruct作为一个基于注解的代码生成工具,为我们提供了一种更加优雅、高效的解决方案,本文主要为大家介绍了它的具体使用,感兴趣... 目录介绍优缺点优点缺点核心注解及详细使用语法说明@Mapper@Mapping@Mappings@Co

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

DNS协议基础笔记

1.定义 DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。 2.域名解析过程 当用户在浏览器中输入一个域名,浏览器首先会检查自己的缓存中是否有该域名对应的 IP 地址。本地 DNS 服务器收到查询请求后,首先会检查自己的缓存中是否有该域名对应的 IP 地址。根域名服务器收到查询请