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

TS协议之PAT(节目关联表)

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; //固定为0x01
    unsigned zero                       : 1; //0x01
    unsigned reserved_1                 : 2; //0x03
    unsigned section_length : 12;//首先两位bit置为00,它指示段的byte数,由段长度域开始,包含CRC 
    unsigned program_number             : 16;// 指出该节目对应于可应用的Program map PID
    unsigned reserved_2                 : 2; //0x03
    unsigned 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; //固定为0x00
    unsigned last_section_number      : 8; //固定为0x00
    unsigned reserved_3               : 3; //0x07
    unsigned PCR_PID                   : 13; //指明TS包的PID值,该TS包含有PCR域,
      //该PCR值对应于由节目号指定的对应节目,如果对于私有数据流的节目定义与PCR无关,这个域的值将为0x1FFF。
    unsigned reserved_4            : 4;  //预留为0x0F
    unsigned 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.

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/60382.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

性能分析记录

4实例压测TPS浮动在200-300 1.TPS浮动200-300&#xff0c;ART浮动的可能性是10-20ms&#xff0c;链路复杂是可接受的&#xff0c;链路简单则需要分析原因。 1&#xff09;缓存没命中&#xff0c;对某些账号缓存没命中&#xff0c;或缓存失效后导致隔段时间耗时升高。 2&…

MySQL正则表达式检索数据

目录 一、使用正则表达式进行基本字符匹配 1.使用regexp关键字 2.使用正则表达式 . 二、进行OR匹配 1.为搜索两个串之一&#xff0c;使用 | 2.匹配几个字符之一[] 3.匹配范围 4.匹配特殊字符 过滤数据允许使用匹配、比较、通配符操作来寻找数据&#xff0c;但是随…

mac前端代码编辑 Sublime Text 4 Dev 中文v4.0(4151)

Sublime Text 4 for Mac是一款功能强大的代码编辑器&#xff0c;适合所有需要高效编写代码和进行代码管理的程序员使用。 快速响应&#xff1a;Sublime Text 4在加载文件和执行命令时非常快速&#xff0c;能够让用户在高效的开发过程中体验到无缝的交互。 多种语言支持&#…

第一章-JavaScript基础进阶part3:BOM

文章目录 一、BOM概述1.1 什么是BOM 二、window对象的常见事件2.1 页面加载事件2.2 调整窗口大小事件onresize 三、定时器3.1 案例 四、JS执行机制4.1 this指向4.2 JS执行机制1、JS是单线程2、JS的同步和异步3、JS的执行机制 五、location对象5.1 locationc对象常用属性5.2 loc…

Win11大小写切换图标关闭方法

大家使用Win11操作系统的时候经常会切换大小写键盘&#xff0c;有些游戏本在游戏过程中需要切换大小写&#xff0c;这个时候电脑的屏幕就会出现大小写切换的图标而影响游戏体验&#xff1b; 那么想要关闭Win11电脑上大小写切换图标&#xff0c;又不知道具体怎么操作&#xff0c…

java学习路程之篇四、进阶知识、石头迷阵游戏、绘制界面、打乱石头方块、移动业务、游戏判定胜利、统计步数、重新游戏

文章目录 1、绘制界面2、打乱石头方块3、移动业务4、游戏判定胜利5、统计步数6、重新游戏7、完整代码 1、绘制界面 2、打乱石头方块 3、移动业务 4、游戏判定胜利 5、统计步数 6、重新游戏 7、完整代码 java之石头迷阵单击游戏、继承、接口、窗体、事件、组件、按钮、图片

一零六七、JVM梳理

JVM&#xff1f; Java虚拟机&#xff0c;可以理解为Java程序的运行环境&#xff0c;可以执行Java字节码&#xff08;Java bytecode&#xff09;并提供了内存管理、垃圾回收、线程管理等功能 java内存区域划分?每块内存中都对应什么? 方法区&#xff1a;类的结构信息、常量池、…

优化|当机器学习上运筹学:PyEPO与端对端预测后优化

分享者&#xff1a;唐博 编者按&#xff1a;​ 这篇文章我想要写已经很久了&#xff0c;毕竟“端对端预测后优化”&#xff08;End-to-End Predict-then-Optimize&#xff09;正是我读博期间的主要研究方向&#xff0c;但我又一直迟迟没能下笔。想说自己杂事缠身&#xff08;实…

高温环境下光模块光功率降低的原因与解决方案

光模块是光纤通信系统中的关键组件&#xff0c;其稳定的光功率输出对于确保通信质量至关重要。然而&#xff0c;高温环境下光模块的光功率往往会出现下降&#xff0c;本期文章我们将探讨高温环境下光模块光功率降低的原因和解决方案。 一、高温环境下光功率降低的原因 &#…

算法练习--leetcode 数组

文章目录 爬楼梯问题裴波那契数列两数之和 [数组]合并两个有序数组移动零找到所有数组中消失的数字 爬楼梯问题 输入n阶楼梯&#xff0c;每次爬1或者2个台阶&#xff0c;有多少种方法可以爬到楼顶&#xff1f; 示例1&#xff1a;输入2&#xff0c; 输出2 一次爬2阶&#xff1…

金鸣识别将无表格线的图片转为excel的几个常用方案

我们知道&#xff0c;金鸣识别要将横竖线齐全的表格图片转为excel非常简单&#xff0c;但要是表格线不齐全甚至没有表格线的图片呢&#xff1f;这就没那么容易了&#xff0c;在识别这类图片时&#xff0c;我们一般会使用以下的一种或多种方法进行处理&#xff1a; 1. 基于布局…

Devart dbForge Studio for MySQL Crack

Devart dbForge Studio for MySQL Crack dbForge Studio for MySQL是一个用于MySQL和MariaDB数据库开发、管理和管理的通用GUI工具。IDE允许您通过直观的界面创建和执行查询、开发和调试存储例程、自动化数据库对象管理、分析表数据。MySQL客户端提供了数据和模式比较和同步工具…

Android Studio 的Gradle版本修改

使用Android Studio构建项目时&#xff0c;需要配置Gradle&#xff0c;与Gradle插件。 Gradle是一个构建工具&#xff0c;用于管理和自动化Android项目的构建过程。它使用Groovy或Kotlin作为脚本语言&#xff0c;并提供了强大的配置能力来定义项目的依赖关系、编译选项、打包方…

[用go实现解释器]笔记1-词法分析

本文是《用go实现解释器》的读书笔记 ​ https://malred-blog​malred.github.io/2023/06/03/ji-suan-ji-li-lun-ji-shu-ji/shi-ti/go-compile/yong-go-yu-yan-shi-xian-jie-shi-qi/go-compiler-1/#toc-heading-6http://个人博客该笔记地址 ​github.com/malred/malanghttp:/…

selenium 截屏

当前环境&#xff1a; Windows 10 Python 3.7 selenium 3.141.0 Google Chrome 115.0.5790.110 &#xff08;64 位&#xff09; from selenium import webdriver import base64if __name__ __main__:#driver webdriver.Chrome()driver.get(https://www.baidu.com/)# 1.…

sql 参数自动替换

需求&#xff1a;看日志时&#xff0c;有的sql 非常的长&#xff0c;参数比较多&#xff0c;无法直接在sql 客户端工具执行&#xff0c;如果一个一个的把问号占位符替换为参数太麻烦&#xff0c;因此写个html 小工具&#xff0c;批量替换&#xff1a; 代码&#xff1a; <!…

python文件与目录操作

目录 文件编码 文件的读取 打开文件 mode常用的三种基础访问模式 读取文件 关闭文件 with open语法 文件的写入操作 文件综合案例 a.txt内容 代码实现 b.txt文件 目录操作 前言 os模块 具体方法 os.path模块 具体方法 文件编码 前言&#xff1a;由于计算机…

kafka-保证数据不重复-生产者开启幂等性和事务的作用?

1. 生产者开启幂等性为什么能去重&#xff1f; 1.1 场景 适用于消息在写入到服务器日志后&#xff0c;由于网络故障&#xff0c;生产者没有及时收到服务端的ACK消息&#xff0c;生产者误以为消息没有持久化到服务端&#xff0c;导致生产者重复发送该消息&#xff0c;造成了消…

AI大模型之花,绽放在鸿蒙沃土

随着生成式AI日益火爆&#xff0c;大语言模型能力引发了越来越多对于智慧语音助手的期待。 我们相信&#xff0c;AI大模型能力加持下的智慧语音助手一定会很快落地&#xff0c;这个预判不仅来自对AI大模型的观察&#xff0c;更来自对鸿蒙的了解。鸿蒙一定会很快升级大模型能力&…

No111.精选前端面试题,享受每天的挑战和学习

文章目录 map和foreach的区别在组件中如何获取vuex的action对象中的属性怎么去获取封装在vuex的某个接口数据有没有抓包过&#xff1f;你如何跟踪某一个特定的请求&#xff1f;比如一个特定的URL&#xff0c;你如何把有关这部分的url数据提取出来&#xff1f;1. 使用网络抓包工…