TS流结构分析(PAT和PMT)

合集下载

Transport Stream(TS)数据结构原理

Transport Stream(TS)数据结构原理

Transport Stream概念规范中讲述的概念很多,容易让人糊涂,所以先把一些概念理清,弄清楚它们之间的关系,再看后面的就可提高很多的效率。

(1)ES- Elementary Streams (原始流),对视频、音频信号及其他数据进行编码压缩后的数据流称为原始流。

原始流包括访问单元,比如视频原始流的访问单元就是一副图像的编码数据。

(2) PES- Packetized Elementary Streams (分组的原始流),原始流形成的分组称为PES分组,是用来传递原始流的一种数据结构(3)节目是节目元素的集合。

节目元素可能是原始流,这些原始流有共同的时间基点,用来做同步显示。

(4)传输流和节目流TS-Transport Stream翻译为“传输流”PS-Program Stream 翻译为“节目流”PS用来传输和保存一道节目的编码数据或其他数据。

PS的组成单位是PES分组。

TS用来传输和保存多道节目的编码数据或其他数据,TS的组成单位是节目。

PS适用于不容易发生错误的环境,以及涉及到软件处理的应用,典型应用如DVD光盘的文件存储TS适用于容易发生错误的环境,典型应用就是数字电视信号的传输。

TS和PS是可以互相转换的,比如从TS中抽取一道节目的内容并产生有效的PS是可能。

(5)传输流分组和PES分组原始流分成很多PES分组,保持串行顺序,一个PES分组只包含一个原始流的编码数据。

PES分组长度很大,最大可为64K字节。

PES分组分为“分组首部(header)”和“有效负载(payload)”。

“有效负载”指跟随在首部字节之后的字节。

首部的前4个字节构成分组的起始码,标识了该分组所属原始流的类型和ID号。

TS分组也就是传输流数据形成的数据包。

每个TS分组长度为188字节,包括“分组首部”和“有效负载,前4个字节是分组首部,包含了这个分组的一些信息。

有些情况下需要更多的信息时,需在后面添加“调整字段(adaption field)”。

TS_表结构

TS_表结构

摘要:这篇文章结合DVB-C的有线数字电视某个TS流中的PSI/SI信息表,具体分析了MPEG-2的PSI信息和DVB的SI信息中的各种表,从而更清晰地了解各个表的功能和作用。

<br />要害词:数字电视;TS流;P ...摘要:这篇文章结合DVB-C的有线数字电视某个TS流中的PSI/SI信息表,具体分析了MPEG-2的PSI信息和DVB的SI信息中的各种表,从而更清晰地了解各个表的功能和作用。

在数字电视中,所有视频、音频、文字、图片等经数字化处理后都变成了数据,并按照MPEG-2的标准打包,形成固定长度(188个字节)的传送包,然后将这些数据包进行复用,形成传送码流(TS)。

通常由多个节目及业务复用组成的1个TS(TransportStream传输流)流对应1个8MHz带宽的频道。

数字电视机顶盒中为了找到需要的码流,辨认不同的业务信息,在TS流中必须加入一些引导信息,为此,在MPEG-2中,专门定义了PSI(ProgramSpecificInformation)信息,其作用是从1个携带多个节目的某1个TS流中正确找到特别指定的节目。

在MPEG-2标准中定义的PSI表,是对纯一TS流的描述。

因为体系通常存在多个TS流,为了引导数字电视用户能在TS流中迅速地找出自己需要的业务,DVB对MPEG-2的PSI进行了扩充,在PSI四个表的基础上再增长了九个表,形成SI(ServiceInformation)。

SI是对整个体系所有TS流的描述,在符合MPEG-2(13818-1)的TS传输流中插入DVB标准定义的业务信息(ServiceInformation,SI),使机顶盒(Set-Top-Box)的综合接收解码器(IRD)可以从TS流中提掏出节目供给商播出节目的列表和播出参数,以直观的形式预示给数字电视用户,要得用户可以方便地接收、选择数字电视节目。

PSI表包孕节目联系关系表(PAT)、条件接收表(CAT)、节目映射表(PMT)和收集信息表(NIT)组成,这些表在复用时通过复用器插入到TS流中,并用特别指定的PID(包标识符)进行标识。

ts流解析原理

ts流解析原理

ts流解析原理TS流解析原理是指对TS(Transport Stream)流进行解析的过程,TS流是一种用于传输媒体数据的封装格式,常用于广播和卫星传输等领域。

TS流解析的主要步骤如下:1. TS包解析:TS流由一系列固定大小的TS包组成,每个TS包的大小为188字节。

TS包由头部和数据两部分组成,头部包含了一些基本的信息,如同步字节、计数器等。

解析器需要将每个TS包抽取出来,并解析其头部信息。

2. PID(Packet Identifier)解析:每个TS包中都包含一个PID字段,用于标识不同的数据包或流。

解析器需要根据PID字段的值将TS包中的数据分发到对应的处理模块。

3. PAT(Program Association Table)解析:PAT是TS流中的一个重要表格,用于指示包含在TS流中的其他表格的位置。

解析器首先需要解析出PAT表,获取到其他表格的PID值。

4. PMT(Program Map Table)解析:PMT表是TS流中的另一个重要表格,用于描述媒体流的相关信息,如音视频编码类型、PES(Packetized Elementary Stream)的PID等。

解析器需要根据PAT表获取到的PID值,解析出对应的PMT表。

5. PES解析:PES是TS流中常见的一种封装格式,用于封装音视频等媒体数据。

解析器需要根据PMT表中的PID值,解析出对应的PES数据。

6. 解码处理:解析器将解析出来的音视频等媒体数据交给相应的解码器进行解码,进一步处理和播放。

总的来说,TS流解析原理主要包括了对TS包、PID、PAT表、PMT表和PES数据的解析处理过程。

通过对TS流的解析,可以获取到媒体数据的相关信息,并进行进一步的处理和播放。

PMT和PAT

PMT和PAT

PMT (Program Map Table) 节目映射表Meaning of PMT - "Program Map Table". A Program Specific Information table that supplies basic information about the services present in an Moving Pictures Experts Group 2 (MPEG-2) transport stream. The PMT lists all of the packet IDs (PID) for packets containing elements of a particular program such as audio, video, aux data, and Program Clock Reference (PCR). Packets in the same elementary stream all have the same PID and the decoder can select the elementary stream or streams it wants and reject the remainder. Also carried in the metadata is the information that some programs will be open and some may be subject to encryption节目映射表:数字电视与传统模拟电视节目选择的方式完全不同,传统电视的每一个频道对应一个节目,只要调到相应的频率,就可以看到节目。

而在数字电视信号中,一路码流对应多路节目,使用复用技术就可以做到了。

一个物理的频道只能给出包含多路节目的一路传输流。

要观看其中的某一路节目,还必须从该传输流中提取出该路节目的压缩包,然后再进行解码。

TS

TS

2.2 业务信息(SI)
• 1、业务群关联表(BAT):它提供了业务 群相关的信息,给出了业务群的名称以及 每个业务群中的业务列表。 • 2、业务描述表(SDT):业务描述表包含 了描述系统中业务的数据,例如业务名称、 业务提供者等 • 3、事件信息表(EIT):它包含了与事件 或节目相关的数据,EIT是生成EPG的主要 表。
• ts流是由很多不同种类的包所组成的,这些数据包都是188 个字节大小,这188个字节包含两部分,包头和负载,包头包 括同步信息,包信息等等,而负载则是传输的数据,而这些 负载则可以组成PES流或者私有流等等数据流. • 举例说,一个TS流包括100个包,其中PSI信息包占20个,PES 数据包80个,此TS流中只有一套节目流,不含有私有流,所 以从这80个PES包中的负载连接在一起,就是2个PES流(视 频,音频),如果每个PES包的负载长度为100字节,则这两个 PES流一共长度为8000个字节.假设其中视频的PES流长度 为6000字节.则视频的6000字节的PES流,是由PES包组成 的.PES包没有固定的长度,而是由包头部的数据给出.
• 4、运行状态表(RST):它给出了事件的 状态(运行/非运行),运行状态表更新这 些信息,允许自动适应切换事件。 • 5、时间和日期表(TDT):它给出了与当 前的时间和日期相关的信息,由于这些信 息更新频繁,所以需要单独使用一个表。
• 6、时间偏移表(TOT):它给出了与当前 时间、日期和本地时间偏移相关的信息, 由于这些信息更新频繁,所以需要单独使 用一个表。
CAT与NIT的结构图
• 从上面的几幅图中可知,要保证传送流能正常 接收,在该流中至少有一个完整有效的PAT。 CAT描述了节目的加密方式,它包含了节目的 EMM识别PID,只有授权的解码器才能由CAT 收到密钥,解码出相应的数据流。NIT包含节 目的频道调谐参数、频率、符号率等物理传输 网信息,这些信息使得接收机可以按照用户的 选择以很少的延时或无延时地改变频道、调谐 参数,正确地解码出TS。由于PSI数据的完整 性十分重要,因此在每个PSI段中均需要加校 验码。

ts码流结构分析

ts码流结构分析

ts码流结构分析TS(Transport Stream)是一种常用的音视频码流传输格式,用于在数字广播系统和互联网传输中对音视频数据进行分组和传输。

TS码流结构分析指的是对TS码流的组成部分进行分析,了解各部分的作用和关系。

以下是对TS码流结构的详细分析。

TS码流由多个188字节的包(Packet)组成,每个包都包含了一部分音视频数据。

一个TS包由4个字节的同步字节(Sync Byte)开头,用于标识包的开始。

接下来的4位为传输误码纠正(Error Correction)信息,用于保证传输数据的完整性和准确性。

再接下来的1位为负荷优先级(Payload Unit Start Indicator),用于标识包中是否包含了新的数据单元。

然后是13位的PID(Packet Identifier),用于标识包中所包含的数据单元的类型。

接下来的2位为传输加密(Transport Scrambling Control),用于指定包中数据的加密方式。

再接下来的2位为控制报文(Adaptation Field Control),用于指定包中的控制信息是否存在。

最后的184字节为有效数据(Payload),用于传输音视频数据。

每个TS包中的PID用于标识包中所包含的数据单元的类型,常见的PID值有0x0000(PAT:Program Association Table)、0x0001(CAT:Conditional Access Table)、0x0010(NIT:Network Information Table)、0x0011(SDT:Service Description Table)等。

PAT表包含了整个TS流的所有节目以及对应的PMT(Program Map Table)的PID值。

CAT表用于传递整个TS流中的加密和访问控制信息。

NIT表用于传递整个TS流中的网络信息,包括网络ID和传输参数。

SDT表用于传递整个TS流中的节目信息,包括节目名称和节目号码。

TS流结构

TS流结构

节目源2的映射表(PMT-2) 基本流 编号 包识别(PID) 性质 ES-1 16 Video ES-2 81 Audio ES-3 82 Audio ... … … ES-k 88 Data ... ... ...
条件接收表(CAT) PID=1 条件接收数据
188B P-1 A-1
188B P-2 V
16
188B P-1 MAP
188B P-2 A-1
81
188B P-1 V
54
188B PAT
188B P-2 V
16
188B P-2 MAP
188B EMM
PID
48
22
0
33
1
从TS流中分离出PSI表



MPEG-2的TS是经过节目复用和传输复用 两层完成的:在节目复用时加入了PMT; 在传输复用时加入PAT。 在节目解复用时,可以得到PMT;在传输 解复用时,可以得到PAT。 根据这些表中的PID信息,可以将相应的节 目视频,音频,数据信息找出,并将相关 数据包切换到相应路径
节目源结合表(PAT)PID=0 节目源 编号 Program-0 Program-1 Program-2 … Program-k ... 包识别(PID) 17 22 33 ... 55 ...
网络PID
网络信息表(NIT) 保密网络数据
节目源1的映射表(PMT-1) 基本流 编号 包识别(PID) 性质 ES-1 54 Video ES-2 48 Audio ES-3 49 Audio ... … … ES-k 55 Data ... ... ...
TS流的组成

将具有共同时间基准或具有独立时间基准 的一个或多个PES组合而成的单一的数据流 称为传输流(Transport Stream)。TS 实际是面向数字化分配媒介(有线、卫星、 地面网)的传输层接口。对具有共同时间基 准的两个以上的PES先进行节目复用,然后 再对相互可有独立时间基准的各个PS进行 传输复用,即将每个PES再细分为更小的 TS包

ts流解析规则专业资料

ts流解析规则专业资料

HLS, Http Live Streaming 是由Apple公司定义的用于实时流传输的协议, HLS基于HTTP协议实现, 传输内容涉及两部分, 一是M3U8描述文献, 二是TS媒体文献。

1.M3U8文献用文本方式对媒体文献进行描述, 由一系列标签组成。

#EXTM3U#EXT-X-TARGETDURATION:5#EXTINF:5,./0.ts#EXTINF:5,./1.ts#EXTM3U: 每个M3U8文献第一行必须是这个tag。

#EXT-X-TARGETDURATION: 指定最大的媒体段时间长度(秒), #EXTINF中指定的时间长度必须小于或等于这个最大值。

该值只能出现一次。

#EXTINF:描述单个媒体文献的长度。

后面为媒体文献, 如./0.ts2.ts文献ts文献为传输流文献, 视频编码重要格式h264/mpeg4, 音频为acc/MP3。

ts文献分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream.es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的辨认和传输必须的信息注: 详解如下(1)ts层 ts包大小固定为188字节, ts层分为三个部分:ts header、adaptation field、payload。

ts header固定4个字节;adaptation field也许存在也也许不存在, 重要作用是给局限性188字节的数据做填充;payload是pes数据。

ts headersync_byte 8b同步字节, 固定为0x47transport_error_indicator 1b 传输错误指示符, 表白在ts头的adapt域后由一个无用字节, 通常都为0, 这个字节算在adapt域长度内payload_unit_start_indicator 1b 负载单元起始标示符, 一个完整的数据包开始时标记为1• ts层的内容是通过PID值来标记的, 重要内容涉及: PAT表、PMT表、音频流、视频流。

MPEG-2 TS码流分析

MPEG-2 TS码流分析

MPEG-2 TS码流分析一、TS流概述ES流(Elementary Stream,基本流):数字电视各组成部分编码后所形成的直接表示基本元素内容的流,包含视频、音频或数据的连续码流。

PES流(Paketized Elementary Stream,打包基本码流):是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。

PS (Program Stream,节目流):将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述后的码流。

PS流是一种多路复用数字音频、视频等的封装容器,它一个或多个具有共同的时间基准的PES流合并成一个整体流,主要用于节目存储。

其包长不固定,且较长,一旦失去同步信息,接收机无法确定下一包的同步位置,会造成失步,导致严重的信息丢失。

PS流适用于误码小、信道较好的环境,如演播室、家庭环境和存储介质中。

TS流(Transport Stream,传输流):是将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述和节目组成信息,并进一步封装成传输包后的码流。

TS流是将视频、音频、PSI等数据打包成传输包进行传送。

主要用于节目传输。

TS的传输包长度固定,一般为188字节。

TS流和PS流是MPEG-2标准中规定的两种输出码流。

TS格式中,从视频流的任意一片断开始都可以独立解码,而PS格式不可以。

由于TS流具备较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS 流的包格式。

TS流的播放:播放前将TS流文件的后缀名该为.mpg或者.mpeg,用可以直接播放MPEG-TS流的播放器(一般的播放器都可以)打开播放即可。

TS流的优点:1、动态带宽分配:由于TS的传输包长度是固定的,因此可过PID可以将规定的信道总频带在视频、音频和数据信息见进行实时的、灵活的分配。

利用这一特性,可在广播付费节目前实时地将解密钥匙插入到TS流中送给广大用户。

传送流(TS)的基础知识

传送流(TS)的基础知识

传送流(TS)的基础知识数字电视的TS包和TS流的组成和功能综合考虑⼏下⼏个因素:(1)包的长度不能过短,否则包头开销所占⽐例过⼤,导致传输效率下降(2)包的长度不能过长,否则在丢失同步的情况下恢复同步的周期过长,导致较多的信息丢失(3)其他环境相适配,如纠错编码,宽带⽹等。

TS包按功能分为链接头,适配域,净荷。

链接头的长度固定,4个字节适配域的长度从0字节到184字节可变,可以没有,也可以扩展到整个TS包净荷数据的长度从0字节到184字节可变。

整个TS流是由许多长度为188字节的TS包周期性的排列⽽形成的。

ts包头包含4个字节的内容,主要负责TS包的同步、各种ES流的表⽰、TS包传输差错的检测和条件接收等功能。

(1)包同步(syn_bate)是包中的第⼀个字节,TS包以固定的8bit的同步字节开始,所有的TS传送包,同步字都是唯⼀的OX47,⽤于建⽴发送端和接收端包的同步。

(2)包差错指⽰(transport_error_indicator)⽤于从解码器向分接器指⽰传输误码。

若这个⽐特被设置,表⽰此TS包中所携带的净荷信息有错误,⽆法使⽤。

(3)净荷单元起始指⽰(payload_uint_start_indicator)标志PES包头以及包含节⽬特定信息的表(PMT,PAT)的头是否出现在该包中,在失步后的重新同步中起着重要的作⽤。

(4)传送优先级(transport_priority)⽤于表⽰包中含有重要数据,应予以优先传送。

(6)加扰控制(transport_scrambling_control)传送信息通过加⼊扰码来加密,各个基本码流可以独⽴进⾏加扰。

加扰控制字段说明TS包中的净荷数据是否加扰。

如果加扰,标志出解扰的密匙。

(5)包标识符PID(pid)PID是识别TS包的重要参数,⽤来识别TS包所承载的数据。

在TS码流⽣成时,每⼀类业务(视频,⾳频,数据)的基本码流均被赋予⼀个不同的识别号PID,解码器借助于PID判断某⼀个TS包属于哪⼀类业务的基本码流。

TS流分析

TS流分析

TS流分析图一MPEG-2定义了一些用来描述传输流所携带内容的信息表,称为节目特定信息(PSI)表,包括4个与之相关的表。

其中,节目关联表PAT和节目映射表PMT是确定当前传输流中各节目内容的最关键的两个表。

在接收到TS流时我们首先找到PA T表,因为只有找到PAT表才能确定PMT表才能知道哪些是我们要播放的音频数据和视频数据在开始之前先给出一片实际TS流例子:0000f32ch: 47 40 00 170000 B0 0D 00 01 C1 00 00 00 01 E0 ; G@....?..?...?0000f33ch: 20 A2 C3 29 41 FF FF FF FF FF FF FF FF FF FF FF ; ⒚)A0000f34ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f35ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f36ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f37ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f38ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f39ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f3ach: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f3bch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;0000f3cch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f3dch: FF FF FF FF FF FF FF FF FF FF FF FF 47 40 20 17 ; G@ .0000f3ech: 00 02 B0 1B 00 01 C1 00 00 E0 21 F0 00 1B E0 21 ; ..?..?.??.?0000f3fch: F0 04 2A 02 7E 1F 03 E0 22 F0 00 5D 16 BD 48 ; ?*.~..??].紿1Ts流包的机构是固定的,每个包长188字节,并且头部是不固定的(一般为4字节),负载部分为,188字节减去头部长度。

TS协议解析范文

TS协议解析范文

TS协议解析范文TS协议(Transport Stream Protocol)是一种用于传输音频、视频和数据的通信协议。

它是MPEG(Moving Picture Experts Group)组织制定的一种传输标准,广泛用于数字广播和数字电视等领域。

TS协议主要通过分组方式将音视频数据进行打包、传输和解析,下面将对TS协议的解析进行详细介绍。

一、TS协议概述TS协议是一种基于分组传输的协议,它将音视频数据进行分组打包,每个分组的大小为188字节。

每个分组都包含了一个称为PacketIdentifier(PID)的标识符,用于标识不同的流。

TS协议可以同时传输多个音视频流和数据流,每个流对应一个唯一的PID。

其中,音频流和视频流采用连续的PID进行标识,数据流则可以采用任意的PID。

TS协议还支持通过PAT(Program Association Table)和PMT(Program Map Table)来描述和管理不同的音视频流。

二、TS协议分组结构TS协议的分组结构非常重要,它决定了数据的组织方式和传输方式。

每个TS分组由4字节的同步字节开始,之后是连续的184字节的有效数据和4字节的错误检测码(CRC32)。

TS分组的有效数据包括了多个TS数据包。

TS数据包由4字节的同步字节和184字节的有效负载组成。

同步字节用于标识分组的开始,有效负载则包含了音视频数据和控制信息。

三、TS协议的传输和解析TS协议的传输过程分为打包、传输和解析三个步骤。

首先,音视频数据被打包成TS分组的形式。

在打包过程中,音频和视频流被分别编码和打包,并通过不同的PID进行标识。

每个分组的PID决定了数据的类型和对应的解析方式。

然后,打包后的TS分组通过传输媒介进行传输。

常用的传输媒介包括卫星、有线和无线网络等。

TS分组通过传输媒介被传输到接收端,并进行解析。

最后,接收端根据TS分组的PID进行解析。

首先,接收端解析PAT 表,获取各个音视频流的PID。

解析TS流PAT和PMT代码

解析TS流PAT和PMT代码

解析TS流PAT和PMT代码#include#include#include#define ts_path "/home/huohuo/huangwork/work/birds.ts" //TS⽂件的绝对路径void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len); //读⼀个TS流的packetint parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的tablevoid parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数⽬和PMT的PIDvoid pronum_pmtid_printf(); //打印PMT的PID unsigned char* Find_PMT(unsigned short pmt_pid); //找出PMT的table void parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid); //解析PMT,找出其中的Video和Audio的PID void printf_program_list(); //打印PMT table中包含的stream的类型和PIDunsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的table typedef struct{unsigned short program_num; //program's numunsigned short pmt_pid; //}PROGRAM;typedef struct{unsigned char stream_type;unsigned short elementary_pid;}PRO_LIST;PROGRAM programs[10] = {{0,0}}; //⽤来存储PMT的PID和数量unsigned int num = 0; //total programPRO_LIST program_list[10] = {{0,0}}; //⽤来存储PMT中stream的类型和PIDunsigned int program_list_num = 0;FILE *file_handle; //指向TS流的指针unsigned int FileSize = 0;int main(){unsigned char buffer[188] = {0};unsigned char *pmt_buffer, *Video_or_Audio_buffer;unsigned int i=0,j=0,ret=0;pmt_buffer = (unsigned char*)malloc(sizeof(char)*188); //给buffer分配空间Video_or_Audio_buffer = (unsigned char*)malloc(sizeof(char)*188);memset(Video_or_Audio_buffer,0,sizeof(char)*188);file_handle = fopen(ts_path,"rb+"); //以⼆进制⽅式打开TS⽂件if(NULL == file_handle) //判断是否打开⽂件{perror("fopen");printf("open file error!\n");return 0;}elseprintf("open file success!\n");fseek(file_handle,0,SEEK_END); //指针file_handle将以SEEK_END位置偏移0个位置,即将指针移动到⽂件尾FileSize = ftell(file_handle); // 计算file_handle到⽂件头的偏移字节数,即计算⽂件的⼤⼩printf("file size = %d\n",FileSize);rewind(file_handle); // equivalent (void) feek(file_handle,0L,SEEK_SET) 将file_handle 指针移动到⽂件头位置printf("find PAT begin-------->\n");for(i=0;i{Read_Ts_Packet(file_handle,buffer,188); //读TS的packet函数,每次读188个字节到bufferret = parse_TS(buffer,188); //解析188个字节的TS's packet,并打印找到的PA T’s table。

介绍DVB-S码流,PAT,PMT,NIT,CAT

介绍DVB-S码流,PAT,PMT,NIT,CAT

介绍DVB-S码流,PAT,PMT,NIT,CAT摘要本文介绍了电子节目指南信息的构成以及MPEG-2 PSI和DVB-SI信息规范,提出了一种EPG信息的存储结构和节目数据库的生成方案,并据此讲述了如何在数字有线电视机顶盒中生成电子节目指南EPG。

关键词机顶盒 MPEG-2 PSI节目专用信息 DVB-SI业务信息电子节目指南1 引言目前数字电视已经进入快速发展阶段,与数字电视相关的业务也将大幅度增长。

当节目运营商将大量的节目信息通过有线网络提供给用户,用户在欣赏高质量节目源的同时如何才能方便快捷地找到这些业务或信息就成了开发者们需要解决的一个关键问题。

电子节目指南(EPG,Electronic Program Guide)正是为了方便用户对信息的获取而制作的运行于用户端综合接收解码器(IRD,Integrated Receiver Decoder)的应用程序,它通过电视屏幕向用户提供由文字、图形、图像组成的人机交互界面,负责电视节目和各种业务的导航[1]。

用户通过电子节目指南,能够了解到节目的相关信息(包括节目时间、播放时间、内容梗概等),并且实现对节目的快速检索和访问。

EPG的形成依赖于节目播出前端将符合DVB(Digital Video Broadcasting)标准的业务信息(SI,Service Information)插入到承载节目信息的传送流(TS,Transport Stream)中,这些SI信息携带了EPG所需的全部数据。

2 电子节目指南信息的组成和传输电子节目指南信息(以下简称EPG信息)由两部分组成:基本EPG信息和扩展EPG信息。

基本EPG信息是指完全可以用《数字广播业务信息规范(GY/Z174-2001)》中的网络信息表NIT、业务群关联表BAT、业务描述表SDT、事件信息表EIT等进行描述的EPG信息。

扩展EPG信息是指在基本EPG信息之外,通过数据轮播传递的EPG信息,这些信息的入口采用EPG映射表EMT进行描述,信息的内容被封装成具有多级目录结构的文件系统,称为扩展EPG内容信息(XECI)。

Ts表

Ts表
for (i=0; i<N;i++) {
program_number
16
uimsbf
节目号
reserved
3
bslbf
保留
if(program_number == '0') {
network_PID
13
uimsbf
NIT的PID
}
else {
program_map_PID
13
uimsbf
PMT的PID
TS分析模块实现的主要是对TS流中PAT,PMT,CAT,SDT以及NIT五种表的分析,下面将对这五种表进行简单的描述。
1.PAT:
Table 1-1 -- Program association section
语法
位数
存储形式
备注
program_association_section() {
table_id
传输描述子
}
}
CRC_32
32
rpchof
循环冗余校验
0'
4
bslbf
保留
network_descriptors_length
12
uimsbf
网络描述子的长度
for(i=0;i<N;i++){
descriptor()
网络描述子
}
0'
4
bslbf
保留
transport_stream_loop_length
12
uimsbf
传输流循环的长度
for(i=0;i<N;i++){
for (i=0; i<N;i++) {

mpeg2 ts流PAT,PMT,SDT的定义

mpeg2 ts流PAT,PMT,SDT的定义

更具体准确的信息请参考iso13818-1,都在里面定义的PAT的定义:Table_id:为8bit字段,该字段标识节目关联分段,对于PAT,置为0x00。

Section_syntax_indicator:1bit字段,对于PAT,置为0x01。

Reserved:2bit保留字段,用于将来扩展,置为11。

Section_length:12bit字段,指示当前section的长度,计数值从分段长度下一个字节开始,包括CRC校验的4个字节,开头两位置为00,因此其大小不超过1021。

Transport_stream_id:16bit字段,当前TS流的ID,与网络中其他TS流相区别,由运营商指定。

Reserved:2bit保留字段,用于将来扩展,置为11。

Version_number:5bit字段,指出PAT表的版本号,一旦PAT表有变化,其版本号增1,当增至31时,恢复至0。

Current_next_indicator:1bit,置为1时,表示传送的PAT当前有效,置为0表示PAT下一次有效。

Section_number:8bit字段,表示section的数目,从0x00开始。

Last_section_number:8bit字段,指出最后一个section号,即PAT表section的最大数目。

Program_number:16bit字段,指出了节目对于哪一个PMTPID是可用的,当为0x00时,后面的PID对应于NIT。

Reserved:3bit保留字段,用于将来扩展,置为111。

Network_id:13bit字段,NIT PID。

Program_map_PID:13bit字段,对应于program_number所指定的节目的program_map_section的PID,从上面可看出:一个program用4字节来表示(包括16bit的program_number与13bit的PID)。

CRC:用来证实数据正确性的循环冗余校验码。

TS流结构分析(PAT和PMT)

TS流结构分析(PAT和PMT)

00,以后每个分段加 1,最多可能有 256 个分段
unsigned last_section_number
: 8; // 最后一个分段的号码
std::vector<TS_PAT_Program> program;
unsigned rensigned network_PID
PAT 表格定义如下:
typedef struct TS_PAT_Program
{ unsigned program_number :16; // 节目号 unsigned program_map_PID :13; // 节目映射表的 PID,节目号大于 0 时对应的 PID,每个节目 对应一个
}TS_PAT_Program; //PAT 表结构体
0x79 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xES 组合而来的,他们可以具有相同的时间基准,也可以不同。其 基本的复用思想是,对具有相同时间基准[color="#000000"]的多个 PES 现进行节目复用,然 后再对相互有独立时间基准的各个 PS 进行传输复用,最终产生出 TS。 TS 包由包头和包数 据 2 部分组成,其中包头还可以包括扩展的自适用区。包头长度占 4bytes,自使用区和包数 据共占 184bytes,整个 TS 包长度相当于 4 个 ATM 包长。TS 包的包头由如下图摘录所示的同 步 字 节 、 传 输 误 码指 示 符 、 有 效 载 荷 单 元 起 始 指 示 符、 传 输 优 先 、 包 识 别 ( PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器 8 个部分组成。

SRS之TS封装PAT和PMT

SRS之TS封装PAT和PMT

SRS之TS封装PAT和PMT 1. SrsTsContext::encode_pat_pmt在该函数中,将 PAT 和 PMT 封装到 TS Packet 中,并将这两个 TS packet 写⼊到 ts ⽂件中。

/* the mpegts header specifed the video/audio pid. */#define TS_PMT_NUMBER 1#define TS_PMT_PID 0x1001/* Transport Stream packets are 188 bytes in length */#define SRS_TS_PACKET_SIZE 188int SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid,SrsTsStream vs, int16_t apid, SrsTsStream as){int ret = ERROR_SUCCESS;if (vs != SrsTsStreamVideoH264 && as != SrsTsStreamAudioAAC && as!= SrsTsStreamAudioMp3) {ret = ERROR_HLS_NO_STREAM;srs_error("hls: no pmt pcr pid, vs=%d, as=%d. ret=%d", vs, as, ret);return ret;}int16_t pmt_number = TS_PMT_NUMBER;int16_t pmt_pid = TS_PMT_PID;if (true) {/* ⽣成⼀个包含 PAT 数据的 TS packet */SrsTsPacket* pkt = SrsTsPacket::create_pat(this, pmt_number, pmt_pid);SrsAutoFree(SrsTsPacket, pkt);/* ⼀个 TS 包固定为 188 字节 */char* buf = new char[SRS_TS_PACKET_SIZE];SrsAutoFreeA(char, buf);/* 若不⾜ 188 字节,则余下空间填 0xFF *//* set the left bytes with 0xFF */int nb_buf = pkt->size();srs_assert(nb_buf < SRS_TS_PACKET_SIZE);memset(buf + nb_buf, 0xFF, SRS_TS_PACKET_SIZE - nb_buf);SrsStream stream;if ((ret = stream.initialize(buf, nb_buf)) != ERROR_SUCCESS) {return ret;}/* 将 TS packet 中的数据写⼊到 buf 中 */if ((ret = pkt->encode(&stream)) != ERROR_SUCCESS) {srs_error("ts encode ts packet failed. ret=%d", ret);return ret;}/* 将临时缓存 buf 中的 TS packet 数据写⼊到 .ts ⽂件中,这⾥该⽂件假设为* ./objs/nginx/html/live/livestream-0.ts.tmp* 这⾥调⽤的函数为 */if ((ret = writer->write(buf, SRS_TS_PACKET_SIZE, NULL))!= ERROR_SUCCESS) {srs_error("ts write ts packet failed. ret=%d", ret);return ret;}}if (true) {/* ⽣成⼀个包含 PMT 的 TS Packet,并初始化好所有的数据 */SrsTsPacket* pkt = SrsTsPacket::create_pmt(this, pmt_number, pmt_pid,vpid, vs, apid, as);SrsAutoFree(SrsTsPacket, pkt);/* 创建⼀个临时缓存 */char* buf = new char[SRS_TS_PACKET_SIZE];SrsAutoFreeA(char, buf);/* 若该 TS Packet 的头部加上 payload 的总字节数不⾜ 188 字节,* 则余下填充 0xFF *//* set the left bytes with 0xFF. */int nb_buf = pkt->size();srs_assert(nb_buf < SRS_TS_PACKET_SIZE);memset(buf + nb_buf, 0xFF, SRS_TS_PACKET_SIZE - nb_buf);SrsStream stream;if ((ret = stream.initialize(buf, nb_buf)) != ERROR_SUCCESS) {return ret;}/* 将 TS Packet 中的数据写⼊到 stream 中 */if ((ret = pkt->encode(&stream)) != ERROR_SUCCESS) {srs_error("ts encode ts packet failed. ret=%d", ret);return ret;}/* 将数据写⼊到 ts ⽂件中 */if ((ret = writer->write(buf, SRS_TS_PACKET_SIZE, NULL))!= ERROR_SUCCESS) {srs_error("ts write ts packet failed. ret=%d", ret);return ret;}}/* When PAT and PMT are writen, the context is ready now. */ready = true;return ret;}该函数中,⾸先调⽤ SrsTsPacket::create_pat 函数⽣成⼀个 pmt 包。

解析TS流PAT和PMT 代码

解析TS流PAT和PMT 代码

#include<stdio.h>#include<stdlib.h>#include<string.h>#define ts_path "/home/huohuo/huangwork/work/birds.ts" //TS文件的绝对路径void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len); //读一个TS流的packetint parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的tablevoid parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数目和PMT的PIDvoid pronum_pmtid_printf(); //打印PMT的PID unsigned char* Find_PMT(unsigned short pmt_pid); //找出PMT的tablevoid parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid); //解析PMT,找出其中的Video和Audio的PIDvoid printf_program_list(); //打印PMT table中包含的stream的类型和PIDunsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的tabletypedef struct{unsigned short program_num; //program's numunsigned short pmt_pid; //}PROGRAM;typedef struct{unsigned char stream_type;unsigned short elementary_pid;}PRO_LIST;PROGRAM programs[10] = {{0,0}}; //用来存储PMT的PID和数量unsigned int num = 0; //total programPRO_LIST program_list[10] = {{0,0}}; //用来存储PMT中stream的类型和PIDunsigned int program_list_num = 0;FILE *file_handle; //指向TS流的指针unsigned int FileSize = 0;int main(){unsigned char buffer[188] = {0};unsigned char *pmt_buffer, *Video_or_Audio_buffer;unsigned int i=0,j=0,ret=0;pmt_buffer = (unsigned char*)malloc(sizeof(char)*188); //给buffer分配空间memset(pmt_buffer,0,sizeof(char)*188);//清空bufferVideo_or_Audio_buffer = (unsigned char*)malloc(sizeof(char)*188);memset(Video_or_Audio_buffer,0,sizeof(char)*188);file_handle = fopen(ts_path,"rb+"); //以二进制方式打开TS文件if(NULL == file_handle) //判断是否打开文件{perror("fopen");printf("open file error!\n");return 0;}elseprintf("open file success!\n");fseek(file_handle,0,SEEK_END); //指针file_handle将以SEEK_END位置偏移0个位置,即将指针移动到文件尾FileSize = ftell(file_handle); // 计算file_handle到文件头的偏移字节数,即计算文件的大小printf("file size = %d\n",FileSize);rewind(file_handle); // equivalent (void) feek(file_handle,0L,SEEK_SET) 将file_handle 指针移动到文件头位置printf("find PAT begin-------->\n");for(i=0;i<FileSize/188;i++){Read_Ts_Packet(file_handle,buffer,188); //读TS的packet函数,每次读188个字节到bufferret = parse_TS(buffer,188); //解析188个字节的TS's packet,并打印找到的PA T’s table。

TS流解析之PMT表格解析

TS流解析之PMT表格解析

TS流解析之PMT表格解析2010-12-14 08:44TS流解析之PMT表格解析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; //固定为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有效。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TS流也是由一个或多个PES组合而来的,他们可以具有相同的时间基准,也可以不同。

其基本的复用思想是,对具有相同时间基准[color="#000000"]的多个PES现进行节目复用,然后再对相互有独立时间基准的各个PS进行传输复用,最终产生出TS。

TS包由包头和包数据2部分组成,其中包头还可以包括扩展的自适用区。

包头长度占4bytes,自使用区和包数据共占184bytes,整个TS包长度相当于4个ATM包长。

TS包的包头由如下图摘录所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。

其中,可用同步字节位串的自动相关特性,检测数据流中的包限制,建立包同步;传输误码指示符,是指有不能消除误码时,采用误码校正解码器可表示1bit 的误码,但无法校正;有效载荷单元起始指示符,表示该数据包是否存在确定的起始信息;传输优先,是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;传输加扰控制,可指示数据包内容是否加扰,但包头和自适应区永远不加扰;自适应区控制,用2 bit表示有否自适应区,即(01)表示有有用信息无自适应区,(10)表示无有用信息有自适应区,(11)表示有有用信息有自适应区,(00)无定义;连续计数器可对PID包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。

显然,包头对TS包具有同步、识别、检错及加密功能。

TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。

其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。

重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。

其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。

因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。

为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。

于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。

自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。

标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也
为插入当地节目提供方便。

自适应区中的填充数据是由于PES包长不可能正好转为TS包的整数倍,最后的TS包保留一小部分有用容量,通过填充字节加以填补,这样可以防止缓存器下溢,保持总码率恒定不变。

根据前一篇中各数据的定义及数据结构,对数据进行分别解析如下:
TS包头定义:
typedef struct TS_packet_header
{
unsigned sync_byte : 8; //同步字节, 固定为0x47,表示后面的是一个TS分组unsigned transport_error_indicator : 1; //传输误码指示符
unsigned payload_unit_start_indicator : 1; //有效荷载单元起始指示符
unsigned transport_priority : 1; //传输优先, 1表示高优先级,传输机制可能用到,解码用不着
unsigned PID : 13; //PID
unsigned transport_scrambling_control : 2; //传输加扰控制
unsigned adaption_field_control : 2; //自适应控制01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。

为00解码器不进行处理
unsigned continuity_counter : 4; //连续计数器一个4bit的计数器,范围0-15
} TS_packet_header;
TS包头解析代码:
HRESULT CTS_Stream_Parse::adjust_TS_packet_header( TS_packet_header* TS_header ) {
unsigned char buf[4];
memcpy(buf, TS_header, 4);
TS_header->transport_error_indicator = buf[1] >> 7;
TS_header->payload_unit_start_indicator = buf[1] >> 6 & 0x01;
TS_header->transport_priority = buf[1] >> 5 & 0x01;
TS_header->PID = (buf[1] & 0x1F) << 8 | buf[2];
TS_header->transport_scrambling_control = buf[3] >> 6;
TS_header->adaption_field_control = buf[3] >> 4 & 0x03;
TS_header->continuity_counter = buf[3] & 0x0F; // 四位数据,应为0x0F xyy 09.03.18
return 0;
}
如下为一个TS包数据:
0x47 0x40 0x00 0x12 0x00 0x00 0xb0 0x0d 0x00 0x00 0xc1 0x00 0x00 0x00 0x01 0xe3 0xe8 0xf0 0x0b 0xd7
0x79 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 分析知道前四位0x47 0x40 0x00 0x12TS头部即为TS包头数据,解析如下:
sync_byte :0x47
transport_error_indicator: 0x00
payload_unit_start_indicator: 0x01
transport_priority : 0x00
PID :0x0000
transport_scrambling_control :0x00
adaptation_field_control :0x01
continuity_counter :0x02
PID = 0x0000,表示此TS包的内容为PSI信息表格的PAT表格数据,在4字节的TS包头之后的第一个字节的Point_field = 0x00, 表示偏移量为0,即紧随其后的即为PAT的数据信息。

TS流解析之PAT表格解析
TS流解析之PMT表格解析。

相关文档
最新文档