数字电视节目码流中的PMT表分析

数字电视业务PSI/SI学习系列 一、MPEG-2系统原理                             第一章 MPEG-2简介什么是MPEG和MPEG-2?      MPEG是Moving Picture Experts Group 的简称,MPEG-2是MPEG和ISO组织设计的一个数字视频压缩规范,主要用于DVD和DVB上,当前的标准文档是ISO13818.什么是DVB?DVB是Digt 阅读详情

        PMT(Program Map Table):节目映射表,该表的PID是由PAT提供给出的。通过该表可以得到一路节目中包含的信息,例如,该路节目由哪些流构成和这些流的类型(视频,音频,数据),指定节目中各流对应的PID,以及该节目的PCR所对应的PID。

PMT表中包含的数据如下:

        (1) 当前频道中包含的所有Video数据的PID
        (2) 当前频道中包含的所有Audio数据的PID
        (3) 和当前频道关联在一起的其他数据的PID(如数字广播,数据通讯等使用的PID)

PMT结构定义:

typedef struct TS_PMT_Stream
{
 unsigned stream_type     : 8; //指示特定PID的节目元素包的类型。该处PID由elementary PID指定
 unsigned elementary_PID  : 13; //该域指示TS包的PID值。这些TS包含有相关的节目元素
 unsigned ES_info_length  : 12; //前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数
 unsigned descriptor;
}TS_PMT_Stream;


 

PMT表结构体:

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
   nsigned 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 reserved_5                : 3; //0x07
   unsigned reserved_6                : 4; //0x0F
   unsigned CRC_32                    : 32; 
} TS_PMT; 

解析代码:

HRESULT CTS_Stream_Parse::adjust_PMT_table ( TS_PMT * packet, unsigned char * buffer )
{ 
    packet->table_id                         = buffer[0];
    packet->section_syntax_indicator         = buffer[1] >> 7;
    packet->zero                             = buffer[1] >> 6 & 0x01; 
    packet->reserved_1                       = buffer[1] >> 4 & 0x03;
    packet->section_length                   = (buffer[1] & 0x0F) << 8 | buffer[2];    
    packet->program_number                   = buffer[3] << 8 | buffer[4];
    packet->reserved_2                       = buffer[5] >> 6;
    packet->version_number                   = buffer[5] >> 1 & 0x1F;
    packet->current_next_indicator           = (buffer[5] << 7) >> 7;
    packet->section_number                   = buffer[6];
    packet->last_section_number              = buffer[7];
    packet->reserved_3                       = buffer[8] >> 5;
    packet->PCR_PID                          = ((buffer[8] << 8) | buffer[9]) & 0x1FFF;

    PCRID = packet->PCR_PID;

    packet->reserved_4                       = buffer[10] >> 4;
    packet->program_info_length              = (buffer[10] & 0x0F) << 8 | buffer[11]; 
    // Get CRC_32
    int len = 0;
    len = packet->section_length + 3;    
    packet->CRC_32                = (buffer[len-4] & 0x000000FF) << 24
      | (buffer[len-3] & 0x000000FF) << 16
      | (buffer[len-2] & 0x000000FF) << 8
      | (buffer[len-1] & 0x000000FF); 

  int pos = 12;
  // program info descriptor
  if ( packet->program_info_length != 0 )
        pos += packet->program_info_length;    
  // Get stream type and PID    
  for ( ; pos <= (packet->section_length + 2 ) -  4; )
  {
    TS_PMT_Stream pmt_stream;
    pmt_stream.stream_type =  buffer[pos];
    packet->reserved_5  =  buffer[pos+1] >> 5;
    pmt_stream.elementary_PID = ((buffer[pos+1] << 8) | buffer[pos+2]) & 0x1FFF;
    packet->reserved_6    =  buffer[pos+3] >> 4;
    pmt_stream.ES_info_length =  (buffer[pos+3] & 0x0F) << 8 | buffer[pos+4];
  
    pmt_stream.descriptor = 0x00;
    if (pmt_stream.ES_info_length != 0)
    {
       pmt_stream.descriptor = buffer[pos + 5];
   
       for( int len = 2; len <= pmt_stream.ES_info_length; len ++ )
       {
         pmt_stream.descriptor = pmt_stream.descriptor<< 8 | buffer[pos + 4 + len];
       }
       pos += pmt_stream.ES_info_length;
    }
    pos += 5;
    packet->PMT_Stream.push_back( pmt_stream );
    TS_Stream_type.push_back( pmt_stream );
   }
   return 0;
}

下面分析一段TS流的一个pachet:

包头:47 41 00 10

数据: 00 02 b0 29 00 01 c1 00 00 f001 f0 0c 05 04 48 44 4d 56 88 04 0f ff fc fc 1b f0 11 f0 06 28 04 42 c028 bf 90 f2 00 f0 00 f8 d6 bd 6b

先分析包头:

第一个的包头为47 40 00 10,比较可知只是PID不同

它的PID为0x100,即为256

所以第二个包的数据表示的是PMT

再分析具体数据:

同理第一个字节00是调整字节

02 b0 29 00 01 c1 00 00 f001 f0 0c 05 04 48 44 4d 56 88 04 0f ff fc fc 1b f0 11 f0 06 28 04 42 c028 bf 90 f2 00 f0 00 f8 d6 bd 6b

PMT

table_id

8

1个字节

section_syntax_indicator

1

 

2个字节

‘0’

1

reserved

2

section_length

12

program_number

16

2个字节

reserved

2

 

1个字节

version_number

5

current_next_indicator

1

section_number

8

1个字节

last_section_number

8

1个字节

reserved

3

 

2个字节

PCR_PID

13

reserved

4

2个字节

program_info_length

12

循环:descriptor()(0-N)

循环开始(0-N1)

stream_type

8

1个字节

reserved

3

2个字节

elementary_PID

13

reserved

4

2个字节

ES_info_length

12

循环:descriptor()(0-N2)

循环结束

CRC_32

32

4个字节

02 b0 29 00 01 c1 00 00 f0 01 f0 0c 05 04 48 44 4d 5688 04 0f ff fc fc 1b f0 11 f0 06 28 04 42 c0 28 bf 90 f200 f0 00 f8 d6 bd 6b

table_id为02,对于PMT必须为0x02

b0 29二进制为1011 0000 0010 1001

section_syntax_indicator为1,对于PMT必须为1

section_length为0x029,即为32+9=41

00 01

program_number为0x0001

c1二进制为1100 0001

version_number为00000

current_next_indicator为1,表示当前传送的program_map_section可用

00 00

分别表示section_number和last_section_number

f0 01二进制为1111 0000 0000 0001

PCR_PID为0x1001,即为2的12次方+1=4097,该字段只是TS包的PID值

f0 0c二进制为11110000 0000 1100

program_info_length为0x00c,即为12





 


ts流中PAT表与PMT表详解 关于mpeg2中ts流PAT表与PMT表详解 立即下载

相关推荐

从宁德新能源面试官视角,拆解Halcon/OpenCV图像处理工程师的硬核技能树(附避坑指南)

本文从宁德新能源面试官视角出发,详细拆解Halcon/OpenCV图像处理工程师的核心技能树,涵盖硬件选型、算法实现和系统工程思维三大能力维度。文章提供工业视觉工程师面试的实战避坑指南,包括硬件配置要点、算法优化技巧及职业发展路径,助力求职者系统提升图像处理专业技能。

weixin_28732953的博客 129

TS码流解析-4-解析PMT表

任务四 根据解析PAT表的PMT_PID列表,获取所有的相关的PMT表,并且解析出包含的节目信息,主要是指音频和视频的pid。 相关知识 相信解码流解到这一步的人,对表的解析多多少少有一些了解,在这先放张PMT表的结构图,方便大家了解。PMT表示的是节目映射表的简称,可由PAT表查找到相应的PID,里面存储着音频、视频以及其他一些与节目相关的信息。解到这一步后,可以尝试着把音频视频的PID对应的t...

小球萝卜干的博客 2078

ESP32-S3驱动雨滴传感器实战:从原理到ADC/GPIO双模式数据采集

本文详细介绍了ESP32-S3驱动雨滴传感器的实战教程,涵盖其工作原理及ADC/GPIO双模式数据采集方法。通过解析传感器利用水的导电性检测雨量的核心机制,提供了完整的硬件连接方案与软件驱动代码,包括模拟量(AO)的ADC读取和数字量(DO)的GPIO读取,并附有调试技巧,帮助开发者快速实现雨滴检测功能。

weixin_32005771的博客 154

mpeg2 ts流PAT,PMT,SDT的定义

转载自:http://blog.sina.com.cn/s/blog_5ea0192f0100vo15.html 更具体准确的信息请参考iso13818-1,都在里面定义的     PAT的定义: Table_id:为8bit字段,该字段标识节目关联分段,对于PAT,置为0x00。 Section_syntax_indicator:1bit字段,对于PAT,置为 0x01。 R

2324

华南理工大学电子与信息学院23年预推免复试面试经验贴

华南理工大学电子与信息学院23年预推免复试面试经验贴

Scut_Ty的博客 3297

Backtrader 文档学习- 整体架构功能分析理解

backtrader是一个用于开发和执行交易策略的Python框架。它提供了一套完整的工具和功能,使得用户可以方便地进行策略回测、实盘交易以及数据分析。backtrader的入口为Cerebro类,该类将所有输入(Data Feeds)、策略 (Strategy)、观察者(Observers)、策略评估(Analyzers) 、经纪人(Broker)、订单(Order)、交易(Trade)和日志记录(Writers)整合起来,实现回测以及交易,并返回结果和图表。

六月闻君 6327

PMT 表分析

PMT表结构 PMT 表实例 在下图中,我们可以看到PMT表携带的基本信息。一共有四个section,是四张PMT表的信息;其中,每个section存储在一个PMT表中,对应了一个节目的信息。 下面,我们以节目号为16398的节目为例进行分析。 下图可以看到,一共有3个单元流,每一个单元流都是组成这个节目的一个 元素(或者说是分量)。 可以看到,这个节目包含一个MPEG2的视频(stream_...

暗暗月 3530

[软考]系统架构设计师 备考经验分享(一) - 备考计划篇

前言 上周末刚刚结束了软考架构师的考试,自我感觉考的还可以,大概率是过了。 两次参加软考,一次中级嵌入式,一次高级架构师,都是备考不到两个月时间,尤其是架构师这次考试内容和本职工作有不小的差别,并且需要同时备考三个科目,在高强度地备考中感觉是摸索出到了一点软考的技巧与经验。 打算趁还记得,赶紧写几篇文章做下梳理总结,算是给将来自己考系分、高项或者其他考试做个记录,也希望能够帮到正在备考的大家。 先把第一步,个人的备考计划分享给大家。 自身情况分析 首先,请大家一定先明确三个问题,这三个问题会直接影响到你的

_ 6404

pmt表解析

节目映射表提供节目号与组成它们的所有原始码流之间的映射,其PID由所在TS中的PAT表指定,PMT以program_map_section的形式进行TS打包。 我们知道,单路节目的TS是由具有相同时间基点的PES流复用而成的,典型情况下包含一路视频PES流、多路音频PES流,还有teletext、subtitle等PES,各路PES的PID就在这张表中指定。因此,解析这张表就可以知...

dkyptnz538386的博客 796

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

本文对Unity引擎的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。 网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。 本文整理的多数文章都是有对应的系列性文章专栏,可以更方便的进行系统学习相关知识体系。

努力前行,总会成为自己心中的那道光 15万+

SEGGER Embedded Studio初体验

先楫HPM5E00EVK开发环境搭建

hywing's blog 1109

TS/PAT/PMT

/PMT 表结构体//固定为0x02, 表示PMT表//固定为0x01//0x01//0x03//首先两位bit置为00,它指示段的byte数,由段长度域开始,包含CRC。// 指出该节目对应于可应用的Program map PID//0x03//指出TS流中Program map section的版本号//当该位置1时,当前传送的Program map section可用;

qq_71345785的博客 1350

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3516

数字电视节目码流的PMT表分析

节目映射表提供节目号与组成它们的所有原始码流之间的映射,其PID由所在TS中的PAT表指定,PMT以program_map_section的形式进行TS打包。     我们知道,单路节目的TS是由具有相同时间基点的PES流复用而成的,典型情况下包含一路视频PES流、多路音频PES流,还有teletext、subtitle等PES,各路PES的PID就在这张表中指定。因此,解析这张表就可以知道一路

hy209的专栏 1179

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Ts流 介绍

在MPEG-II标准中,为了将一个或更多的音频、视频或其他的基本数据流合成单个或多个数据流,以适应于存储和传送,必须对其重新进行打包编码,在码流中还需插入各种时间标记、系统控制等信息,最后送到信道编码与调制器。这样可以形成两种数据流——传送流(TS)和程序流(PS),分别适用于不同的应用,图1给出了单路节目的视音频数据流的复用框图。      传送流(Transport Stream)简称TS流

585

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【PSI/SI学习系列】1.从TS流到PAT和PMT

int Video_PID=0x07e5,Audio_PID=0x07e6; void Process_Packet(unsigned char*buff) { int i; int PID=GETPID(buff); if(PID==0x0000) { Process_PAT(buff+4); } //PAT表的PID为0x0000 else if(PID=

Destiny的专栏 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

DVB-C中的各种PSI/SI表的说明

 摘要:本文结合DVB-C的有线数字电视某个TS流中的PSI/SI信息表,具体分析了MPEG-2的PSI信息和DVB的SI信息中的各种表,从而更清晰地了解各个表的功能和作用。 关键词:数字电视;TS流;PSI信息;SI信息;电子节目指南EPG1、引言 在数字电视中,所有视频、音频、文字、图片等经数字化处理后都变成了数据,并按照MPEG-2的标准打包,形成固定长度(188个字节)的传

bisword的专栏 1万+

TS流概述(ES流-基本流,PES流-打包基本码流,PS流-节目流,TS流-传输流)

一、TS流概述 ES流(Elementary Stream,基本流):数字电视各组成部分编码后所形成的直接表示基本元素内容的流,包含视频、音频或数据的连续码流。 PES流(Paketized Elementary Stream,打包基本码流):是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。 PS (Program Stream,节目流):将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述后的码流。PS流是一种多路复用数字音频、视

qingdao666666的博客 8739

TS流分析

一 从TS流开始         数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video、Audio以及我们需要学习的PAT、PMT等信息。因此,我们首先需要了解TS流是什么,以及TS流是怎样形成、有着怎样的结构。 (一) TS流、PS流、PES流和ES流都是什么?        ES流(Element

zxh821112的专栏 6万+

数字电视节目码流中的PAT表分析

PAT定义了当前TS流中所有的节目,其PID恒为0x00,它是PSI信息的根节点,要查找节目必须从PAT表开始,在TS中很容易被找到。       在PAT中,列出描述每个节目组成的PMT的PID,也包含NIT PID。PAT section header为8个字节,由表标识符、表格section长度、transport_stream_id、版本号、当前/下一次指示符、分段号和最后分段号组成。

qilihechuncai的专栏 2521

数字电视电子节目指南(EPG)的实现原理分析

数字电视电子节目指南(EPG)的实现原理分析张剑   武汉广电数字网络有限公司数字电视技术部副经理         文章来源:局技术论文获奖文章   近几年来,数字电视在我国得到了飞速发展。数字电视相对于传统的模拟电视而言,不仅仅在于用户接收的图像质量大大改进,更重要的是引入了服务信息(Service Information,SI)这一概念,通过SI信息

Yaoyao的笔记簿 6465

TS流基本知识【HI3798 AVPLAY播放TS流】

AVPLAY(Audio Video Player)模块整合SDK 内部音视频播放相关模块,提供给用户基本播放业务相关的接口。AVPLAY 在典型媒体播放终端方案中的位置如图所示。AVPLAY 主要依赖ADEC/VDEC/DEMUX 等模块,其向应用或中间件播放器提供基本的播放业务相关接口。 首先在官方给的sample_ipplayer例程中。首先需要进行一系列的初始化工作,在这里就不一一讲述。主要是讲述如何使用Demux模块来进行节目搜索。 一、TS流相关知识 数字电视机顶盒接收到的是一段段.

老谭_酸菜的博客 3366

数字电视之TS流解析

做了这么久的TV方案,对数字电视也很了解,今天来总结一下,MPEG-2 TS流解析的细节: TS流中有两种标识符,一种是包标识符,一种是表标识符。具有相同PID的不用信息表由表标识符table Id来区分,接收端通过查这些特定的PID来找到他们。 一,一个ts流中包含了很多PID packets,这些数据包大致包含以下两个tables表。         1,PSI tables--

hh448096207的博客 3209

数字电视常用表分析

PAT: 提供包含NIT表和PMT表信息ts包的PID; 该表中可以得知TSID、Program Number等信息; PAT表是必备表项,搜索节目必须从PAT开始; PMT: 提供节目号码与组成他们的原始码流之间的映射; 该表中可以得知Program Number; NIT表:

msguoguoxin的博客 960
上一篇: 数字电视节目码流中的PAT表分析
下一篇: 这个七月,很惬意
beyondzd2000
博客等级 码龄18年 24粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值