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; //固定为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.

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP ABAP中使用函数ALSM_EXCEL_TO_INTERNAL_TABLE读取EXCEL中不同的SHEET数据

SAP提供了标准的读取EXCEL的函数&#xff08;ALSM_EXCEL_TO_INTERNAL_TABLE&#xff09;&#xff0c;但是此标准函数无法满足对同一EXCEL 进行不同SHEET的数据读取&#xff0c;一下方法就是教你如何通过修改程序来实现ALSM_EXCEL_TO_INTERNAL_TABLE读取多个SHEET&#xff1b; …

P1320 压缩技术(续集版)

题目描述 设某汉字由 N N N \times N NN 的 0 \texttt 0 0 和 1 \texttt 1 1 的点阵图案组成。 我们依照以下规则生成压缩码。连续一组数值&#xff1a;从汉字点阵图案的第一行第一个符号开始计算&#xff0c;按书写顺序从左到右&#xff0c;由上至下。第一个数表示连续有…

MacOS上配置docker国内镜像仓库地址

背景 docker官方镜像仓库网速较差&#xff0c;我们需要设置国内镜像服务 我的MacOS docker版本如下 设置docker国内镜像仓库地址 点击Settings点击Docker Engine修改配置文件&#xff0c;添加registry-mirrors {"builder": {"gc": {"defaultKeepS…

Java——如何使用Stream替换掉List<Student>中符合要求的元素

使用Stream替换掉List中符合要求的元素 要使用Stream流替换掉List中符合特定条件的元素&#xff0c;您可以使用Stream的map()方法对每个元素进行映射&#xff0c;并使用collect()方法将映射后的元素收集到一个新的List中。 示例代码&#xff1a; import java.util.ArrayList; …

Java实现数据库表中的七种连接【Mysql】

Java实现数据库表中的七种连接【Mysql】 前言版权推荐Java实现数据库表中的七种连接左外连接右外连接其他连接 附录七种连接SQL测试Java测试转换方法类 Cla1类 Cla2类Cla3 最后 前言 2023-8-4 16:51:42 以下内容源自《【Mysql】》 仅供学习交流使用 版权 禁止其他平台发布时…

docker配置远程连接端口

配置docker 配置远程连接端口 vi /lib/systemd/system/docker.servicesystemctl daemon-reload && systemctl restart docker firewall-cmd --zonepublic --add-port2375/tcp --permanenthttp://node2:2375/version

iOS 两种方式设置状态栏

1、ios9.0以前设置状态栏字体颜色 ///白色 [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; ///黑色 [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleDefault]; 会看到如下提示&#xff1a; setStatusBarSty…

pycharm——漏斗图

import pyecharts.options as opts from pyecharts.charts import Funnel""" Gallery 使用 pyecharts 1.1.0 参考地址: https://echarts.apache.org/examples/editor.html?cfunnel目前无法实现的功能:1、暂时无法对漏斗图的长宽等范围操作进行修改 ""…

锂电池充电/保护IC :TP4056 1A线性锂离子电池充电器(DW01A /FS8205A)

1. TP4056 概述 TP4056是一款性能优异的单节锂离子电池恒流/恒压线性充电器。TP4056采用ESOP8封装配合较少的外围原件使其非常适用于便携式产品&#xff0c;并且适合给USB电源以及适配器电源供电。 基于特殊的内部MOSFET架构以及防倒充电路&#xff0c;TP4056不需要外接检测电…

基于LLM的SQL应用程序开发实战(一)

基于LLM的SQL应用程序开发实战(一) 16.1 SQL on LLMs应用程序初始化 本节主要从案例代码的角度切入,探索ChatGPT以及大模型,尤其是从生产环境的视角,来思考具体的最佳实践。本节主要跟大家谈的是,在LangChain这样一个框架下,我们使用GPT-3.5或者GPT-4大模型,同时使用第…

AWS S3 协议对接 minio/oss 等

使用亚马逊 S3 协议访问对象存储 [s3-API](https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/API/API_Operations_Amazon_Simple_Storage_Service.html)- 兼容S3协议的对象存储有- minio- 似乎是完全兼容 [兼容文档](https://www.minio.org.cn/product/s3-compatibility.htm…

【BASH】回顾与知识点梳理(七)

【BASH】回顾与知识点梳理 七 七. 前六章知识点总结及练习7.1 总结7.2 练习 该系列目录 --> 【BASH】回顾与知识点梳理&#xff08;目录&#xff09; 七. 前六章知识点总结及练习 7.1 总结 由于核心在内存中是受保护的区块&#xff0c;因此我们必须要透过『 Shell 』将我…

大数据课程H1——TELECOM的电信流量项目架构

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解TELECOM项目的架构和环境配置&#xff1b; ⚪ 了解TELECOM项目的数据字典&#xff1b; 一、简介 1. 概述 1. 当用户通过网络设备(手机、平板电脑、笔记本电脑等)进…

JavaScript闭包和this

目录 JavaScript闭包和this 1 闭包 1.1 变量作用域 1&#xff09;函数内部可以读取全局变量 2&#xff09;函数外部无法读取函数内部的局部变量 1.2 读取函数内部的局部变量 1&#xff09;在函数内部再定义一个函数 2&#xff09;为外部程序提供访问函数局部变量的入口 1.3…

Github 创建自己的博客网站

参考pku大佬视频制作&#xff0c;附上B站视频&#xff1a;【GitHub Pages 个人网站构建与发布】 同时还参考了&#xff1a;【Python版宝藏级静态站点生成器Material for MkDocs】 GitHub Pages 介绍 内容参考&#xff1a;GitHub Pages - 杨希杰的个人网站 (yang-xijie.githu…

【CSS】ios上fixed固定定位的input输入框兼容问题

需求 &#xff1a; 实现一个简单的需求&#xff0c;上方是搜索框并且固定顶部&#xff0c;下方是滚动的内容list 问题 : 若如图上方使用固定定位, 下方用scroll-view, 在安卓上是没有问题的, 但是发现ios上会出现兼容问题 : 问题1: 当content list滚动到中间时再去搜索, 展…

c语言每日一练(1)

前言&#xff1a; 每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

解决Springboot+VUE项目部署出现的跨域问题

自己写了一个项目&#xff0c;写好了&#xff0c;发现不会部署&#xff0c;然后到处查资料&#xff0c;最终终于部署好自己写的系统&#xff0c;系统为前后端分离项目。需要分别部署在同一个服务器docker中&#xff0c;配置不同得端口隐射&#xff0c;部署得过程中主要是跨域问…

你值得拥有——流星雨下的告白(Python实现)

目录 1 前言 2 霍金说移民外太空 3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事&#xff0c;提一下大家兴趣&#xff1b;然后我给出论据&#xff0c;得出结论。最后再浪漫的流星雨表白代码奉上&#xff0c;还有我自创的一首诗。开始啦&#xff1a; 2 霍金说…

Oracle锁的学习

Oracle数据库中的锁机制 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时&#xff0c;在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据&#xff0c;破坏数据库的一致性。 在数据库中有两种基本的锁类…