1.引言TPF FPT
数字图像通信的最广泛也是最常见的应用就是数字电视广播系统[1],与此对应的DVB标准的建立更是加速了数字电视广播系统的大规模应用。DVB标准选定ISO JIEC MPEG-2标准作为音频及视频的编码压缩方式,信源编码进行了统一,随后对MPEG-2码流进行打包形成TS流(transport stream),进行多个传输流复用,最后通过卫星、有线电视等不同媒介传输方式进行传输。
对多个传输流进行复用的意义在于复用后的传输流只占用一个物理的传输信道,传输流中的每个节目所占用的是传输流提供的虚拟信道。在解码器端,只需要一套固定的接收设备,对不同节目的选择只是在传输流中选择不同的原始码流,这大大简化了接收机的实现,节省了成本,提高了灵活性,而且根据该标准定义,解码器的系统时钟与调制解调器的时钟是完全独立的。这使得在实现这两个子系统彼此功能时是完全分开的,因此接口变得很简单。
在数字电视节目制作及发送时,对多路节目的复用,由于一般的计算机很难处理几十兆到几百兆码率的码流,所以,目前大部分的复用器都是用硬件实现的,但其价格昂贵[2,3]。然而,随着计算机速度越来越快,在多CPU的服务器上,完全能够实现多路节目的实时软件复用。与硬件复用相比,软件复用具有灵活性高,开发成本低的优点。在软件复用实现方案中,服务器从卫星电视或其它片源中实时采集TS流,经过分析和过滤将所选择的基本流复用成一路TS流,然后通过普通的TS流播出卡发送出去。论文分析多路TS流复用原理,针对TS流中的信息提取和节目专用信息PSI (program specific information)合成,及软件复用中的节目时钟参考PCR ( program clock reference)的修正等问题进行研究,提出了进行软件复用的具体方法,最后在Windows平台上设计并实现多路TS流的软件复用。
2.TS流的系统级复用
数字电视节目的复用包括两个阶段,对音/视频PES包的节目复用和对TS流的系统复用[4]。本文研究第二个阶段即TS系统级复用,将多个单路的TS流合成一个多节目TS流。数字电视系统级复用是数字电视系统的关键技术之一,其中数字电视节目专用信息PSI的提取和重构及系统层节目时间参考PCR值的修正,是复用器的两项关键技术。
基于MPEG-2的TS流多路数字电视节目TS流系统级复用原理如图1所示。当多路TS流复用成一路TS流时,首先将对各路TS流的PSI进行搜集并分析其码流,得到各路TS码流中相应的视频、音频、数据信息的码率、对各路节目的包标识PID, 数字电视节目专用信息PSI,节目时间参考PCR等信息进行处理,丢弃各路原有的PSI信息。当出现两路TS流中的PID发生冲突时,需要修改一路或者多路TS流中某一数据流的PID(即复用器需要对修改了PID的视频/音频包或其他数据包进行PID更新)。可以看到,无论是否出现PID冲突,复用器都需要重构PSI信息,其滤波的处理过程如图2所示。对不同节目的PID值进行修改后,与本地产生的这类数据重新整合为复用后新的PSI等系统级控制信息,同时插入符合DVB-SI规范的业务信息,并在携带有调整字段的TS包中,判断带有PCR标志位字段的值,如果该值为“1”,那么在该TS流离开复用器的时刻,需要对TS包中的PCR值做相应的修正或重新插入新的节目时钟参考,具体方法将在后面详细介绍。
3.TS流节目专用信息的提取与重构
数字电视节目专用信息PSI描述TS流的组成结构,在MPEG-2系统层中极为重要,一个有多路节目和私有数据的TS流,需要PSI信息将每一路节目的音视频对应起来[5]。PSI信息将TS流中的内容描述成一个树状的结构,如图3所示。在TS流中可以复用多个节目,每个节目又可以包含多个基本码流(通常是单个视频流、多个音频流)。DVB系统沿用MPEG-2的节目专用信息PSI来确定传输的节目和包标识PID的关系以及节目的组成结构等情况。PSI主要包括以下四个表:节目关联表(PAT: Program Association Table)、条件访问表(CAT: Conditional Access Table)、节目映射表(PMT: Program Map Table)、网络信息表NIT: Network Information Table),本文需要涉及到节目关联表PAT和节目映射表PMT。
由于TS流复用后的相关联内容发生了变化,因此要对PSI信息进行处理。PSI信息的处理包括PAT和PMT表的替换,PID的重映射,还有就是连续计数器的修改,虽然这不算PSI信息,但是这部分工作与PSI信息修改关系很密切,同时在实际的实现过程中可以同时完成。
复用后的流中有多路节目,原来每一路节目中的PAT和PMT都只有自身的内容,为此需要将PAT和PMT替换。首先根据输入流的数目和预占的频道号,在一开始动态生成PAT表,PMT表则在最初计算好,生成静态的PMT对应替换即可,同时根据每个PMT_PID找到实现计算好的PMT表,将其中的视音频PID找到,作为将要替换的视音频PID。之所以在一开始生成或者直接使用静态表是因为PAT和PMT有32位CRC,无法完成实时计算。
PMT表替换后,每一路流中原有的视音频帧的PID应与其对应替换的PMT表中的视音频PID保持一致,即需要进行PID重映射。 在传输流处理过程中,先分析每一个读入的TS帧,根据PID的不同,选择替换的内容,如果是PAT和PMT表,则整个TS帧替换,如果是视音频帧,则只替换PID,替换之后,应该对连续计数器加一。
需要注意的是,单路传输流的构成并不一样,有的传输流是一路音频一路视频,有的是一路视频两路音频;有的PCR的PID与视频的PID相同,有的则不同。所以,应该为每一种情况都准备一张PMT表,在新素材到来时,根据分析出来的PSI信息的情况,决定选用那一张PMT表。这样作虽然要创建很多静态表,增加了系统内存的占用,但是却能使程序简单化,易于实现,同时不用随时计算32位的CRC,提高了程序的稳定性。在素材文件切换时,如果PMT表需要发生变化,需要修改PMT表的版本号。
每一路流都有PAT,假使复用的路数为n,如果每一路的PAT都去替换,就会使得PAT表发送频率提升为原来的n倍。MPEG-2规定,PSI信息传送的频率每秒不低于25次,协议中只规定了下限,没有规定上限,虽然每一路都替换,并不违背协议,但是很多复用器和解码器在PSI信息过多的时候就会工作不正常,这是因为PSI信息的32位CRC校验很耗时,所以通常只替换其中一路的PAT,其余的都用空包代替。PSI信息合成具体流程如图4所示。
4.TS流的节目时钟参考值修正
在MPEG-2编码器中有一个系统时钟,该系统时钟用来生成一个共同的时序以便音频/视频能够正确地解码与播放,同时可以用来指示在采样瞬间系统时钟的瞬时值[6]。正是由于编码器中有共同的系统时钟,解码器中的时钟可以根据节目时钟参考(PCR)重新恢复,并通过时间标记的正确使用为解码器中操作的正确同步提供基准。
时钟处理和码率有很大的相关性,某个时间段的码率就是这段时间的数据量与时钟差值的比。为了防止在码率出现波动的时PCR时钟差值越界,导致解码器不能正常工作,复用后输出码率应该比所有单路节目的总码率稍大。在实际中,如果真的出现这种情况,为了避免所有节目不能正常播放,本文采取的方法是停掉其中某一路,这样降低输出总码率中的有效码率,保证其他节目正常播放。在这里需要说明的是,MPEG-2中TS流有两种,一种是恒码率流,一种是变码率流,本文研究的复用是针对恒码率流的复用。
根据MPEG-2标准,TS流中的PCR字段长度为48b, PCR也是另外一种时间标记,是编码器27MHz时基的42b采样值,解码器利用它来恢复系统时钟并进行恰当的解码操作,它有两个部分组成:一部分以本地参考时钟的1/300 (90kHz)为单位,称为program_clock_reference_base,为33b字段;另外一部分称为program_clock_reference_extension,是以本地参考时钟(27MHz)为单位的9b字段。
(2)
(3)
其中sysclkfre为系统时钟27MHZ。PCR的单位是1 /27M秒,分为两部分表示。实际编程中,当得到一个新的PCR值,用式(1)和式 (2) 得到PCR_base ( 33bit) 和PCR_ext ( 9bit)两部分,填入TS帧中。在输出码率恒定的情况下,每一个TS帧传输所用的时间△PCR值可以通过下式计算:
(4)
其中nCoderate为输出的总码率。△PCR就是每一个TS帧的时间刻度。
系统开始运行时,确定一个PCR的初始值,并为每一路申请一个计数器nCounter变量,计数在两个PCR帧之间的TS帧数,根据以下公式计算新的PCR值:
(5)
式中,PCR_old代表上一个PCR的值,PCR_new代表当前新PCR的值。在得到新的PCR值之后,用公式(1)(2)(3) 计算出PCR_base和PCR_ext写入帧中,同时PCR_old = PCR new,nCounter=0。 nCouter是对整个传输流而言的,不管TS帧是不是当前计算的这路TS的内容,或者空帧,nCounter都要累加。
在MPEG2协议中,PCR由PCR_base(33bit)和PCR_ext(9bit)表示,总共42bit,当PCR的值超过42bit所能表达的范围时,需要循环重新开始。由于PCR和PTS以及DTS的关系,在重新开始循环PCR的时候,一定要将PTS和DTS也重新回0,同时要将PCR帧中调整域中的discontinuity_indicator字段置1。
由于市场上的解码器千差万别,有的解码器中并没有为PCR留足42bit,在这种解码器中PCR通常会在解码器端被提前回0,而PTS和DTS并没有随之一起复位,这就会造成解码器的上溢,导致播放不正常。所以在实际中,本文判断PCR是否达到回0的阀值略低于42bit所能表达的最大值,这样会提高对解码设备的适应性,同时不会造成协议上的冲突。PCR时钟处理的具体流程如图5所示
5.TS流软件复用系统的程序设计与测试结果分析
通过对MPEG-2传输流应用结构的仔细分析,可以看出MPEG-2传输流所传送的只是彼此独立的原始流数据和把特定的原始流组合成一个节目的PSI信息,并没有传送一个不可分割的真正意义上的节目,因此在一定程度上保证了TS流软件复用程序的可行性。
所设计程序并不需要对组成节目的原始流进行内容的处理,不管构成某节目的原始流是音频还是视频还是私有数据,程序所要做的只是改动携带原始流的传输流分组的标记信息,并把它发送到输出的传输流,接着在复用后的传输流中也要发送该原始流所构成的节目的节目映射表。与此同时,需要注意的一点是,由于输入的各个传输流相互独立,它们为各自的节目分配的PID、节目号之类的标志信息很可能会发生重复的情况,所以对于原始流分组,并不能简单的转发,因此,程序将为各个传输流中的原始流分配新的PID,以及为不同的节目分配新的节目号,从而形成一个新的传输流。
程序结构如图6所示,图中的每一个TSProcessor对象对应着程序系统中的要进行复用的每一个输入传输流,TSProcessor对象所包含的输入模块负责向TSProcessor对象的处理函数提供传输流数据。传输流既可以从文件输入,也可以是内存中的一块缓冲区的数据。这样适合于复用实时转播的节目和存在本地硬盘上的节目。输出模块是一个供所有TSProcessor对象使用的全局对象,每个TSProcessor对象的线程轮流获得输出模块的控制权,向输出模块发送传输流分组数据。全局变量区存储所有传输流的结构信息,以及生成的传输流的相关信息。应用系统可以根据实际的需要随意的增减输入传输流的数目,输入方式,优先级,并且可以在复用的过程中随时插入新的传输流,或者删除掉某正在复用的传输流。
基于以上分析,应用VC++开发环境设计实现了TS流分析与复用软件系统TSAM (Transport Stream Analyzer and Multiplexer),主界面如图7所示。作者对复用系统进行设计和测试的硬件平台是奔腾M2.9G、512M内存。复用三路3M大小的传输流,大约使用了1秒的时间生成了大约8M字节大小的传输流,平均复用速率约为40Mbits。复用九路3M大小的传输流,大约使用了5秒的时间生成了大约30M字节大小的传输流,平均复用速率约为48Mbits。复用速率达到并远远超过了一路传输码流的处理速度,由于现代PC性能的强劲,得到了比较理想的试验结果。另一方面,由于复用系统的输入输出都是对文件操作,硬盘的读写速度对整个系统的性能也有影响。在实际的应用系统中,输入都是不断刷新的内存缓冲区,输出是输出模块的缓冲区,由于数据的操作都是在内存中进行,并不涉及硬盘等机械装置的运作,还会进一步提高系统的性能。
6.结论
本文分析了多路数字电视节目系统级复用原理,并对数字电视节目专用信息PSI的提取和重构及系统层节目时间参考PCR值的修正等关键技术进行研究,提出了进行软件复用的具体方法,最后在Windows平台上,应用VC++开发环境设计实现了TS流分析与复用软件系统TSAM,测试结果表明软件复用速率达到并远远超过了一路传输码流的处理速度,该软件复用方案是有效可行性的。用软件实现传输流的复用,可以节约硬件成本,降低系统的开发费用;且算法全部软件实现,可移植性高,具有良好的扩展性,可以方便灵活的加入数字电视节目指南等辅助信息。
大连捷成实业发展有限公司 http://www.dlunt.com