TS_PSI介绍


/*
 **************************************************************************************************************************************
 (1)ES- Elementary Streams (原始流),对视频、音频信号及其他数据进行编码压缩后的数据流称为原始流。原始流包括访问单元,比如视频原始流的访问单元就是一副图像的编码数据。

 (2)PES- Packetized Elementary Streams (分组的原始流),原始流形成的分组称为PES分组,是用来传递原始流的一种数据结构

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

 (4)传输流和节目流
   4.1) TS-Transport Stream 翻译为“传输流”
   4.2) PS-Program Stream  翻译为“节目流”
   4.3) PS用来传输和保存一道节目的编码数据或其他数据,PS的组成单位是PES分组。
   4.4) TS用来传输和保存多道节目的编码数据或其他数据,TS的组成单位是节目。
   4.5) PS适用于不容易发生错误的环境,以及涉及到软件处理的应用,典型应用如DVD光盘的文件存储.
   4.6) TS适用于容易发生错误的环境,典型应用就是数字电视信号的传输。
   TS和PS是可以互相转换的,比如从TS中抽取一道节目的内容并产生有效的PS是可能。

 (5)传输流分组和PES分组原始流分成很多PES分组,保持串行顺序,一个PES分组只包含一个原始流的编码数据。
   5.1) PES分组长度很大,最大可为64K字节。PES分组分为“分组首部(header)”和“有效负载(payload)”。
   5.2) “有效负载”指跟随在首部字节之后的字节。首部的前4个字节构成分组的起始码,标识了该分组所属原始流的类型和ID号。
   5.3) TS分组也就是传输流数据形成的数据包。每个TS分组长度为188字节,包括“分组首部”和“有效负载,前4个字节是分组首部,包含了这个分组的一些信息。
   5.4) 有些情况下需要更多的信息时,需在后面添加“调整字段(adaption field)”。
   5.5) 两者之间的关系:PES分组是插入到TS分组中的,每个PES分组首部的第一字节就是TS分组有效负载的第一字节。一个PID值的TS分组只带有来自一个原始流的数据。
 
 (6)PSI 全称Program Specific Information,意为节目专用信息。
   6.1) 传输流中是多路节目复用的,那么,怎么知道这些节目在传输流中的位置,区分属于不同节目呢?所以就还需要一些附加信息,这就是PSI。
   6.2) PSI也是插入到TS分组中的,它们的PID是特定值。
   6.3) MPEG-2中规定了4个PSI,包括:
        PAT(节目关联表),
        CAT(条件访问表),
        PMT(节目映射表),
        NIT(网络信息表),
        这些PSI包含了进行多路解调和显示节目的必要的和足够的信息。
   6.4) 应用中可能包括更多的信息,比如DVB-T中定义了SDT(服务描述表),EIT(环境信息表),BAT(节目组相关表),TDT(时间日期表)等,统称为DVB-SI(服务信息)。 
   6.5) PSI的PID是特定的,含PSI的数据包必须周期性的出现在传输流中。
 
--->PMT (Program Map Table )节目映射表PMT所在分组的PID由PAT指定,所以要先解出PAT,再解PMT。
 PMT中包含了属于同一节目的视频、音频和数据原始流的PID。找到了PMT,解多路复用器就可找到一道节目对应的每个原始流的PID,再根据原始流PID,去获取原始流。
 
--->PAT (Program Association Table )节目关联表PAT所在分组的PID=0 ;
 PAT中列出了传输流中存在的节目流PAT指定了传输流中每个节目对应PMT所在分组的PID;
 PAT的第一条数据指定了NIT所在分组的PID ,其他数据指定了PMT所在分组的PID。
 
--->CAT (Conditional Access Table )条件访问表CAT所在分组的PID=1;
 CAT中列出了条件控制信息(ECM)和条件管理信息(EMM)所在分组的PID。
 CAT用于节目的加密和解密 
 
--->NIT( Network Information Table)网络信息表;
 NIT所在分组的PID由PAT指定;
 NIT提供一组传输流的相关信息,以及于网络自身特性相关的信息,比如网络名称,传输参数(如频率,调制方式等)。
 NIT一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考。
 
 几种PSI之间的关系,如下图所示:
 1. 首先PAT中指定了传输流中所存在的节目,及每个节目对应的PMT的PID号。 
 2. 比如Program 1对应的PMT的PID=22,然后找到PID=22的TS分组;
 3. 解出PMT,得到这个节目中包含的原始流的PID;
 4. 再根据原始流的PID去找相应的TS分组,获取原始流的数据;
 5. 然后就可以送入解码器解码了。
 **************************************************************************************************************************************
 */

/*
 *  数据结构(1)TS分组前面提到,TS分组由188个字节构成,其结构如下:
 */

transport_packet(){
		sync_byte					// 8
		transport_error_indicator	//1
		payload_unit_start_indicator	//1
		transport_priority				// 1  PID	//13
		transport_scrambling_control	// 2
		adaptation_field_control		//2
		continuity_counter				//4
		if(adaptation_field_control=='10'  || adaptation_field_control=='11'){
			adaptation_field()
		}
	
		if(adaptation_field_control=='01' || adaptation_field_control=='11') {
		for (i=0;i<N;i++){
			data_byte					//8
		}
	}
}
/*
**************************************************************************************************************************************
--->前面32bit的数据即TS分组首部,它指出了这个分组的属性。
 
sync_byte                   :    同步字节,固定为0x47 ,表示后面的是一个TS分组,当然,后面包中的数据是不会出现0x47的
transport_error_indicator   :    传输错误标志位,一般传输错误的话就不会处理这个包了
payload_unit_start_indicator :  这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同,后面用到的时候再说。
transport_priority           :  传输优先级位,1表示高优先级,传输机制可能用到,解码好像用不着。
PID                          :  这个比较重要,指出了这个包的有效负载数据的类型,告诉我们这个包传输的是什么内容。前面已经叙述过。
transport_scrambling_control :  加密标志位,表示TS分组有效负载的加密模式。TS分组首部(也就是前面这32bit)是不应被加密的,00表示未加密。
adaption_field_control       :  翻译为“调整字段控制”,表示TS分组首部后面是否跟随有调整字段和有效负载。
                                01 --仅含有效负载,
                                10 --仅含调整字段,
                                11 --含有调整字段和有效负载,
                                00 --解码器不进行处理。空分组没有调整字段
continuity_counter           :  一个4bit的计数器,范围0-15,具有相同的PID的TS分组传输时每次加1,到15后清0。不过,有些情况下是不计数的。
                             : 如下:
                                (1)TS分组无有效负载;
                                (2)复制的TS分组和原分组这个值一样;
                                (3)后面讲到的一个标志discontinuity_indicator为1时;
adaptation_field()          :   调整字段的处理
data_byte                   :   有效负载的剩余部分,可能为PES分组,PSI,或一些自定义的数据。
**************************************************************************************************************************************
*/

/*
 *  (2)  PAT数据结构如下:
 */

program_association_section() 
{
		table_id                                // 8
		section_syntax_indicator                // 1
		'0'                                     // 1
		reserved                                // 2
		section_length                          // 12
		transport_stream_id                     // 16
		reserved                                // 2
		version_number                          // 5
		current_next_indicator                  // 1
		section_number                          // 8
		last_section_number                     // 8
		for (i=0; i<N;i++) {
			program_number                      // 16
			reserved                            // 3
			if(program_number == '0') {
				network_PID                     // 13
			}
			else
			{
				program_map_PID                 // 13
			}
		}
		CRC_32                                  //  32
}

/*
**************************************************************************************************************************************
table_id                    : 固定为0x00 ,标志是该表是PAT
section_syntax_indicator    : 段语法标志位,固定为1
section_length              : 表示这个字节后面有用的字节数,包括CRC32。
                              假如后面的字节加上前面的字节数少于188,后面会用0XFF填充。假如这个数值比较大,则PAT会分成几部分来传输。
transport_stream_id         : 该传输流的ID,区别于一个网络中其它多路复用的流。
version_number              : 范围0-31,表示PAT的版本号,标注当前节目的版本.
                              这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.
current_next_indicator      : 表示发送的PAT是当前有效还是下一个PAT有效。
section_number              : 分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段
last_section_number         : 最后一个分段的号码

program_number              : 节目号
network_PID                 : 网络信息表(NIT)的PID,网络信息表提供了该物理网络的一些信息,和电视台相关的。节目号为0时对应的PID为network_PID
program_map_PID             : 节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个

CRC_32                      : CRC32校验码
 
上面program_number,network_PID,program_map_PID 是循环出现的。
program_number等于0时          ---->对应network_PID;
program_number等于其它值时      ---->对应program_map_PID。
**************************************************************************************************************************************
*/

/*
 *(3)PMT   PMT数据结构如下:
 */

TS_program_map_section() {
    table_id                               // 8
    section_syntax_indicator              //  1
    '0'                                   //  1
    reserved                              //  2
    section_length                        //  12
    program_number                        //  16
    reserved                              //  2
    version_number                        //  5
    current_next_indicator                //  1
    section_number                        //  8
    last_section_number                   //  8
    reserved                              //  3
    PCR_PID                               //  13
    reserved 4
    program_info_length                   //  12
    for (i=0; i<N; i++) {
        descriptor()
    }
    for (i=0;i<N1;i++) {
        stream_type                           //  8
        reserved                              //  3
        elementary_PID                        //  13
        reserved                              //  4
        ES_info_length                        //  12
        for (i=0; i<N2; i++) {
            descriptor()
        }
    }
    CRC_32                                 //  32
}

/*
**************************************************************************************************************************************
table_id                    : 固定为0x02 ,标志是该表是PMT。
section_syntax_indicator    :
section_length              :
version_number              : 
current_next_indicator      : 以上四个字段意思和PAT相同,可参考上面解释
section_number              : 
last_section_number         : 以上两个字段意思和PAT相同,不过值都固定为0x00,这样的原因可能是因为PMT不需要有先后顺序,因为先定义哪个节目都是无所谓。
program_number              : 节目号,表示该PMT对应的节目
PCR_PID PCR                 :(节目时钟参考)所在TS分组的PID,根据PID可以去搜索相应的TS分组,解出PCR信息。
program_info_length         : 该节目的信息长度,在此字段之后可能会有一些字节描述该节目的信息
stream_type                 : 指示了PID为elementary_PID的PES分组中原始流的类型,比如视频流,音频流等,见后面的表
elementary_PID              : 该节目中包括的视频流,音频流等对应的TS分组的PID
ES_info_length              : 该节目相关原始流的描述符的信息长度。stream_type对应的类型:
**************************************************************************************************************************************
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值