介绍DVB-S码流_PAT_PMT_NIT_CAT

介绍DVB-S码流,PATPMTNITCAT

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


  关键词 机顶盒 MPEG-2 PSI节目专用信息 DVB-SI业务信息 电子节目指南

 

1 引言


  目前数字电视已经进入快速发展阶段,与数字电视相关的业务也将大幅度增长。当节目运营商将大量的节目信息通过有线网络提供给用户,用户在欣赏高质量节目源的同时如何才能方便快捷地找到这些业务或信息就成了开发者们需要解决的一个关键问题。电子节目指南(EPGElectronic Program Guide)正是为了方便用户对信息的获取而制作的运行于用户端综合接收解码器(IRDIntegrated Receiver Decoder)的应用程序,它通过电视屏幕向用户提供由文字、图形、图像组成的人机交互界面,负责电视节目和各种业务的导航[1]。用户通过电子节目指南,能够了解到节目的相关信息(包括节目时间、播放时间、内容梗概等),并且实现对节目的快速检索和访问。


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


2 电子节目指南信息的组成和传输


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


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


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


  一个EPG系统至少应该包括基本EPG信息[ 2 ]


  本文也仅就基本EPG信息进行论述。


数据广播业务信息规范NITBATSDTEITEMT表都被分成一个或若干个段(section)来表示,然后插入到TS包中。段是一种用来把SI信息表和EPG信息表映射为TS包的语法结构,这些信息符合GB/T 17975.1定义的专用段语法结构。段可直接映射到TS包中。段可能起始于TS包有效负载的起始处,但这并不是必须的,因为TS包有效负载的第一个段的起始位置是由pointer_field字段指定的[ 3 ]


3 MPEG-2 PSI节目专用信息与DVB-SI信息简介


  在数字电视中,所有的音、视频信号和数据信息经过编码后,在进入传输系统前,必须按照MPEG-2标准打包,形成固定长度的TS包,包长为188字节或204字节。对于这些长度相同的包,如果没有引导信息,IRD是无法找到所需要的码流的。为此在MPEG-2标准中专门定义了节目专用信息(PSIProgram Specification Information),其作用在于自动设置和引导IRD进行解码[ 4 ]


PSI信息由以下四种表组成:
1)节目关联表PAT;
2)节目映射表PMT;
3)网络信息表NIT;
4)条件访问表CAT


  在实际应用中,解码器IRD要对某一路特定码流进行解码时,首先要找到PAT表,根据PAT表找到所需的节目及该节目对应的PMT表的PIDPMT表中可能包含多个数字码流,每个码流都有一个唯一的PID与之对应。如果要解码的是视频码流,则在PMT表中找到video PID值,再从TS流中过滤出PID值与之匹配的TP包并送到视频解码器。


MEPG-2PSI信息提供了相关节目组成和相互关系的信息,从而使得接收端IRD可以对多路传输流进行解析,但是这些信息在实际应用中仍显得不够,它不能提供节目的名称、节目的开始时间、持续时间及节目的附加信息等。为此在DVB中扩展定义了SI业务信息。PSI信息基本上都是与现行流(ASActual Stream)相关的,而SI信息则可以包括不在现行流中的一些业务和事件信息,从而允许用户进行更多的选择和了解更多的其它业务信息。


  与PSI定义的四种表不同,SI中定义了9种表,其中构成基本EPG信息的最重要的表是网络信息表NIT、业务描述表SDT和事件信息表EIT
SI 表传送的信息都是通过描述符(descriptor)的形式给出的。


  每个描述符都以descriptor_tag(用于唯一标识descriptor的类型)和descriptor_length开始。不同的描述符用于描述不同SI表中承载的信息[ 6 ]


4 系统介绍


  本EPG系统是在STMicroelectronic公司所提供的机顶盒开发方案上实施的,其主控制芯片采用STi5518,内部集成有32位主CPU、专用DVB传输流解复用和解扰模块、MEPG-2音、视频解码单元、数字视频编码器及各种接口等。与之配套的软件开发平台选用的也是该公司开发的STLite/OS20嵌入式操作系统,支持多任务、存储器管理、进程调度、定时器管理等实时特性。该系统能实时接收用户通过遥控按键或前面板触发的交互信号,实现节目基本信息的浏览、节目列表的生成、节目之间的跳转以及节目预告信息的查询等。


5 系统设计及实现


5.1 EPG信息的存储结构


TS流里携带的EPG数据信息通过IRD接收以后都以树状链表的结构存储在PROG_INFO_STRUCTTRANSPONDER_INFO_STRUCT这样两个结构中。


  在本机顶盒有关节目操作的各项功能中,绝大部分都与节目数据库有关,比如自动节目搜索时,需要建立节目数据库,并为搜索到的节目在数据库中建立相应的数据单元,用于存储该节目的各种信息;在切换节目时,需要根据不同节目中音、视频数据的PID值从而选择不同的码流进行音、视频解码等。


  节目数据库主要来自PSI表的内容。


  在具体的软件实现过程中,节目数据库的建立主要通过ParsePAT()、ParsePMT()两个函数来实现。ParsePAT()函数调用的结果是得到有线传输系统中不同的节目PID,而ParsePMT则获取各个节目中音、视频码流的PID值。


5.2 节目跳转的实现


  系统响应用户在不同节目之间的切换时,需要将用户选定节目的音、视频码流从复用的多路节目码流中提取出来并分别送到音、视频解码器进行解码。它依赖于硬件可编程传输接口(PTIProgrammable Transport Interface)来实现。在系统生成的节目数据库结构中的stProgNo变量存储有转发器号TransponderId及节目的音、视频PID值。


5.3 事件信息的获取


  事件信息表EIT按时间顺序提供每个业务中包含的事件的信息。(这里的事件相当于传统意义上的节目,而业务则指的是提供节目源的某个电视台,如业务中央电视台-1”的事件新闻联播。)EIT包含两种不同类型的表,分别为EIT present/following(简称EIT p/f)和EIT ScheduleEIT-S)。EIT p/f给出了指定业务中当前和后一个事件的信息,而EIT-S则包含一周内或更长时间的节目预告信息。任何构成EITevent information section均在PID0x0012TS包中传输,它给出了业务中事件的名称、事件开始时间、持续时间及其他一些信息。


以下以EIT p/f为例来讲述事件信息的获取方式:


EIT p/f中,每个业务service都用两个section分别来描述当前(present)和后续(following)信息,其中的section number0 的用来描述当前事件,而section number1section则用来描述后续事件。


  在节目信息结构PROG_INFO_STRUCT中,定义了EVENT_INFO_BASIC类型的二维数组event_info_database[2]用来存放一个业务中的presentfollowing事件的信息。这些信息包括事件的名称、事件的开始时间、事件的持续时间。


  事件的日期和时间在TS流里是按照MJDModified Julian Date,修正的儒略日期)+ UTCUniversal Time Co-ordinate,通用时间坐标)的格式并以16进制的形式给出的。在MJD+UTClocal MJD+local time之间的转换可参照GY/Z174-2001来进行。如TS流里的数据为0xCE1F 0056 0001 0600,则转换以后得到的信息为:该事件的播出时间为200358日,星期四,开始时间为005600,持续时间为010600


  而事件的名称则通过解析描述符short_event_descriptor来实现。并将得到的信息存储在event_info_database结构中。


  所有解析得到的信息最终都将存储在节目数据库中,提供给显示模块直接调用。


6 结束语


  真正完整意义上的EPG的功能是十分强大的,它不仅能提供节目表单和当前节目播放等基本功能,还可提供节目预定和家长分级控制等高级功能。本文从实用的角度给出了一个基本EPG系统的实现方案。另外我们也实现了EPG交互式应用中的SI增值业务如天气预报、新闻、股票数据等的接收,以菜单触发的形式提供给用户一个由文本和图形组成的反馈信息。

 

======

2 数字电视的电子节目指南(EPG)及其系统
   数字电视由于传输数字化,多种业务可以混合在一起通过一个信道传输。因此,数字电视已经不是单一的电视业务,而是指通过电视传输通道传输的数字业务,包括 视频、音频、图像、数据等。全球数字电视已经进入快速发展阶段。可以预见,在今后几年,与数字电视相关的业务将大幅度增长。随之而来的问题是,当数字电视 能为用户提供数倍于目前节目量的节目及多种业务时,用户怎样才能便捷地找到所要的节目和信息呢?电子节目指南(EPG)显然是必不可少的工具。
        电子节目指南给用户提供一个容易使用的、界面友好的、可以快速访问节目的一种方式,用户还可以通过该功能收看一个或多个频道,甚至所有频道近期将播放的节 目。同时,EPG可提供分类功能,可以帮助用户浏览和选择各种类型的节目。当然电子节目指南对业务提供商也有很重要的意义。
   数字电视的信息
   1、节目说明信息
        在数字电视中,所有的信息和信号,包括视频、音频、文字、图片等经数字化后都变成了数据。数据在传输前要按照有关标准(一般是MPEG-2)打包,形成固 定长度的传送(TS)包,MPEG-2TS包长为188字节,然后再通过网络快速传输到目的地。对于这些长度相同的TS包,如果没有引导信息,接收端解 码器是无法找到需要的码流的。因此,在MPEG-2中专门定义了PSIPSI的作用是自动设置和引导解码器进行解码。 PSI由节目关联表(PAT)、条件接收表(CAT)、节目映射表(PMT)和网络信息表(NIT)组成,每个表分成若干段映射(变换)TS中传输。
   PSI的几个表包含了解码和重现节目所需信息,其主要作用是找到节目和要解压缩的码流。其中PAT是所有表的根,它的PID值为0。实际应用中,解码器要 对一特定码流解码时,首先要找到PAT。然后在PAT中找到所需节目(比如节目1),根据节目1相应的PMTPID(22),找到节目1PMTPMT中可能包括多个数字码流(包括视频码流、音频码流和数据码流),每个码流也有一个PID。如果要解码的是视频码流,则在PMT中找到视频码流的 PID54,再到TS中去找PID54的包,并把所有PID54的包送到视频解码器。在PAT中,节目0总是为NIT预留的。
       这里PID值是十进制的,在有关标准中分配的PID值是十六进制的,即用开头的值表示。如十进制的2254,在十六进制中分别是0×160×36
   2、业务信息
   PSI数据提供接收机能自动设置的信息,使之能对复用流中的不同节目流进行解码。但是PSI表不能提供有关业务和节目的识别信息。因此,DVB组织对 MPEG-2PSI进行了扩展,提供了不同信息种类的多种表格,称之为SISI是用来描述传送系统、传送内容和广播数据流时间表等数据,它帮助综合接 收解码器(IRD)自动调谐,给用户提供附加信息,使IRD能自动设置可供选择的业务。
   SI由业务群关联表(BAT)、业务描述表(SDT)、事件信息表(EIT)9个表提供,它们分成若干段映射到TS包中传输。
       在PSI中,网络信息表(NIT)的内容是专用的且未作规定,但在SI表中专门定义了NIT的语法和语义,扩展了NIT的数据格式,旨在提供更多有关物理网络的信息。
        与PSIPATPMTCAT不同的是,SI9个表在实际使用中并不都是强制性传送的。在实际(现行)传送系统中,NITSDTEITTDT 的传送是强制性的。在其它传送系统中,NITSDTEIT是可选传送的。BATRSTTOT在任何情况下都是可选传送的。STSITDIT则 是需要时才存在。
   
       除携带时间表信息的EIT外,所有的PSISI表都不能加扰,以免影响解码器正常工作。
       在实际应用中,节目播出前端将符合标准定义的PSISI表插入TS包,构成数字电视广播码流,传输给用户。接收端解码器根据PSI解复用和解码所需的码流,利用SI提供的数据构成各种功能的EPG。解码器根据包标识符(PID)和表标识符找到所需的码流和数据。
       在插入TS之前,PSISI表被分成一段或若干段。段是用来把PSISI变换为TS包的语法结构,其长度是可变的。EIT的段限长4096字节,其余PSISI表的段限长1024字节。每段包含以下元素:表标识符、表标识符扩展、版本号和当前/后续指示符。
   PSISI表分段映射到TS包后,带有相应的包标识符,用以指示TS包的性质。表标识符是为了标识段是属于什么表的。
   PSI表只能在确切知道节目是什么、在什么时间播出时才能找到要解码的码流,并不提供有关节目是什么、在什么时间开始等信息,也没有多种码流的选择信息。 在数字电视业务不断增加的情况下,用户在选择业务时会感到很不方便。如果能将用户所需信息有序组织起来,提供类似节目报、又能在电视机上即时浏览的功能, 将大大方便用户使用。EPG正好能起到这种作用。
       根据《数字电视广播业务信息规范》对EPG的要求,EPG应提供节目单和当前节目播放等基本功能,还可提供节目附加信息、节目分类、节目预订和家长分级控制等高级功能。
       在交互电视中,EPG更复杂,应能提供诸如节目内容背景资料、视角切换、天气预报、游戏等功能。
   EPG的这些功能均可通过SI提供的数据来实现。也就是说SI是实现EPG功能的前提。在SI表中,最重要的是NITEITSDT,利用这3个表中的数据就可以构造出功能不同的EPG
   3、网络信息表
       在PSI中定义的NIT的传送是可选的。在SI中,要求在实际(现行)传送流中,NIT的传送是强制性的。
   NIT指出了传送当前业务的物理网络信息及该网络的特性,例如业务是通过何种传送系统(卫星或地面或有线)传送的、传送系统的有关参数等。任一网络由独立分配的网络标识符值唯一标识。
   NIT主要携带网络标识符、网络名称和传送系统参数等信息。
       传送系统有两个标识,即网络标识符和原始网络标识符。当NIT在产生TS的网络上传送时,网络标识符和原始网络标识符取同一值。在原始网络标识符中的每个业务标识符都是唯一的。含于TS中的某个业务转移到另一传送系统时,网络标识符改变,原始网络标识符保持不变。
       卫星传送系统的参数有:轨道位置、轨道的东西标志、频率、调制方式、极化方式、符号率及前向纠错(FEC)内码。
       有线传送系统参数包括:频率、调制方式、FEC外码、符号率、FEC内码。 
       地面传送系统参数我国还未定义。
   NIT中提供的上述数据是供解码器自动搜索频道用的,也可以显示出来为用户提供参考数据。另外,还可以传输一些可选信息,如多语种提供网络名称、业务列表等。
   
   4、业务描述表
   SDT的每一个子表都对一个特定TS流中的业务进行描述。这些业务可能是实际TS流的一部分,也可能是其它TS流的一部分,可以通过不同的表标识符来区分。(业务如CCTV1)
   SDT可分成若干业务描述段,任何构成SDT的段都要由PID0×0011TS包传送。
   SDT提供业务所属的业务群、业务使用的加密系统、与其它业务的链接信息、该业务的准用国家、业务名称和业务提供者、业务是否允许NVOD,以及多画面的控制、实现交互式回传信道的电话号码和多语种业务名称等信息。
       为了更容易获得有关业务,一般遵循这样一些规则:对于实际TSSDT的传送是强制性的,而且在一特定TSSDT中,SI码流至少应列出该TS中的所有业务信息;其它TSSDT应当列出该TS的所有业务。
   5、事件信息表 (事件如新闻联播等)
   EIT按时间顺序提供每个业务中包含的事件的信息,其类型通过表识别符进行区别,见《数字电视广播业务信息规范》中的表2。任何构成EIT段均在PID0×0012的传送包中进行传送
       当前/后续事件信息表(EIT present/following)只包含给定业务中的当前和后续一个事件的信息,但在NVOD情况下可以有多于两个事件描述信息。而EIT Schedule(EIT-S)则包含一周内或更长时间的节目预告信息.
   EIT提供的信息包括:事件的标识号、起始时间、节目长度;播放状态、是否加密;事件的详细介绍;两段同样事件的时间偏移;事件多语种的简短介绍;节目限定的级别等。
       在所有PSISI表中,只有EIT的时间表可以被加扰。
   电子节目指南的构成
       根据NITSDTEITSI表提供的信息,可以构成各种各样的EPG,使用户能通过多种方式找到所要的信息。
       在数字电视系统中,对于电视台和用户来说,增加EPG功能是非常必要的,而EPG所需的信息正是由SI提供的。
        实际上SI表提供的各种信息是通过描述符来实现的。《数字电视广播业务信息规范》中的表12列出了描述符在SI表中最可能出现的位置,从中可以看到,同一 类信息允许出现在多个SI表中,而且表示的是标识符最可能出现的位置,并没有限制在其它表中使用该标识符;此外,SI表提供的各种信息并不都是强制性的。 这样就为EPG前端系统和SI编辑器的开发提供了较大的空间和灵活性,同时也表明EPG是一种定制系统,它的功能与节目业务提供商打算向用户提供什么样的 服务有关。
   EPG包含两个部分:一是播出前端的EPG编辑器;二是用户端数字电视接收机中相应的接收/显示/控制软件。两部分一一对应,如果一个厂家的接收机产品要 进入一个业已采用某种EPG前端产品(数据结构封装)的传输网络(用户群体),则必须按照前端定义的数据结构来改造其接收机的相关部分,从而接收显示前端 送出的业务信息。而在EPG前端编辑器中,根据所需的功能,将采用适当的描述符来提供有关的信息。
   EPG系统的组成
   EPG系统分为前端子系统和接收端子系统,前端子系统主要负责SI数据的组织和生成,一般来说,由一个专门的SI复用器(SI Server )来完成这部分工作,并把生成的SI数据与节目等的其它数据流进行系统层复用,在TS流中传输。
       接收端子系统主要负责SI数据的接收、解析等。
   
   综合接收解码器(Integrated Receive DecoderIRD)从接收的TS流中解析出SI数据,并在本地建立SI数据库,用户通过EPG界面与SI数据库进行交互。为了方便用户的随机接入, SI数据是重复发送的,有关它的重传速率在EN 300 468[1]中有详细的规定。接收端不停地接收、解析来自发端的SI数据,当发端的SI数据改变时,SI数据库更新,否则接收的SI数据被丢弃。
   
   EPG的应用程序运行于数字电视的机顶盒中,应用程序管理器负责EPG应用的管理,上层的EPG API屏蔽了下层的软硬件实体,使编写EPG应用程序时可以不考虑底层的具体实现,只需要调用相应的API函数,下层的DVB-SI API也是起同样的作用。下层的解复用模块接收TS流,解出DVB SI数据流,再经SI数据解析模块,生在SI信息表,存于本地数据库中,由DVB-SI API提供的接口向上层提供服务。
       国内外的EPG系统的实现方案,概括起来主要有以下两种:
        (1)本地应用方案:这种实现方案要求节目列表及详细信息作为业务信息的形式复用于MPEG-2传输层中,数据经信道传输后,在接收端的解码器对这些数据 进行解码,并在接收机RAM中形成专用的EPG数据库,EPG应用将检索数据库并根据用户输入的指令显示用户关心的节目信息。目前大多数厂商提供的EPG 采用该种实现方案。
       (2)交互式实现方案:这种实现方案首先要求数字电视机顶盒的软件系统中有中间件(以HTML引擎为例),在发送端的EPG服务器将把HTML页面的形式 组织,通过数据广播信道传输到机顶盒,机顶盒通过HTML引擎显示这些页面,如同在PC世界中的浏览网页。用户与EPG的交互分成两种形式,对于没有回传 信道的情况下,HTML页面通过Data Carousel发送,实现本地交互;而对于有回传信道的情况下,机顶盒将根据用户的输入从网络中获取新的所需页面。该方案以OpenTV为代表。
       上述两种实现方案都要求业务信息或HTML页面随着时间迁移或节目修改而做相应变更,对于本地应用和本地交互方案还要求数据有一定的重传率,以保证EPG的随机接入。
       比较上述两种实现方案,前者的EPG显示形式是由接收机中的EPG应用完全决定的,发送端只提供必须的信息条目,比较容易实现;后者的EPG显示形式完全由EPG服务器提供的页面决定,即由发送端决定。
   EPG系统的关键技术
        实现EPG系统主要有以下几个关键技术:发端的SI数据的组织和生成,接收端SI数据的接收和解析,接收端SI数据库的建立,EPG界面的显示等。其中有 些是用硬件实现,如SI数据的接收和解析;有些则用软件实现,如SI数据库的建立和EPG界面的显示。具体如下:
   1SI数据的组织和生成
        发端的SI数据的组织和生成,由发端的SI服务器(SI Server)完成这部分功能,接收端的SI解析与此功能相反,主要负责SI数据表的重建。SI数据的组织要符合DVB-SI中的语法定义和MPEG-2 的语法定义,同时要纵观传输网络中的所有业务信息。信息内容应与PSISI表中的信息相对应,它可按照Network-Transport Stream-Service-Event的分层顺序描述,同时内嵌Transport Stream-Program(Service)-Element Stream的分层顺序。
   
   2SI数据库的建立
   SI数据必须按照一定的数据结构进行存储,这样才能方便、快捷地对其进行检索和数据的提取。特别是对EPG系统,运行于机顶盒的实时操作系统中,需要对用 户的交互进行实时的动作。SI数据库建立的好坏对其性能有重要的影响。SI数据主要有:网络信息、传输流信息、业务(节目)信息,业务的事件信息等,并且 大量的信息都是通过描述子来传输的,所以可用树状链表来存储数据,构成从网络、传输流、业务、事件的树状结构,传送不同信息的描述子用继承于同一基类的描 述子类来表示。
   3EPG系统的显示技术
       当电视节目和EPG应用同时启动时,用户看到的可能是节目画面和EPG界面的叠加,用户所看到的电视画面从前到后可以分为三层,依次为图形层、视频层和背景层。
        这里的图形层也就是下面所说的OSDOn Screen Display)层,OSD界面显示技术指在图像画面上叠加文字显示,使屏幕为用户提供更多的附加信息。视频层为当前正在收看的节目(解码出来的活动图 像);背景层为没有播放电视节目和启动EPG菜单时的屏幕图像。EPG画面在图形层上构建,EPG画面是由许多EPG图形元素(如按钮、文本框、选择按 钮、组件容器等)叠加而成。界面的状态转移是通过消息驱动的机制来实现的,在消息响应函数中进行消息处理。见到的屏幕图像是这三层的叠加(blend)后 的图像。
   EPG界面显示的总体思想是:SI数据与图形元素分离。包括以下几部分:SI数据的检索与提取,EPG界面所需的图形元素库,状态转移控制器,OSD层绘 制引擎,OSD层图、视频层、背景层及这三层的Blend操作。SI数据检索模块快速的检索本地SI数据库,提供EPG界面当前输入焦点所需的数据信息; OSD层图形元素库提供界面所需的图形元素,该库存于本地机顶盒的ROM中;状态转移控制器接收用户遥控器的输入,提供当前显示所需的活动焦点,控制状态 转移地流向;OSD层图像是指EPG界面图形元素合成后的图像;OSD绘制引擎决定显示的相应算法,接收各模块提供的数据,完成OSD层图形的绘制,最后 是OSD层、视频层和背景层的blend操作。
数字电视的优势不仅仅是提供高质量的视频、音频节目,更重要的是采用数字化处理后,提供了业务的灵活性和多样性。其中电子节目指南,它描述节目的播出时间 和简要内容,可帮助观众方便快速地寻找自己感兴趣的节目。将为观众收看电视带来极大的帮助,因此。必须重视数字电视的电子节目指南系统的研究和内容的制作。

 

一、MPEG-2系统原理
                      第一章 MPEG-2简介
   什么是MPEGMPEG-2?
        MPEGMoving Picture Experts Group 的简称,MPEG-2MPEGISO组织设计的一个数字视频压缩规范,主要用于DVDDVB,当前的标准文档是ISO13818.
   什么是DVB?
   DVBDigtal Video Broadcast的简称,是欧洲所有国家和其他部分国家和地区使用的数字电视标准.其中美国的ATSC标准也是在DVB标准的基础上实现的.
   什么是TS码流和PS?
        TStransport stream的简称,就是传输流”.DVB数据广播采用的数据格式就是TS码流.
        PSprogram stream的简称,就是节目流”.DVD中采用的数据格式就是PS.
        这两种流的格式是不同的,TS格式具有很强的错误校正功能,适合传输,PS格式适合存储在媒体中. 在这里,着重描述的是TS码流格式.
   什么是PID?
        PIDPacket identification的简称,就是包标志符”.DVB系统把不同的数据打包成不同的数据包,用系统唯一的一个13 bits数字标志该数据的类型.例 如,PID=0x00表示是DVB系统中的PAT,PID=0x10表示是DVB系统的NIT.不同的节目(包括VideoAudio)分别采用 不同的PID,例如,我们在PMT表中如果检测到PID=0x0120PIDVIDEO数据,那么表示包号码是0x0120的所有包都是Video数 据,其他依此类推.
   什么是PAT?
        PATProgram Association Table的简称,节目关联表”.PAT属于DVB系统流中的一个包,包号码(PID)0x00.PAT表描述了DVB系统流中包含什么样的PID,主要是描述当前流的NIT表格的PID号码是多少,当前流中有多少个不同类型PMT,每个PMT表对应的频道号等信息.
   什么是PMT?
        PMTProgram Map Table的简称,节目影射表”.PMTPID 是服务器自由定义的(但不会和系统保留的PID冲突).这个PID是在PAT表中描述的,比如,如果在PAT表中有0x100项的内容,那么说明所有 PID0x100的包都是PMT.不同的频道有不同的PMT,也就是说,一个不同的PMT代表的是一个不同频道.PMT表格和PAT表格配合在一起, 就可以检测出DVB流中所有存在节目的所有PID,因此,数字电视搜台就是依靠这两个表格数据完成的.
   什么是CAT?
        CATConditional Access Table的简称,条件访问表”,PID0x01.CAT携带的是服务器的私有信息(CA系统就需要使用该表格实现节目的解密).
   什么是SDT?
        SDTService Description Table的简称,服务器描述表”,PID0x11.SDT携带的是电视台名称和电视节目名称.DVB接收系统接收SDT表中的节目信息,实现比较友好的界面显示和操作.
   什么是NITEIT?
        NITNetwork Information Table的简称,网络信息表”.
        EITEvent Information Table的简称,环境信息表”.
        NIT可以提供当前流的节目信息,也可以提供和当前流有关联的流的节目信息.
        EIT提供的是流节目信息的改变,比如一个节目已经开始,或者已经结束的信息等.
   什么是EPG?
        EPGElectronic Programme Guides的简称,电子节目指南”.该功能可实现预告近段时间即将播放的节目内容,同时支持基于内容的检索.
   什么是teletext?
        Teletext就 是我们常说的图文电视”,当然在MPEG-2,图文电视已经数字化,也就是说,图文信息已经做为数字化信息在TS流中传播.但最终,数字化的图文信息 都将转化为模拟的VBI信息插入到正常的电视信号中实现图文电视的显示.图文电视有很多标准,比如close caption,WSS,欧洲的DVB使 用的teletext标准是ITU-R System B Teletext规格.该规格支持欧洲多种语言,支持简单图象和文本的混合显示.
                      第二章 DVB系统的构成
   [本文不详细描述DVB系统的硬件构成,只是根据ISO13818中的描述,详细解释TS码流的格式和解复用原理.(够了,够了 呵呵)]
   DVB的分类
   DVB根据应用的不同,主要分为DVB-S,DVB-C,DVB-T,DVB-H等多种规格.不同的规格基本原理都是相同的,不同的主要是调制方式不同:
    DVB-S,SSatelite的首字母,应用于数字电视卫星广播,调制方式是QPSK.
    DVB-C,CCable的首字母,应用于城市有线广播.调制方式是QAM所有格式: 16QAM,32QAM,64QAM,128QAM,256QAM.
    DVB-T,TTerrestrial的首字母,应用于陆地无线广播,调制方式是QPSK或者16QAM64QAM.
    DVB-H,HHandheld的首字母,应用于手持无线广播,调制方式和DVB-T相同.
    总 的来说,不同的DVB系统只有前端系统是不同的,最终的数字信息都是相同的,也就是都是采用ISO13818描述的规格.前端系统主要是指调制方法和发射 方法等.因此,这里所叙述的内容,全部适用于所有的DVB系统,同时因为美国的ATSC系统也是在DVB系统上的小量更改和小部分功能增加,因此也适用于 ATSC标准.
    基本系统描述如下:
    (1)编码系统:
    假 设信号源有6个节目,DVB系统先对这6个节目的所有数据(Video,Audio)进行压缩处理,然后经过一个叫做"复用"的程序进行节目的复用 (PID分配,即对6个节目分别分配不同的PID号码)形成叫做"PES"的包,然后再经过TS流处理程序,把这些PES包全部封装成TS码流格式,最后 把获得的TS格式的数字信号经过调制(实现的是频率的复用),然后经过D/A转换成模拟信号,再次调制成高频信号,经传输系统发送出去.
    (2)解码系统
    接 收系统接收到高频信号,先转化为中频信号,然后再经过一个高速的A/D转换成数字信号,接着经过一个反调制程序,这样就得到了TS码流. TS码流进入一 个称为"解复用"的程序,该程序实现自动分析TS流中的表格信息,读取所有可用的PID信息等,然后提取一个用户指定的PID(用户选择的节目),把该节 目的数字信号全部接收而忽略其他不需要的信号,然后Video,Audio信号分别进入不同的解压缩程序,分别对Video,Audio信号进行解压缩和 显示,如果该节目包含了TeletextEPG,也有可能同时处理TeletextEPG,并且把处理的结果和Video信号一起叠加到屏幕上.
   Packet的概念
    (1)TS流是基于Packet的位流格式,每个包是188字节或者204字节(一般是188字节,204字节的格式仅仅是在188字节的Packet后部加上16字节的CRC数据,其他格式是一样的),整个TS流组成如下所示:
     
   
    Packet 1   Packet 2     Packet n
   在实际使用中,因为TS流已经内部具有很强的错误处理能力,所以一般使用较多的是188字节一个包的格式,204字节一个包的格式据说一般在高清节目中使用较多.
    所有的Packet格式都是统一的,包括一个Packet headerPacket datas.其中Packet header包含了同步字节(该字节固定是0x47,表示这个包的数据开始是正确的),Packet的唯一号码(PID)和其他一些信息.格式如下(C格式表示)
   typedef struct
   {
    unsigned sync_byte:8;/*8 bits的同步字节*/
    unsigned transport_error_indicator:1;/*1 bit的错误指示信息,1表示当前Packet至少有1bit的传输错误,0表示所有数据都正确*/
    unsigned payload_unit_start_indicator:1;/*负载单元开始标志,请参考ISO13818-1了解该标志作用*/
    unsigned transport_priority:1;/*1 bit的传输优先级标志,1表示高优先级,0表示低优先级*/
    unsigned PID:13;/*13 bitsPacket ID号码,唯一的号码对应不同的包*/
    unsigned transport_scrambling_control:2;/*2 bits的加密标志,00表示没有加密,其他表示已被加密*/
    unsigned adaptation_field_control:2;/* 2 bits的附加区域控制,请参考ISO13818-1了解该标志作用*/
    unsigned continuity_counter:4;/*4 bits的包递增计数器*/
   }PACKET_HEADER;
   以上结构刚好占用32 bits,4个字节,因此一个TS流的Packet头部的4字节是header信息,分析该header信息就可以知道当前Packet的属性.剩下的184字节有可能是Video数据,也有可能是Audio数据,也有可能是DVB SI信息,怎 么区分呢?其实很简单,就是利用header中的PID信息.上一章说了PAT是节目关联表,它的PID0x0000.这个PID就是对应这里 headerPID.换句话就是说,如果我们发现一个PacketPID等于0x0000,那么说明这个PacketDVBPAT表格而不是 Video数据或者Audio数据.
   实 际上,在信号编码成TS码流的时候,不同节目的Video,Audio等数据都分配了不同的PID.例如,一个节目有两路Video,三路Audio,那 么分配PID的时候可能是Video 1==0x100,Video 2==0x101,Audio 1==0x102,Audio 2==0x103, Audio 3==0x104,这样传输的TS码流中的PID就可能有以上的PID.因此,如果我们需要在程序中过滤出第一路Video和第二路 Audio就可以这样处理了(伪代码描述):
    void Process_Packet(unsigned char*buff)
    {
    int PID=GETPID(buff);/*从当前的188字节缓冲区中获取PID信息*/
    if(PID==0x100) /*PID等于第一路VideoPID,说明当前数据是Video数据*/
    {
      SaveToVideoBuffer(buff+4);/*header后部的数据存到Video缓冲区,待后部处理*/
    }
    else if(PID==0x103)/*PID等于第二路AudioPID,说明当前数据是Audio数据*/
    {
      SaveToAudioBuffer(buff+4);/*header后部的数据存到Audio缓冲区*/
    }
    else/*其他PID则丢弃,当然如果PIDDVB系统保留的PIDPAT,PMT则必须处理*/
    {
      printf("unknown PID!\n");
    }  
    }
   现 在的问题是,编码的时候分配好的PID,在解码的时候是怎么知道什么PID对应什么数据呢?这就是DVB SI表格的分析与处理了,请参考第三章.这里先 看一个实际的TS码流的例子.这里的数据是用UltraEdit16进制格式打开TS码流文件得到的.文件是Taiwan-551.ts.
   这 里仅仅截取了3Packet的信息,请注意图中用红色标注的部分,这就是TSPacket4个字节的头信息.这个TS流是采用每个包共188字节的 格式,因为两个头信息的间隔是188个字节(第一个0x47到第二个0x47的间隔).以后的所有的Packet都将是188字节的格式,这是 DVB TS标准规定的固定大小.那么这三个包分别包含的是什么数据,下面我们可以自己分析一下.
    先 看第一个包,头信息数据是"0x47 0x07 0xe5 0x12",刚才已经知道了,header信息都是按位操作的(这就是为什么TS码流也可以叫 做位流的原因),特别要注意的是定义和传输的时候都是MSB first,也就是说,先出现的位是数据的最高位.先转化成2进制格式:
    01000111 00000111 11100101 00010010
   请对照上面的PACKET_HEADER结构:
   typedef struct
   {
    unsigned sync_byte:8;
    unsigned transport_error_indicator:1;
    unsigned payload_unit_start_indicator:1;
    unsigned transport_priority:1;
    unsigned PID:13;
    unsigned transport_scrambling_control:2;
    unsigned adaptation_field_control:2;
    unsigned continuity_counter:4;
   }PACKET_HEADER;
   那么对照一下,我们可以发现:
    sync_byte=01000111,就是0x47,这是DVB TS规定的同步字节,固定是0x47.
    transport_error_indicator=0,表示当前包没有发生传输错误.
    payload_unit_start_indicator=0,含义请参考ISO13818-1标准文档
    transport_priority=0,表示当前包是低优先级.
    PID=00111 111001010x07e5,这代表是什么呢,暂时还不知道(实际上是Video PID,参考下图)
    transport_scrambling_control=00,表示节目没有加密
    adaptation_field_control=010x01,具体含义请参考ISO13818-1
    continuity_counte=00100x02,表示当前传送的相同类型的包是第3
   依此类推,再看一下第二个包"0x47 0x07 0xe5 0x13",2进制是01000111 00000111 11100101 00010011
    sync_byte=01000111,就是0x47,这是DVB TS规定的同步字节,固定是0x47.
    transport_error_indicator=0,表示当前包没有发生传输错误.
    payload_unit_start_indicator=0,含义请参考ISO13818-1标准文档
    transport_priority=0,表示当前包是低优先级.
    PID=00111 111001010x07e5,这代表是什么呢,暂时还不知道(实际上是Video PID,参考下图)
    transport_scrambling_control=00,表示节目没有加密
    adaptation_field_control=010x01,具体含义请参考ISO13818-1
    continuity_counte=00110x03,表示当前传送的相同类型的包是第4(注意到了吧,以上两个包的PID都是0x07e5,所以这里的continuity_counte就递增一次)
   第三个包是"0x47 0x07 0xf1 0x18",2进制是01000111 00000111 11110001 00011000.
    sync_byte=01000111,就是0x47,这是DVB TS规定的同步字节,固定是0x47.
    transport_error_indicator=0,表示当前包没有发生传输错误.
    payload_unit_start_indicator=0,含义请参考ISO13818-1标准文档
    transport_priority=0,表示当前包是低优先级.
    PID=00111 111001010x07f1,这代表是什么呢,暂时还不知道(实际上是Audio PID,参考下图)
    transport_scrambling_control=00,表示节目没有加密
    adaptation_field_control=010x01,具体含义请参考ISO13818-1
    continuity_counte=10000x08,表示当前传送的相同类型的包是第9
   请看解码程序<<Seekfor MPEG-2 decoder>>读取该文件的结果:
   
   上图我们可以发现,Taiwan-551.ts有一个节目叫"DIMO",它的Video PID0x07e5,Audio PID0x07e6
   还有一个节目叫"Service 1",没有Video PID,它的Audio PID0x07f1(说明是一个广播节目而非电视节目)
   这个数据刚好和我们刚才的分析是吻合的.
是我想大家还有疑问,为什么0x07e5代表Video PID,0x07e6代表其中一个Audio PID?这就是刚才提到的,这是TS流在编码的 时候就分配好了的.但是,在解码的时候是怎么知道0x07e5就代表的是Video而不是Audio?这就是第三章的内容:DVB SI/PSI分析和 处理.
文章出处:LCDHOME论坛网WWW.LCDHOME.NET 原文地址:http://bbs.lcdhome.net/read-htm-tid-38490.html

第三章 DVB SI/PSI分析和处理
   SISpecific Information的简称,PSIprogram Specific Information.该机制允许DVB传送各种各样的讯息,比如节目名称,电视台名称,各种PID,私有信息,甚至单独传送数据实现数据通信等.这些功能的实现都归功于SI/PSI.
    DVB 标准中,定义了一个标准的PID用来实现SI/PSI.这些PID是系统保留的,因此DVB编码的时候并不会用这些PID做为Video PID或者 Audio PID或者其他PID.在一个简单的解复用程序中,只需要提供处理PAT,PMT表格的程序即可实现解复用,当然如果需要更友好的界面和实现 更复杂的功能(如CA)则必须处理其他的SI表.在这里仅仅分析PAT,PMT,SDT表格,其他SI表格的分析,请参考ISO13818-1(MPEG-2系统层标准)EN300468(DVB SI标准)文档.
    DVB定义的SI保留的PID分别是:
   
   上表格的PID就是DVB保留的PID,分配的其他PID一定不会占用这些PID.解复用程序需要使用到的表格只有PAT,PMT,SDT,而CA应用还需要使用CAT,EPG应用还需要使用NIT,EIT,TDT,TOT等表格.所以在需要解复用的时候,伪代码需要这样写:
    void Process_Packet(unsigned char*buff)
    {
      int PID=GETPID(buff);
      if(PID==0x0000) /*这是PAT*/
      {
      Process_PAT(buff+4);/*处理PAT表*/
      }
      else if(PID==)/*Video 或者Audio*/
      {
      }
      else/*其他不支持的PID*/
      {
      printf("Unknown PID!");
      }
    }
    所 有的表格都开始于Packet中的184字节的数据部分,但有的时候一个表格没有184字节,这时在Packet中就可能插入一些无效信息用来填充使整个 Packet依然保持是188字节.也可能用头信息中的payload_unit_start_indicator标志表格有个偏移位置(当 payload_unit_start_indicator=0表示表格数据直接从Packet区的第四个字节开始,否则表示有一个偏移量位置开始,具体 请参考ISO13818-1,4字节到偏移量间的数据是系统填充的无效数据).
    下面针对解复用程序详细分析一下PAT,PMTSDT三类表格的格式.
   PAT, Program Association Table,节目关联表
    PAT表携带以下信息:
   (1) TS流ID--- transport_stream_id,该ID标志唯一的流ID
   (2) 节目频道号-- program_number,该号码标志TS流中的一个频道,该频道可以包含很多的节目(即可以包含多个Video PIDAudio PID)
   (3) PMTPID--- program_map_PID,表示本频道使用的哪个PID做为PMT的PID,因为可以有很多的频道,因此DVB规定PMTPID可以由用户自己定义.
   PAT表定义如下:
   
   各字段含义如下:
    table_id:8 bits,标志本表格的类型,应该是0x00
    section_syntax_indicator:1 bit,段语法标志,应该是'1'
    '0':固定的'0',这是为了防止和ISO13818Video流格式中的控制字冲突而设置的.
    Reserved:保留的2bits,保留位一般都是'0'
    section_length:12bits的段大小,单位是Bytes.
    transport_stream_id:16bits的当前流ID,DVB内唯一.(事实上很多都是自定义的TS ID)
    version_number:5bits版本号码,标注当前节目的版本.这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.
    current_next_indicator:1bit:当前还是未来使用标志符,一般情况下为'0'
    section_number:8bits当前段号码
    last_section_number:8bits最后段号码(section_numberlast_section_number的功能是当PAT内容>184字节时,PAT表会分成多个段(sections),解复用程序必须在全部接收完成后再进行PAT的分析)
    for()开始,就是描述了当前流中的频道数目(N),每一个频道对应的PMT PID是什么.解复用程序需要和上图类似的循环来接收所有的频道号码和对应的PMT PID,并把这些信息在缓冲区中保存起来.在后部的处理中需要使用到PMT PID.
    CRC_32:本段的CRC校验值,一般是会忽略的.N是一个变量,计算方法是N=(section_length-9)/4.
    从以上分析我们可以发现,PAT表主要包含频道号码和每一个频道对应的PMTPID号码,这些信息我们在处理PAT表格的时候会保存起来,以后会使用到这些数据.例如我们可以定义这样的数据结构保存这些信息:
    typedef struct
    {
    int channel_number;/*频道号*/
    int pmt_pid;/*对应channel_number频道号的PMTPID*/
    }PMT_ITEM;
    PMT_ITEM pmt[64];/*定义最多64个频道,这个结构在分析PAT表格的时候会更新*/
   PMT, Program Map Table,节目影射表
    如果一个TS流中含有多个频道,那么就会包含多个PID不同的PMT.检测是否PMT的伪代码如下:
    void Process_Packet(unsigned char*buff)
    {
    int I;
    int PID=GETPID(buff);
    if(PID==0x0000)/*PAT表格*/
    {
      Process_PAT(buff+4);
    }
    else if(PID==..)/*Video PID或者Audio PID*/
    {
    }
    else
    {
      /*在这里检测PID是否是PMTPID*/
      for(i=0;i<64;i++)
      {
      if(PID==pmt.pmt_pid)/*PID等于在PAT检测到的PMT PID相同*/
      {
      Process_PMT(buff+4);/*说明当前PacketPMT,进入处理*/
      break;
      }
      }
    }
    }
   PMT表中包含的数据如下:
   (1) 当前频道中包含的所有Video数据的PID
   (2) 当前频道中包含的所有Audio数据的PID
   (3) 和当前频道关联在一起的其他数据的PID(如数字广播,数据通讯等使用的PID)
   PMT定义如下:
   
   各字段含义如下:
    table_id:8bitsID,应该是0x02
    section_syntax_indicator:1bit的段语法标志,应该是'1'
    '0':固定是'0',如果不是说明数据有错.
    reserved:2bits保留位,应该是'00'
    section_length:16bits段长度,program_number开始,CRC_32(包含)的字节总数.
    program_number:16bits的频道号码,表示当前的PMT关联到的频道.换句话就是说,当前描述的是program_number频道的信息.
    reserved:2bits保留位,应该是'00'
    version_number:版本号码,如果PMT内容有更新,version_number会递增1通知解复用程序需要重新接收节目信息,否则version_number是固定不变的.
    current_next_indicator:当前未来标志符,一般是0
    section_number:当前段号码
    last_section_number:最后段号码,含义和PAT中的对应字段相同,请参考PAT部分.
    reserved:3bits保留位,一般是'000'.
    PCR_PID:13bitsPCR PID,具体请参考ISO13818-1,解复用程序不使用该参数.
   reserved:4bits保留位,一般是'0000'
   program_info_length:节目信息长度(之后的是N个描述符结构,一般可以忽略掉,这个字段就代表描述符总的长度,单位是Bytes)
   紧接着就是频道内部包含的节目类型和对应的PID号码了.
   stream_type:8bits流类型,标志是Video还是Audio还是其他数据.
   reserved:3 bits保留位.
   elementary_PID:13bits对应的数据PID号码(如果stream_typeVideo,那么这个PID就是Video PID,如果stream_type标志是Audio,那么这个PID就是Audio PID)
   reserved:4 bits保留位.
   ES_info_length:program_info_length类似的信息长度(其后是N2个描述符号)
   CRC_32:32bits段末尾是本段的CRC校验值,一般忽略.
   从以上的分析可以看出,只要我们处理了PMT,那么我们就可以获取频道中所有的PID信息,例如当前频道包含多少个Video,共多少个Audio,和其他数据,还能知道每种数据对应的PID分别是什么.
   这样如果我们要选择其中一个VideoAudio收看,那么只需要把要收看的节目的Video PIDAudio PID保存起来,在处理Packet的时候进行过滤即可实现.
   比较全面实现解复用的伪代码如下:
   int Video_PID=0x07e5,Audio_PID=0x07e6;/*一般是在PMT检索后由用户自己设置这两个全局值*/
   void Process_Packet(unsigned char*buff)
   {
    int I;
    int PID=GETPID(buff);/*获取当前PacketPID*/
    if(PID==0x0000)/*0x0000表示是PAT*/
    {
    Process_PAT(buff+4);
    }
    else if(PID==Video_PID)/*Video_PID相等,说明当前Packet是一个Video Packet*/
    {
    SaveToVideoBuffer(buff+4);/*保存到Video缓冲区*/
    }
    else if(PID==Audio_PID)/*Audio_PID相等,说明当前Packet是一个Audio Packet*/
    {
    SaveToAudioBuffer(buff+4);/*保存到Audio缓冲区*/
    }
    else
   {
    for( i=0;i<64;i++)
    {
    if(PID==pmt.pmt_pid)
    {
      Process_PMT(buff+4);
      Break;
    }
    }
   }
   
   }
   以上伪代码可以实现基本的解复用:检测所有的频道,检测所有streamPID,选择特定的节目进行播放.只要读取每个Packet188字节的内容,然后每次都调用Process_Packet()即可实现简单的解复用
文章出处:LCDHOME论坛网WWW.LCDHOME.NET 原文地址:http://bbs.lcdhome.net/read-htm-tid-38490.html

 

介绍到这里,我们就可以总结一下DVB搜台的原理了.(!洗耳恭听!)
    机 顶盒先调整高频头到一个固定的频率(498MHZ),如果此频率有数字信号,COFDM芯片(MT352)会自动把TS流数据传送给MPEG- 2 decoder. MPEG-2 decoder先进行数据的同步,也就是等待完整的Packet的到来.然后循环查找是否出现PID== 0x0000Packet,如果出现了,则马上进入分析PAT的处理,获取了所有的PMTPID.接着循环查找是否出现PMT,如果发现了,则自动进 入PMT分析,获取该频段所有的频道数据并保存.如果没有发现PAT或者没有发现PMT,说明该频段没有信号,进入下一个频率扫描.
    从以上描述可以看出,机顶盒搜索频率是随机发生的,要使每次机顶盒都能搜索到信号,则要求TS流每隔一段时间就发送一次PATPMT.事实上DVB传输系统就是这么做的.因此无论何时接入终端系统,系统都能马上搜索到节目并正确解复用实现播放.不仅仅如此,其他数据也都是交替传送的.比如第一个Packet可能是PAT,第二个Packet可能是PMT,而第三个Packet可能是Video 1,第四个Packet可能是Video 2,
   只要系统传输速度足够快(就是称之为"码率"的东东),实现实时播放是没有任何问题的.
    到这里虽然实现了解复用,但可以看出,使用的PID都是枯燥的数字,如果调台要用户自己输入数字那可是太麻烦了,而且还容易输入错误,操作非常不直观,即使做成一个菜单让用户选择也是非常的呆板.针对这个问题,DVB系统提出了一个SDT表格,该表格标志一个节目的名称,并且能和PMT中的PID联系起来,这样用户就可以通过直接选择节目名称来选择节目了.
   SDT, Service description section,服务描述段
    SDT可以提供的信息包括:
   (1) 该节目是否在播放中
   (2) 该节目是否被加密
   (3) 该节目的名称
   SDT定义如下:
   
   各字段定义如下:
    table_id:8bitsID,可以是0x42,表示描述的是当前流的信息,也可以是0x46,表示是其他流的信息(EPG使用此参数)
    section_syntax_indicator:段语法标志,一般是'1'
    reserved_future_used:2bits保留未来使用
    reserved:1bit保留位,防止控制字冲突,一般是'0',也有可能是'1'
    section_length:12bits的段长度,单位是Bytes,transport_stream_id开始,CRC_32结束(包含)
    transport_stream_id:16bits当前描述的流ID
    reserved:2bits保留位
    version_number:5bits的版本号码,如果数据更新则此字段递增1
    current_next_indicator:当前未来标志,一般是'0',表示当前马上使用.
    original_netword_id:16bits的原始网络ID
    reserved_future_use:8bits保留未来使用位
    接下来是N个节目信息的循环:
    service_id:16 bits的服务器ID,实际上就是PMT段中的program_number.
    reserved_future_used:6bits保留未来使用位
    EIT_schedule_flag:1bitEIT信息,1表示当前流实现了该节目的EIT传送
    EIT_present_following_flag:1bitsEIT信息,1表示当前流实现了该节目的EIT传送
    running_status:3bits的运行状态信息:1-还未播放 2-几分钟后马上开始,3-被暂停播出,4-正在播放,其他---保留
    free_CA_mode:1bits的加密信息,'1'表示该节目被加密.
    紧 接着的是描述符,一般是Service descriptor,分析此描述符可以获取servive_id指定的节目的节目名称.具体格式请参考 EN300468中的Service descriptor部分.分析完毕,则节目名称和节目号码已经联系起来了.机顶盒程序就可以用这些节目名称代替 PID让用户选择,从而实现比较友好的用户界面!
    下面参考一下<<Seekfor MPEG2 decoder>>中的界面和显示信息.
   
   上 图是<<Seekfor MPEG2 decoder>>打开三个不同的码流文件(*.ts)形成的PID信息和节目名称.用户 可以通过切换节目名称的下拉列表框切换节目,也可以通过"视频流""音频流"下拉列表框切换VideoAudio!这些数据都是通过分析PAT, PMTSDT得到的.
文章出处:LCDHOME论坛网WWW.LCDHOME.NET 原文地址:http://bbs.lcdhome.net/read-htm-tid-38490.html 

 

 

第四章 Teletext原理
   欧洲采用的Teletext 标准叫做"ITU-R System B Teletext",标准文档是EN300472EN300706.该标准支持以下特性:
   (1) 24X40的文本字符显示,也支持简单的图象信息的显示.
   (2) 支持多页码,应用程序可以自由切换到任意选定的页.
   (3) 支持多语言,可以在teletext中指定所使用的语言.
   (4) 文本支持自定义背景色,自定义前景色.支持长度,宽度加倍(double width,double height)
   (5) 所有数据采用了奇偶校验和汉明码编码,具有比较强的错误处理功能.
   (6) 格式基本兼容模拟TTX,支持VBI插入teletext数据.
   Teletext数 据是在TS流中和Video,Audio数据一起传送的.EN300472规定采用以下方法识别teletext数据的PID:如果PMT段中的 stream_type==0xbd(private_stream_1),那么这个数据流就是teletext或者subtitle数据(统称为VBI 数据,具体区分还需要在teletext分析中处理),VBI数据开始于PES包的数据部分.
    TeletextPES包中的格式如下:
    各字段含义:
    data_identifier:数据标志符,如果是teletext必须等于0x10~0x1f.
    data_unit_id:用来标志是teletext数据还是subtitle数据.0x02表示是teletext,0x03表示是subtitle.
    data_field()是标准的teletext格式的数据包,参考下图.实际上,一个data_field就是teletext的一行数据.
    data_field()的格式如下:
    各字段含义如下:
    reserved_future_use:2bits保留未来使用
    field_parity:1bit的奇偶标志,'1'表示是偶数场(下半场),'0'表示奇数场(上半场)
    line_offset:5bits,VBI插入时指定的场线数据.(以上两个参数在使用VBI硬件插入才需要使用)
    framing_code:8bits的帧同步代码,必须是0xe4.
    magazine_and_packet_address:16bits,指定当前传送的杂志号码和包号码,采用的是汉明8/4编码.
   其中的包号码(Packet address)实际上代表的是TTX页面的行号码(0-24).
    data_block:320bits,40Bytes的数据块,全部采用奇偶校验,对应TTX页面的40,范围是0x00-0x7f(最高位是奇偶校验位).把这部分的数据全部提取出来,就可以获得一个行的全部数据(TTX24X40).
    因此,teletext的软件一般采用这样的流程:
   (1) 分析PMT,获取代表teletextPID,标注为TTX_pid;
   (2) 在解复用程序中过滤PID==TTX_pid的数据,解出PES的数据部分.
   (3) 把第二步得到的数据部分全部保存到一个缓冲区,直到所有的数据全部缓冲完毕.
   (4) 解出packet address,该数据代表当前的行号(0-24).如果是0,则本个data block包含的是主页面代码和
   子页面代码.如果不是0(1-24),则说明data block是对应页的列数据(40个字节的ASCII),把这些数据解出保存到缓冲区.(这里必须和PID过滤一样,过滤主页面号码和子页面号码,即没有选择的页面忽略掉)
   (5) 循环第(4)步直到所有的列数据全部解出.
   (6) 把缓冲区中的24X40的数据显示出来.一般是在RAM中定义一个unsigned char TTX_DATA[24][40]数组保存.
   Teletext是如何支持自定义前景色和背景色等特性的呢?实际上非常简单,就包含在每一行数据的40个字节中.我们知道可显示ASCII的范围是0x20~0x7f,小于0x20的代码在teletext中做为控制字符(需要在显示程序中处理),具体规定如下:
    0x00-0x07:设置前景色,颜色分别是黑,,绿,,,洋青,洋蓝,(设置后生效,也就是说,显示程序遇到这些代码,在随后的显示中必须改变前景色到对应的颜色)
    0x08:开始闪烁功能,设置后生效.
    0x09:结束闪烁功能,设置后生效
    0x0a:BOX结束,设置后生效.
    0x0b:BOX开始,设置后生效.
    0x0c:正常象素大小,设置后生效.
    0x0d:宽度加倍,设置后生效.
    0x0e:长度加倍,设置后生效.
    0x0f:宽度和长度都加倍,设置后生效.
    0x10-0x17:设置马塞克颜色,颜色代码同0x00-0x07,设置后生效.
    0x18:以后固定是显示空,直到遇到其他颜色属性.设置后生效.
    0x19-0x1b:请参考EN300706标准.
    0x1c:设置黑背景色.设置后马上生效.
    0x1d:设置新的背景色,下一个字符指定背景颜色,代码同0x0-0x07.
    0x1e:保持马塞克功能,设置后生效.
    0x1f:取消马塞克功能,设置后生效.
   以 上所描述的控制字符作用范围仅仅是一行.也就是说如果遇到新行,则设置全部恢复默认设置,EBU teletext的默认设置是:黑背景色,白前景色,无 闪烁,BOX,正常的象素大小,无任何马塞克功能.因此,teletext的显示程序必须一个字符一个字符的分析数据,直到所有的数据全部显示完毕.
    实际上,EBU teletext使用了4个规格,包括V1.0,V1.5,V2.5,V3.5.V1.0只支持ASCII文本和基本属性,其他规格还支持简单图象和Objects,请参考EN300706获取更多的信息.
    EBU teletext格式使用了汉明编码方法,具体编码格式请参考EN300706.
    下面可以参考一下<<Seekfor MPEG-2 decoder>>中处理teletext的效果:
   (1) 菜单上的数字是主页面,下一级菜单是子页面:
   (2)teletext文字叠加在Video上的透明显示效果:
   (3)teletext文字叠加在Video上不透明的显示效果:
    (4)切换到其他页面的显示效果:
                      第五章 EPG原理
   EPG就 是"电子节目指南",相当于一个节目菜单的功能.在一个TS流中,可以提供当前流的所有信息,如频率,调制方式,频道号,所有节目的PID,名称等信息, 也可以根据需要提供其他相关联的TS(例如同一电视台同步播放的其他频率的节目信息)的信息.解码器接收这些信息,形成一个固定格式的菜单让用户选择需 要收看的频道或节目,这就是"EPG".不仅如此,EPG还可以对节目进行分类,比如节目可以是电影,也可以是新闻,这样,把属于电影的节目归在一起,把 属于新闻的节目归在一起,这样对用户来说检索节目就变得非常的方便.
    EPG的实现也归功于DVBSI信息.EPG功能相关的SINIT(网络信息表),EIT(环境信息表),SDT(服务描述表),BAT(群组关联表),TDT(日期时间表)TOT(时间偏移表).下面简单分析这些表所携带的信息

NIT,Network Information Table,网络信息表
    NIT提供如网络名称(相当于电视台名称),传输参数(如频率,调制方式等).这个表格一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考.
    NIT格式如下:
   
    各字段含义如下:
    table_id:8 bits标志,应该是0x400x41.table_id==0x40时候,这个NIT描述的是当前流的网络信息,否则描述的是其他流的网络信息(一般是电视台同步播放的其他TS流信息).
    section_syntax_incicator:1bit的段语法标志,应该是'1'
    reserved_future_use:1bit保留未来使用位,一般是'0'
    reserved:2bits保留位,一般是'00',这是防止控制字冲突而设置的.
    section_length:12bits段长度,network_id开始,CRC_32(包含)结束的字节总数.
    network_id:16bits的网络ID号码,DVB内唯一的一个号码,标志不同的电视台.
    Reserved:2bits保留意见位.
    version_number:5bits的版本号码,NIT内容有任何改变时,该字段会递增1(提醒解码器更新NIT信息).
    current_next_indicator:1bit的当前下次使用标志,一般是'0'
    section_number:8bits的当前段号码.
    last_section_number:8bits的当前段号码.
    reserved_future_use:4bits保留未来使用,现在应该是'0000'.
    network_descriptors_length:12bits网络描述符长度,单位是字节.
    descriptor():N个不同的描述符结构,一般是网络名称描述符,解码器在此获取当前的网络名称(即电视台名称)
    reserved_future_use:4bits未来保留位,当前应是'0000'.
    transport_stream_loop_length:12bits的字节总数,就是随后的循环的字节总数.
    transport_stream_id:16bits的网络ID
    original_network_id:16bits原始网络ID.如果original_network_id== transport_stream_id说明该TS流是直播节目,否则说明该TS流是转播节目.
    transport_descriptors_length:12bits的描述符长度,随后的N个描述符占用的字节总数.
    descriptor(),N个描述符,可以有多个连续但不相同的描述符号,如网络名称描述符,传输系统参数描述符,解码器分析这些描述符获取网络的不同信息.

 

CRC_32:整个段的CRC校验值,一般可以忽略.
   EIT, Event Information Table,环境信息表
    环 境信息表提供如下信息:节目段的标识号、起始时间、节目长度、播放状态、是否加密;指向特定信息的链接信息;节目段多语种的简短介绍;节目段的详细介绍; 两段同样节目段的时间偏移;基本码流类型,如视频的幅型比、伴音的类型、字幕的类型等;使用的加密系统;节目类型,如电影/戏剧、新闻、综艺、体育、少 儿、音乐、艺术、社会政治、文教等;节目限定年龄的级别;给出实现交互式回传信道的电话号码;为满足各节目段的码率而提供的缓存大小信息及私有数据等.
    环境信息表中提供了类似于广播电视报所提供的节目表的内容,在SI中,只有EIT才有可能被加密。根据EIT及其它表所提供的信息,可以出五花八门的电子节目指南。-如:按节目类型检索、按时间检索及对某类节目的锁定等.
    EIT表格定义如下:
   
    各字段定义如下:
    table_id:8bits的表ID,如果当前表是重现/跟随信息,table_id0x4e(当前流)0x4f(其他流),否则如果是时间段信息,table_id0x50~0x5f(当前流)或者0x60~0x6f(其他流).
    section_syntax_indicator:1bit的段语发标志符,应该是'1'
    reserved_future_use:1bit未来保留位,应该是'0'
    reserved:2bits的保留位,应该是'00'
    section_length:12bits的段长度,单位是bytes,service_id开始到CRC_32()结束.
    service_id:16bits的频道号,PMT中的program_number;
    reserved:同上.
    version_number:5bitsEIT版本号码.内容有更新则此字段递增1,表示需要更新EIT信息.
    current_next_indicator:1bit的当前下次应用标志,一般是'0'
    section_number:8bits当前段号码.
    last_section_number:8bits最后段号码.
    transport_stream_id:16bitsTSID.
    original_network_id:16bits的原始网络ID.
    segment_last_section_number:未知功能.
    last_table_id:未知功能.
    随后是NEvent的信息:
    event_id:16bits环境ID,流唯一数字.
    start_time:40bits的开始时间.UTC格式.
    duration:24bits的持续时间(节目长度),BCD格式.
    running_status:2bits运行状态,定义和PMT中的running_status相同.
    free_CA_mode:1bit的是否加密标志,'0'表示没有加密.
    descriptors_loop_length:12bits描述符总长度,单位Bytes.
    descriptors():N个描述符列表.
   TDTTOT提供的是系统时间信息,结构较简单,请参考EN300468文档!
   RST,Running Status Table,播放状态表
    RST提供的是TS流中的节目播放状态(是否正在播放等)的信息.
    RST格式定义如下:
   
    各字段含义如下:
    table_id:8bitsID标志,应该是0x71.
    section_syntax_indicator:1bit的段语法标志,应该是'1'.
    reserved_future_user:1bit未来保留位
    reserve:2bits保留位.
    section_length:12bits段长度,单位Bytes.实际就是随后的for()循环中所有的字节数目.
    transport_stream_id:16bitsTS ID,DVB内唯一.
    original_network_id:16bits原始网络ID.
    serviced_id:16bits节目号,PMT内的program_number相同含义.
    event_id:16bits环境ID,EIT定义.
    reserved_future_use:5bits未来保留位.
    running_status:3bits运行状态.0x01表示不在播放中,0x02表示即将播放,0x03表示播放被暂停,0x04表示正在正常播放,其他属于未定义状态.
    实 际上,以上标准SI表提供出的EPG信息是比较少的,实际上有用的EPG信息都是包含在描述符中,就是Table结构内部的descriptor()字段 中.DVB系统提供了很多标准的descriptor(),不同的描述符展示不同的信息.具体的描述符结构请参考EN300468.
    标准描述符简单介绍如下:
   (1) Bouquet name descriptor:组名称描述符,提供一个组的名称符号.
   (2) CA identifier descriptor:CA系统控制字描述符,提供CA的加密字.
   (3) Component descriptor:组件描述符号,提供系统内所有组件的名称等信息.
   (4) Content descriptor:内容描述符号,提供系统节目的内容信息(实现按内容检索功能)
   (5) Country availability descriptor:有效国家列表描述符号,提供该服务允许使用的国家名称列表.
   (6) Data broadcast descriptor:数据广播描述符,提供数据广播信息.
   (7) Data broadcast id descriptor:数据广播标志描述符号.
   (8) Cable delivery system descriptor:DVB-C传输系统参数描述符,提供DVB-C参数信息.
   (9) Satellite delivery system descriptor:DVB-S传输系统参数描述符,提供DVB-S参数信息.
   (10) Terrestrial delivery system descriptor:DVB-T传输系统参数描述符,提供DVB-T参数信息.
   (11) Extended event descriptor:扩展环境描述符号.
   (12) Frequency list descriptor:频率列表描述符,提供所有的频率信息.
   (13) Linkage descriptor:可连接描述符.
   (14) Local time offset descriptor:当前时间信息.
   (15) Mosaic descriptor:马塞克描述符.
   (16) Multilingual bouquet name descriptor:多语言代码组名称描述符.
   (17) Multilingual component descriptor:多语言组件描述符号.
   (18) Multilingual network name descriptor:多语言网络名称描述符.
   (19) Multilingual service name descriptor:多语言服务名称描述符.
   (20) NVOD reference descriptor:VOD点播参考描述符.
   (21) Network name descriptor:网络名称描述符.
   (22) Private data specifier descriptor:私有数据描述符.
   (23) Short smoothing buffer descriptor:传输速率描述符.
   (24) Service descriptor:服务器描述符,提供电视台名称和电视节目名称等信息.
   (25) Service list descriptor:节目列表描述符,提供所有的节目频道号和节目类型.
   (26) Service move descriptor:节目删除描述符.
   (27) Short event descriptor:短消息描述符.
   (28) Stream identifier descriptor:流标志描述符.
   (29) Stuffing descriptor:填充数据描述符.
   (30) Subtitling descriptor:子字幕描述符.
   (31) Telephone descriptor:电话号码描述符.
   (32) Teletext descriptor:图文信息描述符.
   (33) Time shifted event descriptor:时间消逝环境描述符.
   以 上描述符结构定义在EN300468,所有的描述符都插入到不同的SI表中,因此描述符的分析应该结合不同的SI表来进行.但是这种插入又是有规律的,NIT表只可能插入Terrestrial delivery system descriptor之类或者 Network name descriptor,绝对不可能插入Service descriptor!具体插入的什么描述符,只能通过描述符的第一个 字节descriptor_tag来判断.
    因 为EPG的实现是非常灵活的,不同的应用需要不同的EPG功能,因此在<<Seekfor MPEG-2 decoder>>中 没有加入EPG功能.然而实际上,EPG功能比较容易实现,但因为EPG错综复杂的SI,EPG功能之前还是需要仔细理清思路才能实现的.
   DVB码流中业务信息与电子节目指南
   怎样在众多的数字电视节目中快速地找到用户所需要的节目,是数字电视应用所要解决的问题。在DVB接收机中通常都使用电子节目指南(EPG)这一工具来达到快速查找节目的目的,生成EPG的数据来源于DVB码流中的有业务信息SI信息。
   在数字电视中,所有视频、音频、文字、图片等经数字化处理后都变成了数据,并按照MPEG-2的标准打包,形成固定长度(188个字节)的传送包,然后将这些数据包进行复用,形成传送码流(TS),通常一个频道对应一个TS流,一个频道的TS流由多个节目及业务组成。在TS流中如果没有引导信息,数字电视的终端设备将无法找到需要的码流,所以在MPEG-2中,专门定义了PSI信息,其作用是自动设置和引导接收机进行解码。PSI信息在复用时通过复用器插入到TS流中,并用特定的PID(包标识符)进行标识。
   MPEG-2标准中定义的节目信息PSI,是对单一码流的描述,由于系统通常存在多个码流,为了使使用者能在多码流中快速地找出自己需要的业务,在DVBMPEG-2PSI进行了扩充,在PSI四个表的基础上再增加了九个表,形成SISI是对整个系统所有码流的描述,描述系统传输内容、广播数据流的编排和时间表等的数据,它包括PSI信息。
   一、节目信息(PSI
   PSI由节目关联表(PAT)、条件接收表(CAT)、节目映射表(PMT)和网络信息表(NIT)组成,这些表插入到TS中传输。PSI指定了如何从一个携带多个节目的传送流中正确找到特定的节目,当接收机要接收某一个指定节目时,它首先从节目关联表中取得这个节目的节目映射表的PID值,然后从TS中找出与此PID值相对应的节目映射表,从这个节目映射表中获得构成这个节目的基本码流的PID值,根据这个PID值滤出相应的视频、音频和数据等基本码流,解码后复原为原始信号,删除含有其余PID的传送包。MPEG-2传送流的结构如图1所示。
   2PATPMT的关系及结构图。
   3CATNIT的结构图。
   从上面的几幅图中可知,要保证传送流能正常接收,在该流中至少有一个完整有效的PATCAT描述了节目的加密方式,它包含了节目的EMM识别PID,只有授权的解码器才能由CAT收到密钥,解码出相应的数据流。NIT包含节目的频道调谐参数、频率、符号率等物理传输网信息,这些信息使得接收机可以按照用户的选择以很少的延时或无延时地改变频道、调谐参数,正确地解码出TS。由于PSI数据的完整性十分重要,因此在每个PSI段中均需要加校验码。
   二、业务信息(SI
   PSI数据只提供了单个TS的信息,使接收机能对单个TS中的不同节目流进行解码,但它不能提供多个TS的有关业务和节目的类型、什么节目、什么时间开始等信息,因此DVB系统对PSI进行了扩展,提供了其它不同信息种类的多种表格,形成SI。在实用中,我们将SI所提供的数据通过有序地组织起来,生成类似节目报的形式,它能在电视机上即时浏览,这样将大大方便用户的使用,这就是电子节目指南EPG
   SI定义了不9个表
   1、业务群关联表(BAT):它提供了业务群相关的信息,给出了业务群的名称以及每个业务群中的业务列表。
   2、业务描述表(SDT):它包含了描述系统中业务的数据,例如业务名称,起始时间、持续时间等。
   3、事件信息表(EIT):它包含了与事件或节目相关的数据,EIT是生成EPG的主要表。
   4、运行状态表(RST):它给出了事件的状态(运行/非运行),运行状态表更新这些信息,允许自动适应切换事件。
   5、时间和日期表(TDT):它给出了与当前的时间和日期相关的信息,由于这些信息更新频繁,所以需要单独使用一个表。
   6、时间偏移表(TOT):它给出了与当前时间、日期和本地时间偏移相关的信息,由于这些信息更新频繁,所以需要单独使用一个表。
   7、填充表(ST):它用于使现有的段无效,例如在一个传输系统的边界。
   8、选择信息表(SIT):它仅用于码流片段中,如记录一段码流,它包含了描述该码流片段业务信息间段的地方。
   9、间断信息表(DIT):它仅用于码流片段,如记录的一段码流中,它将插入到码流片段业务信息间断的地方。
   这里值得一提的是,NITMPEG-2标准中未予以规定,而是由SI规定。
   以上这些表在传送流中以数据段的形式传送,不同的信息表在传送流中通过赋予不同的特定的PID来进行区分(如表1所示)。而具有相同PID的不同信息表则进行由表标识符TABLE ID来区分,在接收端通过查这些特定的PID来找到它们。这里说明一下,TS中有两种标识符,一种是包标识符,一种是表标识符。例如SI中的SDT的每一个表都对一个特定TS中的业务进行描述,这些业务可能是这个表所存在的TS的一部分,也可能是其它TS的一部分,这些SDTPID都是相同的,这时候我们就可以通过不同的表标识符来区分它们,从而识别出那一个表所描述的业务是那一个TS的。
   1
           PID   
   PAT        0X0000   
   CAT        0X0001   
   PMT        0X0002   
   NIT        0X0010   
   SDTBAT        0X0011   
   EIT        0X0012   
   TDTTOT        0X0014   
   
   SI中的各表在实际使用中并不都需要传送,其中NITSDTEITTDT是必需传送的,其它表则按照需要进行选择传送。
   三、电子节目指南(EPG
   DVB系统中,EPG可使用户方便、快捷、直观地找到需要的节目,根据《数字电视广播业务规范》对EPG的要求,EPG应提供节目单和当前节目播放等基本功能,还提供节目附加信息、节目分类、节目预订和家长分级控制等功能。EPG的这些功能均可通过SI来实现,也就是说SI是实现EPG功能的前提。在SI中,最重要的是NITEITSDT,利用这3个表中的数据就可以构成功能不同的EPG
   NIT的作用在上面已经说过,SDT的作用是提供对每个业务的描述,使用户能方便地了解每个业务的内容。对于每一个TS都有一个SDT与之对应。EIT实际上是一个节目表,对于每一个节目都存在一个独立的EIT
   EPG包含两个部分:一是播出前端的EPG编辑器;二是用户端接收机相应的控制软件,两部分一一对应,每个接收机的相关部分必须要按照前端定义的数据结构来定制,从而接收显示前端送出的业务信息。
   SI一般在复用器合成TS时插入,有3种插入方式。
   1、 将各表数据通过复用器厂家提供的应用软件接口由复用器插入到节目码流中。
   2、 将各表数据按MPEG-2标准打包,通过码流播出卡输出,再将之送入复用器的异步串行口与节目码流复用。
   3、 通过条件接收加扰器提供的接口插入,因此可通过局域网将数据表送入加扰器,由加扰器向码流中插入SI
文章出处:LCDHOME论坛网WWW.LCDHOME.NET 原文地址:http://bbs.lcdhome.net/read-htm-tid-38490.html

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值