DVB搜台流程
流程图名词解释:
一、COFDM
COFDM(coded orthogonal frequency division multiplexing),即编码正交频分复用的简称,是目前世界最先进和最具发展潜力的调制技术。其基本原理就是将高速数据流通过串并转换,分配到传输速率较低的若干子信道中进行传输。
二、TS流
1.、TS流概述
(1)名字解释
- 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流的包格式。
(2)TS流的播放
播放前将TS流文件的后缀名该为.mpg或者.mpeg,用可以直接播放MPEG-TS流的播放器(一般的播放器都可以)打开播放即可。
(3)TS流的优点
- 动态带宽分配:由于TS的传输包长度是固定的,因此可过PID可以将规定的信道总频带在视频、音频和数据信息见进行实时的、灵活的分配。利用这一特性,可在广播付费节目前实时地将解密钥匙插入到TS流中送给广大用户。
- 可分级性:允许一个复用的传输码流与其他视音频基本码流进行二次复用,生产占用频带给宽的更高一级的TS流。
- 可扩展性
- 抗干扰性
- 接收机成本低廉
(4)TS形成过程
2、TS流传输包(简称TS包)结构分析
MPEG-2中规定TS传输包的长度为188 字节。但通信媒介会为包添加错误校验字节,从而有了不同于188字节的包长。例如:
DVB 规定中,使用204字节作为包长:
(1)通过调制器时,在每个传输包后增加了16 字节的里德所罗门前向纠错码,因而形成了204字节的数据包。调制后总存在204 字节的数据包。
(2)调制之前存复用器插入RS码或虚构的RS码。
ATSC规定中,使用208字节作为包长:添加20 字节的 RS(Reed-Solomon)前向纠错码。与DVB不同,ATSC规定RS码只能出现在调制的TS流中。
所有的TS包都分为包头和净荷部分。TS包中可以填入很多东西(填入的东西都是填入到净荷部分),有:视频、音频、数据(包括PSI、SI以及其它任何形式的数据)。
- TS包包头
TS包的包头提供关于传输方面的信息:同步、有无差错、有无加扰、PCR(节目参考时钟)等标志。TS包的包头长度不固定,前32比特(4个字节)固定,后面可能跟有自适应字段(适配域)。32个比特(4个字节)是最小包头。包头的结构固定如下:
因此有的包头可能不止32bit,那么又是如何区分的呢?原来是这个适配区捣的鬼!!
同步字节 | 传输错误指示 | 开始指示 | 传输优先级 | PID | 加扰控制 | 适配域控制 | 连续性计数器 | 适配域 |
8bit | 1 | 1 | 1 | 13 | 2 | 2 | 4 |
注意表里的数据是bit位数 typedef struct TS_packet_header { unsigned sync_byte : 8; 同步字节 unsigned transport_error_indicator : 1; 传输错误指示 unsigned payload_unit_start_indicator : 1; 开始指示 unsigned transport_priority : 1; 传输优先级 unsigned PID : 13; PID unsigned transport_scrambling_control : 2; 加扰控制 unsigned adaption_field_control : 2; 适配域控制 unsigned continuity_counter : 4; 连续性计数器 } TS_packet_header;
sync_byte (同步字节):固定为0100 0111 (0x47);该字节由解码器识别,使包头和有效负载可相互分离。 transport_error_indicator(传输错误指示): ‘1’表示在相关的传输包中至少有一个不可纠正的错误位。当被置1后,在错误被纠正之前不能重置为0。 payload_unit_start_indicator(开始指示):为1时,在前4个字节之后会有一个调整字节,其的数值为后面调整字段的长度length。因此有效载荷开始的位置应再偏移1+[length]个字节。原来有效负载是这样来的 transport_priority(传输优先级):‘1’表明优先级比其他具有相同PID 但此位没有被置‘1’的分组高。 PID:指示存储与分组有效负载中数据的类型。PID 值 0x0000—0x000F 保留。其中0x0000为PAT保留;0x0001为CAT保留;0x1fff为分组保留,即空包。 transport_scrambling_control(加扰控制):表示TS流分组有效负载的加密模式。空包为‘00’,如果传输包包头中包括调整字段,不应被加密。 adaptation_field_control(适配域控制):表示包头是否有调整字段或有效负载。‘00’为ISO/IEC未来使用保留;‘01’仅含有效载荷,无调整字段;‘10’ 无有效载荷,仅含调整字段;‘11’ 调整字段后为有效载荷,调整字段中的前一个字节表示调整字段的长度length,有效载荷开始的位置应再偏移[length]个字节。空包应为‘10’。 continuity_counter(连续性计数器):随着每一个具有相同PID的TS流分组而增加,当它达到最大值后又回复到0。范围为0~15。 适配域:
- PMT
PMT在传送流中用于指示组成某一套节目的视频、音频和数据在传送流中的位置,即对应的TS包的PID值,以及每路节目的节目时钟参考(PCR)字段的位置。
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; 注释: 这个结构体并没有显示缺省的bit,注意下面的两个缺省值 stream_type :0x1b // 8 reserved 0x07 // 3 elementary_PID :0x03 e9 // 13//该节目中包括的视频流,音频流等对应的TS分组的PID reserved :0x0f // 4 ES_info_length :0x000 // 12
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它指出该节目 对应于可应用的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 因为这个表一个section就够了,所以为0 unsigned last_section_number : 8; //固定为0x00 因为这个表一个section就够了,所以为0 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 reserved_5 : 3; //0x07 unsigned reserved_6 : 4; //0x0F unsigned CRC_32 : 32; } TS_PMT;