袁三男,王绍徐
(上海电力学院 计算机与信息工程学院,上海 200090)
数字电视[1]普遍采用MPEG-2压缩方式,MPEG-2标准中定义了两种复合信息流,即传送流(TransportStream,TS)和节目流(Program Stream,PS)。TS与 PS的区别在于TS的包结构是188字节固定长度,而PS流的包结构是可变长度的。
PS包与TS包在结构上的差异导致其对传输误码具有不同的抵抗能力,因而应用环境也有所不同。TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测后面包中的同步信息,从而恢复同步,避免了信息丢失。而PS包由于长度是变化的,一旦某一PS包的同步信息丢失,接收机无法确定下一包的同步位置,从而造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣、传输误码较高时,一般采用TS码流,而在信道环境较好、传输误码较低时,一般采用PS码流。由于TS码流具有较强的抵抗传输误码的能力,目前在数字电视传输中均采用了TS码流。PS是为在存储介质保存视频信息而开发的,因此当进行存储或传输环境好的情况下一般均采用PS格式。
从MPEG-2包流结构的剖析可以看出,TS和PS是可以互相转换的,并且在当前数字电视大发展的时刻这种转换工作是经常和必要的。笔者利用数字电视传输的TS流,针对TS流中PES(包基本流)包含整个GoP(图像组)的情况,进行了TS到PS的转换,按照不同的节目,将每帧图像而不是每个GoP分别构成一个PES,每个PES构成一个PS,使传输的TS流可以构成独立的多个PS节目进行存储或播放。针对该例,分析了构建PS流时的SCR(系统时钟参考),PTS(显示时间标签),DTS(解码时间标签)等,并提出了一种新的算法和实现方式。
TS流采用188字节长度的包为单位进行传输,目前流量一般为40 Mbit/s左右,数字电视采用MPEG-2编码,每套标清节目的流量一般为4~5 Mbit/s,因此数字电视的每个频点即每个TS流可复用8套节目,实际复用6套节目的比较多,如这里分析和转换的TS流为上海地区730频点的TS,它复用了6套,经分析得知,其6套节目分别是中央 1,2,5,6,3,4 套, 对应的节目标识号 PID 分别为 110(113),120(123),130(133),140(143),150(153),160(163),其中前一个为视频PID,括号中为音频PID,数字均用16进制。为了得到这些PID,需对TS流进行分析。下面介绍分析流程。
TS流格式为:TS头(4字节)和TS数据(184字节)。TS头为:同步(1字节)为 47,传输错误指示(1位),负载开始指示(1 位),传输优先级(1 位),PID(13 位),加密控制(2位),调整字段控制(2位),相同 PID TS 包计数(4位),共4字节。因此分析转换TS时首先必须找到同步头,然后按照不同的PID针对每个TS包进行不同的处理。搜索同步头的算法如图1所示。
图1 TS包同步头搜索算法
图1中分析TS包时首先需要进行TS的同步搜索,分成两个状态,即同步和同步丢失。当检测到连续5个同步字节时认为进入同步状态,在同步状态下连续未检测到3个同步字节认为同步丢失,进行TS包分析时必须处于同步状态下。图中处理188字节模块即是TS包的分析处理模块。
分析TS包时[2]必须找出其复用关系,先找PAT表,标准规定PID=0的包构成PAT表[3]。按照MPEG-2标准定义[3],PAT表中包含了每个PMT表的节目号及PID,针对本文分析的TS流,其PAT数据为47 40 00(PID为0)13 00 00 b0 25 00 01 df00 00(后面开始为节目号和PID)00 00 e0 10 00 65 e0 81 00 66 e0 82 00 67 e0 83 00 68 e0 84 00 69 e0 85 00 6a e0 86 a2 00 41 f4……由此可以得出各个节目号和对应的PID为:00-10(此为NIT表),65—81,66—82,67—83,68—84,69—85,6a—86(为 6个节目,对应节目号和相应的PID)。
得到PMT的PID后,可以按照标准的定义分析PMT表。以65号节目按PID=81为例,提取数据为:47 40 81(PID=81)12 00 02 b0 1d 00 65 c5 00 00 ff fe f0 00 02 e1 10 f0 00 04 e1 13 f0 06 0a 04 63 68 69 00 c8 a0 2a 90,PMT表中规定了每个节目的流类型和对应的PID,上述数据中02 e1 10 f0 00表示节目中有类型为2即视频流,PID=110;04 e1 13 f0 06表示节目中有类型为4即音频流,PID=113。因此,分析该节目的视频和音频时,只要提取PID为110和113的TS包即可。TS包的逻辑关系如图2所示。
图2 TS包逻辑关系
按照PID可分别从TS包中提取出各个节目的视音频。视音频按照PES组成,因此通过重新打包可以恢复PES。对于TS转PS,就是将恢复的PES重新按照PS的结构进行再打包,PS重要的参数为SCR,PTS,DTS等,其他参数在此不作讨论。
PTS和DTS位于PES层,主要用于视音频的同步。编码产生的视音频分别构成基本码流ES,它是不分段的连续码流,而PES是将ES分割成段并加上相应的头信息,在传输时将PES包再分段打成有固定长度188字节的TS流或可变长度的PS流。在TS流中TS包头加入了节目时钟参考PCR,解码器在解码时,首先利用PCR重建和编码器同步的27 MHz系统时钟,恢复系统时钟后,再利用PES流中的DTS和PTS进行音频与视频间的同步。在节目流PS包头中同样加入系统时钟参考SCR,它的作用与PCR相似,SCR也可以理解为解码器应该开始从磁盘读取数据的时间。PTS和DTS均为33位长,其单位是以27 MHz时钟的300分频即90 kHz得到,而PCR和SCR以27 MHz为单位,分两个部分,base为90 kHz为单位,ext以27MHz为单位。
对于音频而言DTS和PTS是一致的,对视频而言,如果编码时没有B帧,即没有后向预测,则是一致的,但有B帧时需作调整,因为I帧内部编码,P帧前向预测,只使用了前面帧的信息,而B帧双向预测,既使用了前面的IP帧信息,又使用了后面的IP帧信息,因此在解码时必须先解出后面的IP帧,再解当前的B帧,但显示时该B帧要比后面的IP帧提前,具体如图3所示。
图3中表示了各帧图像的时间相互关系,以B14为例,为了实现更有效的编码方法,采用双向预测运动补偿即B图编码,用前一帧I13和后面的帧P16作为参考图(双向预测的图如B15不作为别的预测参考图),因此解码时需先解I13,然后解P16,然后B14,而显示时按照I13B14B15P16的规律。以1个I帧和若干个BP帧为单位构成一个GoP,显然编码开始时的第一个GoP比其他GoP少了2个B帧。因为截取流的时候不一定正好从头开始,所以分析时从任意中间位置开始(可以搜索使得从I帧开始)。
对于完整的PES结构,以视音频为例,为:包开始码3字节(000001),流 ID 1 字节,PES 长度 2 字节,头标识 3字节,若有PTS则5字节PTS,若有DTS则5字节DTS……后部为其他的标识及数据。对TS转PS,需要修改的主要是PTS及DTS,以及增加的PS头信息,其余可以完全复制。
PS的结构为:包开始码4字节(000001BA),SCR 6字节,程序流速率3字节,填充数据,若有系统头部信息,则系统头开始码4字节(000001BB),系统信息,PES包数据。SCR意义如上所述,在解码端是一个很重要的参数。在TS转PS时,主要构造SCR信息,具体算法见下文。
TS流可以进行复用解复用[4]。为了实现TS到PS的转换,先从TS得到各个节目的PES,按照PES数据和相关算法得出新的PES的PTS和DTS,再构成PS。PTS和DTS之间的相互关系分析如图4所示。
图4 上海730 MHz频点中央电视台CCTV-1的DVB_C PES头信息
图中PTS和DTS均是以90 kHz为单位计数。可以得 出 如 下 关 系 :PTS1-DTS1=10 800=3×3 600,PTS2-DTS2=10 800=3×3 600,PTS2-PTS1=43 200=12×3 600,PTS3-DTS3=10 800=3×3 600,PTS3-PTS2=43 200=12×3 600,PTS4-DTS4=10 800=3×3 600,PTS4-PTS3=43 200=12×3 600。在PAL制式中每帧间隔为40ms,即3 600个90kHz时钟,因此可以得出,在该频点中,对于PID=0x110的TS包构成的PES包中,每个PES包头中的PTS均比DTS延迟3帧时间,而相邻两个PES相隔时间为12帧。
图5 PID=0x110的PES中原始TS包数据头信息
进一步分析PID=0x110的PES包中ES结构,如图5所示。
由图可以得出,在该流中的帧结构为IBB PBB PBB PBB,一个GoP为12个帧。整个12帧图像构成一个PES。
将该TS流转成PS流时,一帧图像构成一个PES包,一个PES构成一个PS包。为此,将原TS流中的PES的头部直接拷贝成为PS流中的PES的头部,该PES为GoP中的第一帧即I帧,其后的各B和P帧分别加上PES头及PS头组成PS包,PES的长度按照直接拷贝的数据量得到,PES的PTS和DTS,按如下算法计算:
1)程序开始时,取出TS流中新开始的一个PES,此即GoP,含有整个12帧的数据,将其按照帧开始标志划分为12个PES。
2)GoP开始数据为I帧,取出该PES的DTS值。
3) 对于I,B,P帧新购建的PES的 DTS和PTS,分别按照式(1)计算
按此算法得出的IBP的DTS和PTS与图3是一致的。
进一步分析可知,式(1)中的 PTSI,P的系数 3是由IBBPBB的格式引起的,即IP中间加了2个双向预测的B帧图像。而IBBPBB是最常用的一种方式。
对于构成PS包,令SCR_base=DTS-3 600,SCR_ext=0,由此即可构成PS包。
按照上述原理及算法,笔者针对输入的原始TS流,分析并修正了PES的参数,增加了PS头信息,实现了数字电视中的TS流转换成PS流,图6为实现框图。
图6 TS-PS转换流程图
笔者从数字电视出发,分析了TS和PS流结构及一些重要参数,按不同的应用将TS流转换为PS流,转换过程中对一些重要参数的修正和重建提出了一种算法,转换结果经多种解码器播放测试完全正确。
笔者提出的算法和程序既可在PC Visual C++6.0环境下运行,也可裁减到嵌入式系统中直接将收到的TS流实时转换成多个节目的PS流,并通过网络输出存储。
[1]卢官明,宗昉.数字电视原理[M].北京:机械工业出版社,2005.
[2]苏贝,张白愚,杨莉芸.DVB传送流的可视化分析[J].信息工程大学学报,2004(3):13-16.
[3]钟玉琢,王琪,赵黎,等.MPEG-2运动图像压缩编码国际标准及MPEG的新进展[M].北京:清华大学出版社,2002。
[4]侯旭柯,肖沙里,张流强,等.MPEG-2传输流多路复用的软件设计与实现[J].电视技术,2009,33(12):11-13.