一种适应HLS播放CMMB广播的码流转换机制

更新时间:2024-03-27 作者:用户投稿原创标记本站原创 点赞:6265 浏览:20287

【摘 要 】本文主要阐述了利用HLS协议播放CMMB广播中所涉及到的码流格式转换的实现机制.首先对相关的音视频格式及复用技术进行了介绍,主要涉及TS流,AAC音频格式封装,视频NAL格式封装等内容,然后介绍了本方案的具体实现方法,以及实现中的主要问题.

【关 键 词 】HLS CMMB 码流格式转换

一、概述

在目前移动电视业务中,存在多种不同的标准,如我国的CMMB,日本/美洲的ISDB-T,欧洲的DVBH/DVBT,其码流复用方式和传输的音视频码流格式均不同,如CMMB采用复用帧格式,ISDBT采用TS流,DVBH采用IP流等复用方式,其内部的音视频原数据的封装格式也存在很大差异,比如音频有ADTS和LATM,视频NAL单元和字节流等.针对这些不同的电视业务协议标准,如果在带电视信号接收芯片的功能机上,以前为了播放这些码流可以开发不同媒体流制式的电视.

但是随着智能手机的发展,人们越来越希望在不带电视硬件接收芯片的智能手机上观看电视广播业务,因此亟需发展一种移动电视接收数据卡,通过智能手机的wi-fi与之相连接,完成电视信号的接收,然后通过传输协议把电视码流传送到智能手机上进行播放,该方式简称WebTV,其示意图如图1所示.针对目前主流的智能手机操作系统android和ios,为了共同支持两个智能操作系统的手机,我们决定采用apple公司提出的HLS(Http LiveStreaming)标准协议进行wi-fi之间的码流传输,使用HLS方案来传输音视频流,终端使用支持HLS协议的进行播放码流,那为了支持多种不同电视业务标准,需要将不同电视标准所定义的码流格式,转换成HIS所支持的格式.

二、码流转换机制原理

在HIS传输协议规范中,规定了其支持的音频流格式为AAC和mp3,视频流格式为H264,采用TS流的复用方式,通过HTTP来传输,具体支持的情况如下:

mVideo:H.264 Baseline Level 3.0

Audio:HE-AAC or AAC-LC up to 48 kHz,stereo au-dio.封装格式为ADTS;MP3(MPEG-1 Audio Layer 3)8kHz to 48 kHz,stereo audio.

在WebTV应用中,所支持的CMMB电视业务码流格式为:

为实现WebTV通过HLS技术在android和ios操作系统的系列产品上应用,需要将CMMB的复用帧转换成TS流.在码流格式转换的具体实现中,涉及到视频Bit-stream格式封装和PES、TS流封装等内容.

MPEG-2系统中音视频流按照IS0/IECl3818-2和IS0/IECl3818-3标准进行编码压缩后得到ES包,ES包经过Packetizer封装成PES分组后,再对PES分组进行编码,与其它数据一起,合成单个或多个适宜于存储或传输的数据流.

MPEG-2系统中对传送进来的PES分组有两种编码方法:传送流模式(TS)和程序流(PS)模式,分别形成传送流(Transport Stream,TS)和程序流(PS).在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流.因此一般来说,PS流适用于存储而TS流适用于传送.

在MPEG-2系统中,除了音视频数据包的格式外,还定义了节目特定信息(Program Specific Information,PSI),PSI用来描述传送流的组成结构,提供使接收机能够自动配置的信息,用于对复用流中的不同节目流进行解复用和解码.

三、码流格式转换的具体实现

如上分析所述,在HLS协议规范中,通过HTTP传输的TS流对所适用的音视频格式有限制,所以,在电视业务中,在电视设备将码流接收下来后,需要作码流格式转换.

对于CMMB电视业务的复用帧,需要进行解复用处理,得到音视频帧ES流,而后需要对音频ES流进行ADTS封装,对视频数据进行NAL单元的封装,然后打包成PES包,最后组装成TS流发送给终端.

3.1 码流格式转换总体流程

在整体HIS方案中,设计成每10s的Ts数据打包成一个TS文件.在文件的头上,需要加上PMT表和PAT表,对于码流的播放PAT与PMT表是必不可少的.然后将每一个音视频Es数据,打包成TS包存入TS文件.如下图2为电视业务实现HIS方案的总体处理流程.

对于电视业务码流的接收和解复用处理得到音视频Es流的过程,其实现方式与打包顺序正好相反,故本文中不再介绍,下面主要对ES码流打包成TS文件,以实现HIS方案的过程进行详述.

3.2 TS流打包实现

3.2.1 PMT和PAT表

对于HIS方案,每10s音视频流分割为一个TS文件.所以在每次进行ES流处理开始时,会根据时间戳判断是否需要进行分割.因为音频时间戳分布较为均匀,所以方案中以音视频ES包为基准,每10s进行一次分割,重新生成TS文件.每个TS流文件,先写入PMT表和PAT表,在TS流的节目配置中,检测如该TTS流只有一套节目,其中包含2路音视频流:

音频信息为:PID为Oxll2,stream_type为0xof,具有ADTS传输句法的IS03EC 13818-7音频.

视频信息为:PID为Oxlll,stream_type为0xlb,I-TU-T H.264建议书IISO/IEC 14496-10视频中定义的C视频流.

按照PMT和PAT的字段格式,生成TS文件头的PMT和PAT数据包如下所示:

3.2.2 AAC音频的ADTS封装 在AAC的ADTS封装中,对ADTS固定头的主要参数设置如下:

ID(1bit):设置为1,表示MPEG-2 identifier;

Layer设置为0;

protection_absent:设置为1;

profile设置为1,表示Low Complexity profile (LC)AAC-LC音频格式;

aping_freuency_index:设置为0x6,表示采样率为24KHz;

channel_configuratio:设置为0x2,表示双声道.

在ADTS可变头中,主要有如下参数需要设置:

frame_length:音频的帧长度,根据输入进行设置;

adts_buffer_fullness:对于码率可变的码流,设置为0x7ff;

number_of_raw_data_blocks_in_frame:通过用输入音频帧数据长度除以1024得到,表示ADTS帧中有nllm-ber_of_raw_data_blocks_in_frame+1个AAC原始帧,为0表示有一个AAC数据块.

所以,可得到ADTS的数据头为如下:

unsigned char adtsHeader[7]等于

{0xff,0xf9,0x58,0x80,00,0xlf,0xfc};

然后根据输入音频ES数据长度对framejength参数进行设置即可.

3.2.3 CMMB视频NAL的重组

将CMMB码流进行解复用处理后,得到的视频流为去掉了字节流头标识的NAL单元.为重组成TS流,需要加上字节流头标识,即“00 00 00 01”.但是仅仅加了相关标识后,发现封装成的TS流无法播放出视频,对CMMB视频NAL单元进行分析,其包含有如下NAL单元:

IDR帧:帧头为0x65,nal uniLtype为5;

non-IDR帧:帧头为0x41,nal_unit_type为1;

序列参数集:帧头为0x67,nal_unit_type为7;

图像参数集:帧头为0x68,nal_unit_type为8;

填充数据:帧头为OxOc,nal_unit_type为1 2;

但是没有nal_unit_type为0x09的分割符NAL单元.所以除了加上字节流头标识外,还需要考虑加入分割符NAL单元.

按照NAL单元的顺序,见图3:

所以对于输入的CMMB视频ES流,需要判断其输入的类型,分别插入如下信息:

3.2.4 PES封装处理

将组装好的音频ADTS数据,以及视频NAL数据,则可以进行PES打包处理,参考PES包的结构,需要考虑如下参数:

streamjd(1B):

音频PES包为0xc0,表示ISO/IEC 13818-3 orISO/IEC 11172-3 audio:


视频PES包为0xe0,ITU-T Rec.H.262 l ISO/IEC1381 8-2 or ISO/IEC 1 1 172-2 video.

PES_packet_length(2B):音频可根据输入数据长度来设置,视频可以直接设置为0.

对于可选的PES头,由于需要加上时间戳,需要设置的参数PTS_DTS_flags(2bit)为“10”,表示将在PES头上都有PTS时间.PES_header_data_length设为Ox05,通过将音视频帧的时间戳按照PTS_DTS的格式加入,PES可选头中其它参数都置为0.

所以,可得到ADTS的数据头为如下:

unsigned char AudioPESHeader[14]等于{0x00,0x00,0x01,0xc0,0x00,0x00,0x84,0x80,0x05,0x00,0x00,0x00,0x00,0x00};

unsigned char VideoPESHeader[14]等于{0x00,0x00,0x01,0xe0,0x00,0x00,0x84,Ox80,Ox05,Ox00,0x00,Ox00,Ox00,Ox00};

然后仅仅需要根据输入音视频数据长度对PES_packeUength字段进行修改设置,将13bit的时间戳按照PTS格式设置即可.

在对CMMB码流进行PES打包时,需要将时间戳转换成PTS所定义的格式,并且由于CMMB时间戳单位为1/22500s,而Ts流中PTS的时间单位为1/90000s,所以在进行PES打包之前,如果是CMMB码流,需要将时间戳乘以4,再按照PTS的格式进行处理.

但是,在CMMB码流中,其音视频播放时间戳为32bit为,单位为1/22500s,如果换算成PES包的时间戳,需要乘以4,则会出现超过PTS时间戳的比特位数.

该处对音视频时间戳的处理时,会存在截断最高比特位的情况.目前从实验情况来看,这种截断处理对播放没有影响.

3.2.5 TS封装处理

将不定长的音视频PES包封装成TS流,其主要处理如下:

第一,按照184字节大小把PES包数据分成N个数据快,通常情况下,最后一个数据块可能不足184字节,本文中称之为剩余字节.

第二,对于PES包封装成TS包,主要有如下三种情况:

(1)对于184字节的数据快.直接装入TS包的载荷区,同时Adaptation_field_control字段设置为01,表示后续只有负荷无adaptation_field.如图3(1)所示.

(2)对于剩余字节为183字节的PES数据.Adapta-tion_field_control字段就设置为11,表示后续既有adapta-tion_field又有负荷.adaptation_field_length设为0,并且在adaptation_field_length字段后,就没有状态标志字段和状态标志解释字段.如图3(2)所示.

(3)对于这些剩余字节不足184的PES数据.Adap-tation_field_control字段就设置为11,表示后续既有adap-tation_field又有负荷.adaptation_field_length设为184-剩余数据字节数一1;并且在adaptation_field_length字段后,1Byte的状态标志字段设置为0,表明没有状态解释字段,在这些标志字段后是填充字节,填充了L-1个字节0xFF后,再插入剩余数据,这时的TS包结构如图3(3)所示.

第三,对于每一个PES包的第一个184个字节在打包成TS包时,payload_unit_start_indicator被设置为1,后面的数据在打包成TS包时该位被设置为0.

第四,对于Ts包头中的不连续指示器,传输优先级,传输加扰控制这些字段,本文都没有采用,设置为0.

通过如上进行码流格式转换后的Ts流,使用HLS协议传输至终端,终端根据HLS协议和Ts流格式进行解码播放.

四、总结

根据本文所述方法,在WebTV项目上,实现对CMMB电视业务格式码流的重封装,满足HIS标准的规定格式,可以顺利地在Iphone/Ipad等产品上播放,也可以在PC上多种支持HLS的上播放CMMB电视,并且在各产品上的播放质量和画面流畅清晰.