一种统计复用传输流的方法

文档序号:7954259阅读:215来源:国知局
专利名称:一种统计复用传输流的方法
技术领域
本发明涉及一种统计复用传输流的方法。
背景技术
现在已经成熟应用的数字音视频编解码标准,如MPEG-2,以及近年出现的一批具有代表性的国际标准,如MPEG-4、H.264/MPEG-4 AVC(一种由ITU-T和ISO/IEC MPEG共同制定的视频压缩编码国际标准)、我国自主制定的标准AVS等,这些标准中都有一部分称为系统部分,这部分主要讨论了如何将单路或多路基本音频和视频流以及其他数据组合成适合于存储和传输的单路和多路复合流。传输流就是系统部分定义的一种数据流,它将具有一个或者多个不同时钟基准的一个或多个节目组成一个单一流,其速率可以是恒定的也可以是可变的。传输流是针对在那些可能会出现显著错误(往往表现为位差错或丢失分组)的环境中进行节目传输而定义的,例如卫星传输。
MPEG-2或者AVS传输流目前存在固定码率复用和统计复用两种方法,各路节目按照固定码率(Constant Bit Rate,CBR)独立编码然后再进行复用这种方法实现起来较简单,而且容易保证传输流的传输率的恒定,但是这种方法对MPEG-2或者AVS视频的可变比特率(Variable Bit Rate,VBR)的码流进行复用时,将会造成很大的带宽浪费,因为VBR编码固定量化因子,保证了图像的质量稳定,但是由于每一帧图像的运动量是不一样的,造成了输出码率变化比较大,使得复用变的复杂。统计复用能够很好的完成对VBR编码的视频码流的复用,它能够对多路节目取长补短,避免各路节目的码率同时达到最大或者最小的峰值,统计复用大大的提高了信道的利用率。
目前市场上存在一些知名公司研发生产的统计复用器,这类复用器多数是用硬件实现,而且在统计复用的过程中,都有和编码器通信的过程,即在一段时间内,检查输入的多路节目的码流的比特数,若超过一定的范围则要求编码器对这段时间的节目进行重新编码直到符合要求为止,这样的实现方法适合于编码和复用同时实现的状况,对于那种视频码流已经存在,要求将这些视频基本流复用成传输率恒定的传输流时,这种复用器就不能很好的完成统计复用,因为在码流不符合要求的情况下,它没有办法和编码器通信要求编码器重新编码。而目前传输流的统计复用方法中,大多数也是没有脱离编码器,不是面向已经编好的多路视频基本流文件进行统计复用的。

发明内容
本发明提供的一种统计复用传输流的方法,提供了一种简单高效的,完全脱离编码器,对视频基本流文件进行多路统计的方法,复用得到的传输流的传输率能够完全恒定。
为了达到上述目的,本发明提供了一种统计复用传输流的方法,其包含以下步骤步骤1、初始化;步骤1.1、初始化模块打开输入的视频基本流文件和音频基本流文件,获得文件中的码流的类型,其中视频类型为MPEG-2或者AVS(先进音视频编码标准,我国自主研发的视音频编码标准),音频类型为MPEG-1的layer 1(层1),layer 2(层2),layer 3(层3)或者AC-3(美国ATSC(AdvancedTelevision Systems Committee)中规定的数字音频压缩标准),或者AVS,同时获得每一路的视频和音频的一些基本信息;所述的基本信息包含以下视频方面的有图像的大小,帧速率,比特率等,音频方面有音频基本流的码率,采样率等;步骤1.2、初始化模块申请在做统计复用时内部使用的一些内存;步骤1.3、初始化模块根据要复用的传输流的传输率,以及预先设定好的在某一个时间段内对输入码流进行统计复用的这个时间长度,计算出在这一段时间内,传输流应该有多少个传输流包输出nPacket_salframe=(TS_BITRATE/(188*1000*8/ps->pict_duration))*SAL_frame_no;其中nPacket_salframe为在一定的时间段内,传输流要求输出的TS包的个数;TS_BITRATE为用户预先设定的传输流的传输率;
ps->pict_duration为传输流中视频基本流的帧速率的倒数,表示一帧数据的显示时间;SAL_frame_no为统计的一个单位;步骤2、统计输入文件信息;步骤2.1、统计输入文件信息模块统计视频文件每帧的大小,帧类型,并且根据该视频序列的帧类型,帧速率和每一帧在文件中的具体位置,计算出每一帧的PTS(Presentation Time Stamp显示时间标签);步骤2.1.1、判断frame_no<frame_no_max是否成立,若是,进行步骤2.1.2,若否,退出;其中,frame_no为视频帧的序号,表示该帧在视频基本流文件中是第几帧;frame_no_max表示该视频基本流文件中一共有多少帧;步骤2.1.2、判断F_T[frame_no]=I是否成立,若是,进行步骤2.1.3,若否,进行步骤2.1.4;其中,F_T[frame_no]表示第frame_no帧的帧类型,即该帧是I帧(帧内编码),B帧(双向帧间编码)或者P帧(预测帧间编码);步骤2.1.3、判断F_T[frame_no+1]=B是否成立,若是,进行步骤2.1.5,若否,进行步骤2.1.6;步骤2.1.4、判断F_T[frame_no]=P是否成立,若是,进行步骤2.1.7,若否,进行步骤2.1.9;步骤2.1.5、计算当前帧的PTS;F_PTS[frame_no]=frame_no*pict_duration;其中,F_PTS[frame_no]表示第frame_no帧的PTS;pict_duration为传输流中视频基本流的帧速率的倒数,表示一帧数据的显示时间;得到当前帧的PTS之后,输出结果,将帧序号加1,frame_no++,进行步骤2.1.1;步骤2.1.6、执行Count_B++,将Count_B的值加1,进行步骤2.1.7;
其中,Count_B表示一个I帧或者P帧和相邻的另一个I帧或者P帧之间有多少个B帧;步骤2.1.7、判断F_T[++frame_no]=B是否成立,若是,进行步骤2.1.6,若否,进行步骤2.1.8;步骤2.1.8、计算PTSF_PTS[frame_no-1-Count_B]=(frame_no-1)*pict_duration;输出结果,进行步骤2.1.9;步骤2.1.9、判断Count_B=0是否成立,若是,进行步骤2.1.1,若否,进行步骤2.1.10;步骤2.1.10、计算PTSF_PTS[frame_no-Count_B]=(frame_no-1-Count_B)*pict_duration;Count B--,将Count_B的值减1;输出结果,进行步骤2.1.8;步骤2.2、统计输入文件信息模块对于AVS的音频文件,统计其每一帧的大小,计算出每一个音频帧的PTS;ap->audio_frame[frame_no].audioframe_PTS=frame_no*(1024.0/pack_stream->ap->sr)*1000其中,frame_no为音频帧的帧序号,pack_stream->ap->sr为音频的采样率;步骤3、统计复用传输流;步骤3.1、统计复用传输流模块生成PSI(节目特定信息)信息表;根据输入的视频基本流和音频基本流的个数,生成传输流中的节目特定信息,如在MPEG-2或者AVS标准系统部分规定的节目关联表(PAT),节目映射表(PMT),网络信息表(NIT),条件访问表(CAT)和传输流描述表等;步骤3.2、预统计;统计复用传输流模块根据统计输入文件信息模块中得到的信息,对要进行统计复用的一段时间内的码流进行分析,估算这段时间内各路节目的比特数的大小,估计这些比特数能不能满足传输流的传输率的要求,并进行相应处理;
步骤3.2.1、计算这段时间内传输流中所有路节目的视频ts(传输流)包和音频ts包的个数的总和audio_video_packets;步骤3.2.2、计算时间段内传输流中的填充包的个数padding_packets_num;步骤3.2.3、判断padding_packets_num>0是否成立,若是,进行步骤3.3,若否,进行步骤3.2.4;步骤3.2.4、判断被统计的视频帧中是否还有B帧,若是,进行步骤3.2.5,若否,进行步骤3.2.6;步骤3.2.5、丢掉优先级最低的那路节目的一帧B帧,设置该帧的BP_throw_flag为1;这里,若某一帧的BP_throw_flag标志等于1,则表示在统计复用时要丢弃该帧;步骤3.2.6、判断被统计的视频帧中是否还有P帧,若是,进行步骤3.2.7,若否,进行步骤3.2.8;步骤3.2.7丢掉优先级最低的那路节目的一帧P帧,设置该帧的BP_throw_flag为1;步骤3.2.8、报错退出;步骤3.3、统计复用传输流模块判断是否有一路节目已经结束,若是,结束退出,若否,进行步骤3.4;步骤3.4、统计复用传输流模块打PES(Packetized Elementary Stream打包基本流)包;以帧为单位打包对于视频数据,是每一帧(I帧、P帧或者B帧)数据作为一个视频PES分组包的数据部分,对于MPEG音频数据,是将与一帧视频数据所对应的音频数据作为一个音频PES分组包的数据部分,MPEG音频PES分组这部分数据的大小一般是固定的,它与视频数据的帧速率和音频数据的采样频率,比特率以及音频数据的编码格式有关,对于AVS音频数据,每一帧数据作为一个音频PES分组包的有效负载;PES分组的数据部分再加上PES分组首部就形成了完整的PES分组包;PES首部包含了用于解码器同步重放的解码时间标签DTS(Decoding TimeStamp)和显示时间标签PTS(Presentation Time Stamp),PTS已经在步骤2计算得出了;
步骤3.5、统计复用传输流模块打TS包,计算PCR值;步骤3.5.1、视频PES包打TS包;步骤3.5.1.1、判断vp->v_packet_num% vp->pc_demand_perpackets_v=0(求余运算)是否成立,若是,进行步骤3.5.1.2,若否,进行步骤3.5.1.3;其中,vp->v_packet_num表示这路节目的视频包的序号;vp->pcr_demand_perpackets_v表示这路节目每隔几个视频包,会有一个视频包含有PCR信息;步骤3.5.1.2、判断length-nPesUsedByte<176是否成立,若是,进行步骤3.5.1.4,若否,进行步骤3.5.1.5;其中,Length是该视频帧的长度;nPesUsedByte表示这一帧视频数据中已经处理的字节数;步骤3.5.1.3、判断length-nPesUsedByte<184是否成立,若是,进行步骤3.5.1.4,若否,进行步骤3.5.1.6;步骤3.5.1.4、设置该PES包的adaptation_field_control=11;adaptation_field_length=184-(length-nPesUsedByte)-1;进行步骤3.5.1.7;其中,adaptation_field_control表示该TS包是否含有调整字段和有效负载;adaptation_field_length表示调整字段中的字节数;步骤3.5.1.5、设置该PES包的adaptation_field_control=11;adaptation_field_length=0X07;将PES包中的176个字节打入当前TS包的末尾176个字节中nPesUsedByte+=176;设置该PES包的pcr_flag=1;进行步骤3.5.1.1;其中,pcr_flag表示该TS包是否含有PCR信息;步骤3.5.1.6、设置该PES包的adaptation_field_control=00;
将PES包中的184个字节打入当前TS包的末尾184个字节中nPesUsedByte+=184;设置该PES包的pcr_flag=0;进行步骤3.5.1.1;步骤3.5.1.7、判断vp->v_packet_num% vp->pcr_demand_perpackets_v=0是否成立,若是,进行步骤3.5.1.8,若否,进行步骤3.5.1.9;步骤3.5.1.8、将PES包中的(176-(length-nPesUsedByte))个填充字节打入当前TS包中;进行步骤3.5.1.10;步骤3.5.1.9、将PES包中的(184-(length-nPesUsedByte))个填充字节打入当前TS包中;进行步骤3.5.1.10;步骤3.5.1.10、将PES包中的(length-nPesUsedByte)个字节打入当前TS包的末尾(length-nPesUsedByte)个字节中;输出nTsPacketNum;其中,nTsPacketNum表示该PES包一共打包成了多少个TS包;步骤3.5.2、音频PES包打TS包;因为音频TS包中不包含PCR信息,所以在将音频PES包打包成TS包的时候只需根据标准中规定的传输流的TS包的语法格式按照PES包的数据的顺序将它们写入TS包中即可;步骤3.5.3、计算PCR值;往pcr_flag等于1的视频TS包中填写PCR信息是在将每一路的音视频TS包,PSI信息包以及填充包均匀的写入输出文件中这些TS包写入输出文件过程中完成的,在完成将每一路的视频PES和音频PES打包成TS包后,就已经知道每一路的视频TS包和音频TS包的个数,还有PSI信息包和填充包的个数,这样就可以很方便的将这个时间段的这些TS包均匀的写入输出文件中,在写入的过程的要计算PCR,在某个复用时间段内,第TsNum包的PCR的计算方法如下
int64_t timestampll=(((nPacket_salframe*pcr_jisuan+TsNum)*188)/(TS_BITRATE/1000.0))*8.0;pcr=(int64_t)(timestampll*90.0+0.5);其中nPacket_salframe是步骤1中计算出来的,即根据要复用的传输流的传输率,以及预先设定好的在多长的一个时间段内对输入码流进行统计复用的这个时间长度,计算出在这一段时间内,传输流应该有多少个传输流包输出;pcr_jisuan表示是第几个时间段,每完成一个时间段的复用,该值自加1;TsNum表示该视频包在这个时间段内是第几个TS包;TS_BITRATE表示该输出的TS文件的传输率;步骤3.6、统计复用传输流模块判断是否所有的PES包都处理完了,若是,进行步骤3.1,若否,进行步骤3.5;步骤4、判断是否有一路输入文件处理完成,若是,结束退出,若否,进行步骤2。
本发明提供了一种统计复用传输流的方法,该方法是一种简单且效率高的统计复用传输流的方法,有以下几点优点1)该统计复用算法是在不与编码器进行通信的状态下,对视音频基本流文件进行多路统计的方法;2)可以有效的提高信道的利用率;3)可以使复用得到的传输流的速率完全恒定;4)视音频同步的算法简单,即计算PTS/DTS的方法简单;5)以帧为单位对基本数据流打包的方法使得解码器可以很方便的在PES首部的PES_packet_length(PES包长)这个信息中获得将要处理的一帧视频或者音频数据的大小,可以根据这个值很好的控制VBV_buffer(视频缓冲检测器缓冲区),使其既不上溢也不下溢;6)能够根据输入码流的特点和输出传输流的要求,在输入文件的瞬时码率太高的时候,按照输入文件的优先级,丢弃优先级低的B帧,P帧,直到输入文件的瞬时码率满足传输流的传输率的要求,这样处理的优点是,在输入码流的码率控制不是很完善的情况下,也能够完成多路节目的复用,并且复用出的传输流在播放时不会出现马赛克。


图1是本发明提供的一种统计复用传输流的方法的流程图;图2是本发明提供的一种统计复用传输流的方法的步骤2.1的流程图;图3是本发明提供的一种统计复用传输流的方法的步骤3的流程图;图4是本发明提供的一种统计复用传输流的方法的步骤3.2的流程图;图5是本发明提供的一种统计复用传输流的方法的步骤3.5.1的流程图。
具体实施例方式
以下根据图1-图5,具体说明本发明的一种较佳实施方式如图1所示,利用本发明提供的一种统计复用传输流的方法,将输入的10路AVS格式的视频基本流(码率为1.5M~2.0M)和10路MPEG格式的音频流复用成一个传输速率恒等于Trans_rate(例如Trans_rate=20Mbps)的传输流;步骤1、初始化模块;步骤1.1、解析输入的AVS的视频流和MPEG-2中的序列头,得到视频流的帧速率Frame_rate=25帧/秒;步骤1.2、申请在做统计复用时内部使用的一些内存;步骤1.3、根据输入的SAL_frame_No=5,ps->pict_duration=1000ms/25帧=40ms,得到这一段时间内,传输流应该有多少个传输流包输出nPacket_salframe=(TS_BITRATE/(188*1000*8/ps->pict_duration))*SAL_frame_no=(20000000/(188*1000*8/40))*5=2655;其中nPacket_salframe为在一定的时间段内,传输流要求输出的TS包的个数;TS_BITRATE为用户预先设定的传输流的传输率;ps->pict_duration为传输流中视频基本流的帧速率的倒数,表示一帧数据的显示时间;SAL_frame_no为统计的一个单位;步骤2、统计输入文件信息模块;如图2所示,步骤2.1、计算出每一帧的PTS(Presentation Time Stamp显示时间标签);步骤2.1.1、判断frame_no<frame_no_max是否成立,若是,进行步骤2.1.2,若否,退出;其中,frame_no为视频帧的序号,表示该帧在视频基本流文件中是第几帧;frame_no_max表示该视频基本流文件中一共有多少帧;步骤2.1.2、判断F_T[frame_no]=I是否成立,若是,进行步骤2.1.3,若否,进行步骤2.1.4;其中,F_T[frame_no]表示第frame_no帧的帧类型,即该帧是I帧(帧内编码),B帧(双向帧间编码)或者P帧(预测帧间编码);步骤2.1.3、判断F_T[frame_no+1]=B是否成立,若是,进行步骤2.1.5,若否,进行步骤2.1.6;步骤2.1.4、判断F_T[frame_no]=P是否成立,若是,进行步骤2.1.7,若否,进行步骤2.1.9;步骤2.1.5、计算当前帧的PTS;F_PTS[frame_no]=frame_no*pict_duration;其中,F_PTS[frame_no]表示第frame_no帧的PTS;pict_duration为传输流中视频基本流的帧速率的倒数,表示一帧数据的显示时间;得到当前帧的PTS之后,输出结果,将帧序号加1,frame_no++,进行步骤2.1.1;步骤2.1.6、执行Count_B++,将Count_B的值加1,进行步骤2.1.7;其中,Count_B表示一个I帧或者P帧和相邻的另一个I帧或者P帧之间有多少个B帧;步骤2.1.7、判断F_T[++frame_no]=B是否成立,若是,进行步骤2.1.6,若否,进行步骤2.1.8;步骤2.1.8、计算PTS
F_PTS[frame_no-1-Count_B]=(frame_no-1)*pict_duration;输出结果,进行步骤2.1.9;步骤2.1.9、判断Count_B=0是否成立,若是,进行步骤2.1.1,若否,进行步骤2.1.10;步骤2.1.10、计算PTSF_PTS[frame_no-Count_B]=(frame_no-1-Count_B)*pict_duration;Count_B--,将Count_B的值减1;输出结果,进行步骤2.1.8;步骤2.2、对于AVS的音频文件,统计其每一帧的大小,计算出每一个音频帧的PTS;ap->audio_frame[frame_no].audioframe_PTS=frame_no*(1024.0/pack_stream->ap->sr)*1000其中,frame_no为音频帧的帧序号,pack_stream->ap->sr为音频的采样率;如图3所示,步骤3、统计复用传输流模块;步骤3.1、生成PSI(节目特定信息)信息表;根据输入的视频基本流和音频基本流的个数,生成传输流中的节目特定信息,如在MPEG-2或者AVS标准系统部分规定的节目关联表(PAT),节目映射表(PMT),网络信息表(NIT),条件访问表(CAT)和传输流描述表等;如图4所示,步骤3.2、预统计;根据统计输入文件信息模块中得到的信息,对要进行统计复用的一段时间内的码流进行分析,估算这段时间内各路节目的比特数的大小,估计这些比特数能不能满足传输流的传输率的要求,并进行相应处理;步骤3.2.1、计算这段时间内传输流中所有路节目的视频ts(传输流)包和音频ts包的个数的总和audio_video_packets;步骤3.2.2、计算时间段内传输流中的填充包的个数padding_packets_num;步骤3.2.3、判断padding_packets_num>0是否成立,若是,进行步骤3.3,若否,进行步骤3.2.4;步骤3.2.4、判断被统计的视频帧中是否还有B帧,若是,进行步骤3.2.5,若否,进行步骤3.2.6;
步骤3.2.5、丢掉优先级最低的那路节目的一帧B帧,设置该帧的BP_throw_flag为1;这里,若某一帧的BP_throw_flag标志等于1,则表示在统计复用时要丢弃该帧;步骤3.2.6、判断被统计的视频帧中是否还有P帧,若是,进行步骤3.2.7,若否,进行步骤3.2.8;步骤3.2.7丢掉优先级最低的那路节目的一帧P帧,设置该帧的BP_throw_flag为1;步骤3.2.8、报错退出;步骤3.3、判断是否有一路节目已经结束,若是,结束退出,若否,进行步骤3.4;步骤3.4、打PES(Packetized Elementary Stream打包基本流)包;以帧为单位打包对于视频数据,是每一帧(I帧、P帧或者B帧)数据作为一个视频PES分组包的数据部分,对于MPEG音频数据,是将与一帧视频数据所对应的音频数据作为一个音频PES分组包的数据部分,MPEG音频PES分组这部分数据的大小一般是固定的,它与视频数据的帧速率和音频数据的采样频率,比特率以及音频数据的编码格式有关,对于AVS音频数据,每一帧数据作为一个音频PES分组包的有效负载;PES分组的数据部分再加上PES分组首部就形成了完整的PES分组包;PES首部包含了用于解码器同步重放的解码时间标签DTS(Decoding TimeStamp)和显示时间标签PTS(Presentation Time Stamp),PTS已经在步骤2计算得出了;步骤3.5、打TS包,计算PCR值;如图5所示,步骤3.5.1、视频PES包打TS包;步骤3.5.1.1、判断vp->v_packet_num % vp->pcr_demand_perpackets_v=0(求余运算)是否成立,若是,进行步骤3.5.1.2,若否,进行步骤3.5.1.3;其中,vp->v_packet_num表示这路节目的视频包的序号;vp->pcr_demand_perpackets_v表示这路节目每隔几个视频包,会有一个视频包含有PCR信息;
步骤3.5.1.2、判断length-nPesUsedByte<176是否成立,若是,进行步骤3.5.1.4,若否,进行步骤3.5.1.5;其中,Length是该视频帧的长度;nPesUsedByte表示这一帧视频数据中已经处理的字节数;步骤3.5.1.3、判断length-nPesUsedByte<184是否成立,若是,进行步骤3.5.1.4,若否,进行步骤3.5.1.6;步骤3.5.1.4、设置该PES包的adaptation_field_control=11;adaptation_field_length=184-(length-nPesUsedByte)-1;进行步骤3.5.1.7;其中,adaptation_field_control表示该TS包是否含有调整字段和有效负载;adaptation_field_length表示调整字段中的字节数;步骤3.5.1.5、设置该PES包的adaptation_field_control=11;adaptation_field_length=0X07;将PES包中的176个字节打入当前TS包的末尾176个字节中nPesUsedByte+=176;设置该PES包的pcr_flag=1;进行步骤3.5.1.1;其中,pcr_flag表示该TS包是否含有PCR信息;步骤3.5.1.6、设置该PES包的adaptation_field_control=00;将PES包中的184个字节打入当前TS包的末尾184个字节中nPesUsedByte+=184;设置该PES包的pcr_flag=0;进行步骤3.5.1.1;步骤3.5.1.7、判断vp->v_packet_num % vp->pcr_demand_perpackets_v=0是否成立,若是,进行步骤3.5.1.8,若否,进行步骤3.5.1.9;步骤3.5.1.8、将PES包中的(176-(length-nPesUsedByte))个填充字节打入当前TS包中;
进行步骤3.5.1.10;步骤3.5.1.9、将PES包中的(184-(length-nPesUsedByte))个填充字节打入当前TS包中;进行步骤3.5.1.10;步骤3.5.1.10、将PES包中的(length-nPesUsedByte)个字节打入当前TS包的末尾(length-nPesUsedByte)个字节中;输出nTsPacketNum;其中,nTsPacketNum表示该PES包一共打包成了多少个TS包;步骤3.5.2、音频PES包打TS包;因为音频TS包中不包含PCR信息,所以在将音频PES包打包成TS包的时候只需根据标准中规定的传输流的TS包的语法格式按照PES包的数据的顺序将它们写入TS包中即可;步骤3.5.3、计算PCR值;往pcr_flag等于1的视频TS包中填写PCR信息是在将每一路的音视频TS包,PSI信息包以及填充包均匀的写入输出文件中这些TS包写入输出文件过程中完成的,在完成将每一路的视频PES和音频PES打包成TS包后,就已经知道每一路的视频TS包和音频TS包的个数,还有PSI信息包和填充包的个数,这样就可以很方便的将这个时间段的这些TS包均匀的写入输出文件中,在写入的过程的要计算PCR,在某个复用时间段内,第TsNum包的PCR的计算方法如下int64_t timestampll=(((nPacket_salframe*pcr_jisuan+TsNum)*188)/(TS_BITRATE/1000.0))*8.0;pcr=(int64_t)(timestampll*90.0+0.5);其中nPacket_salframe是步骤1中计算出来的,即根据要复用的传输流的传输率,以及预先设定好的在多长的一个时间段内对输入码流进行统计复用的这个时间长度,计算出在这一段时间内,传输流应该有多少个传输流包输出;pcr_jisuan表示是第几个时间段,每完成一个时间段的复用,该值自加1;
TsNum表示该视频包在这个时间段内是第几个TS包;TS_BITRATE表示该输出的TS文件的传输率;步骤3.6、判断是否所有的PES包都处理完了,若是,进行步骤3.1,若否,进行步骤3.5;步骤4、判断是否有一路输入文件处理完成,若是,结束退出,若否,进行步骤2。
本发明提供了一种统计复用传输流的方法,该方法是一种简单且效率高的统计复用传输流的方法,有以下几点优点1)该统计复用算法是在不与编码器进行通信的状态下,对视音频基本流文件进行多路统计的方法;2)可以有效的提高信道的利用率;3)可以使复用得到的传输流的速率完全恒定;4)视音频同步的算法简单,即计算PTS/DTS的方法简单;5)以帧为单位对基本数据流打包的方法使得解码器可以很方便的在PES首部的PES_packet_length(PES包长)这个信息中获得将要处理的一帧视频或者音频数据的大小,可以根据这个值很好的控制VBV_buffer(视频缓冲检测器缓冲区),使其既不上溢也不下溢;6)能够根据输入码流的特点和输出传输流的要求,在输入文件的瞬时码率太高的时候,按照输入文件的优先级,丢弃优先级低的B帧,P帧,直到输入文件的瞬时码率满足传输流的传输率的要求,这样处理的优点是,在输入码流的码率控制不是很完善的情况下,也能够完成多路节目的复用,并且复用出的传输流在播放时不会出现马赛克。
权利要求
1.一种统计复用传输流的方法,其特征在于,包含以下步骤步骤1、初始化;步骤2、统计输入文件信息;步骤3、统计复用传输流;步骤4、判断是否有一路输入文件处理完成,若是,结束退出,若否,进行步骤2。
2.如权利要求1所述的统计复用传输流的方法,其特征在于,所述的步骤1包含以下步骤步骤1.1、初始化模块打开输入的视频基本流文件和音频基本流文件,获得文件中的码流的类型,同时获得每一路的视频和音频的一些基本信息;步骤1.2、初始化模块申请在做统计复用时内部使用的一些内存;步骤1.3、初始化模块根据要复用的传输流的传输率,以及预先设定好的在某一个时间段内对输入码流进行统计复用的这个时间长度,计算出在这一段时间内,传输流应该有多少个传输流包输出nPacket_salframe=(TS_BITRATE/(188*1000*8/ps->pict_duration))*SAL_frame_no;其中nPacket_salframe为在一定的时间段内,传输流要求输出的TS包的个数;TS_BITRATE为用户预先设定的传输流的传输率;pict_duration为传输流中视频基本流的帧速率的倒数,表示一帧数据的显示时间;SAL_frame_no为统计的一个单位。
3.如权利要求2所述的统计复用传输流的方法,其特征在于,所述的步骤1.1中的视频类型为MPEG-2或者我国自主研发的视音频编码标准AVS,音频类型为MPEG-1的layer1,layer2,layer3或者美国ATSC中规定的数字音频压缩标准AC-3,或者AVS,所述的基本信息包含以下视频方面的有图像的大小,帧速率,比特率等,音频方面有音频基本流的码率,采样率等。
4.如权利要求1所述的统计复用传输流的方法,其特征在于,所述的步骤2包含以下步骤步骤2.1、统计输入文件信息模块统计视频文件每帧的大小,帧类型,并且根据该视频序列的帧类型,帧速率和每一帧在文件中的具体位置,计算出每一帧的显示时间标签PTS;步骤2.2、统计输入文件信息模块对于AVS的音频文件,统计其每一帧的大小,计算出每一个音频帧的PTS;ap->audio_frame[frame_no].audioframe_PTS=frame_no*(1024.0/pack_stream->ap->sr)*1000其中,frame_no为音频帧的帧序号,pack_stream->ap->sr为音频的采样率。
5.如权利要求4所述的统计复用传输流的方法,其特征在于,所述的步骤2.1包含以下步骤步骤2.1.1、判断frame_no<frame_no_max是否成立,若是,进行步骤2.1.2,若否,退出;其中,frame_no为视频帧的序号,表示该帧在视频基本流文件中是第几帧;frame_no_max表示该视频基本流文件中一共有多少帧;步骤2.1.2、判断F_T[frame_no]=I是否成立,若是,进行步骤2.1.3,若否,进行步骤2.1.4;其中,F_T[frame_no]表示第frame_no帧的帧类型,即该帧是帧内编码I帧,双向帧间编码B帧或者预测帧间编码P帧;步骤2.1.3、判断F_T[frame_no+1]=B是否成立,若是,进行步骤2.1.5,若否,进行步骤2.1.6;步骤2.1.4、判断F_T[frame_no]=P是否成立,若是,进行步骤2.1.7,若否,进行步骤2.1.9;步骤2.1.5、计算当前帧的PTS;F_PTS[frame_no]=frame_no*pict_duration;其中,F_PTS[frame_no]表示第frame_no帧的PTS;pict_duration为传输流中视频基本流的帧速率的倒数,表示一帧数据的显示时间;得到当前帧的PTS之后,输出结果,将帧序号加1,frame_no++,进行步骤2.1.1;步骤2.1.6、执行Count_B++,将Count_B的值加1,进行步骤2.1.7;其中,Count_B表示一个I帧或者P帧和相邻的另一个I帧或者P帧之间有多少个B帧;步骤2.1.7、判断F_T[++frame_no]=B是否成立,若是,进行步骤2.1.6,若否,进行步骤2.1.8;步骤2.1.8、计算PTSF_PTS[frame_no-1-Count_B]=(frame_no-1)*pict_duration;输出结果,进行步骤2.1.9;步骤2.1.9、判断Count_B=0是否成立,若是,进行步骤2.1.1,若否,进行步骤2.1.10;步骤2.1.10、计算PTSF_PTS[frame_no-Count_B]=(frame_no-1-Count_B)*pict_duration;Count_B--,将Count_B的值减1;输出结果,进行步骤2.1.8。
6.如权利要求1所述的统计复用传输流的方法,其特征在于,所述的步骤3包含以下步骤步骤3.1、统计复用传输流模块生成节目特定信息PSI信息表;根据输入的视频基本流和音频基本流的个数,生成传输流中的节目特定信息,如在MPEG-2或者AVS标准系统部分规定的节目关联表PAT,节目映射表PMT,网络信息表NIT,条件访问表CAT和传输流描述表;步骤3.2、预统计;统计复用传输流模块根据统计输入文件信息模块中得到的信息,对要进行统计复用的一段时间内的码流进行分析,估算这段时间内各路节目的比特数的大小,估计这些比特数能不能满足传输流的传输率的要求,并进行相应处理;步骤3.3、统计复用传输流模块判断是否有一路节目已经结束,若是,结束退出,若否,进行步骤3.4;步骤3.4、统计复用传输流模块打PES打包基本流包;以帧为单位打包对于视频数据,是每一帧(I帧、P帧或者B帧)数据作为一个视频PES分组包的数据部分,对于MPEG音频数据,是将与一帧视频数据所对应的音频数据作为一个音频PES分组包的数据部分,MPEG音频PES分组这部分数据的大小一般是固定的,它与视频数据的帧速率和音频数据的采样频率,比特率以及音频数据的编码格式有关,对于AVS音频数据,每一帧数据作为一个音频PES分组包的有效负载;PES分组的数据部分再加上PES分组首部就形成了完整的PES分组包;PES首部包含了用于解码器同步重放的解码时间标签DTS(DecodingTime Stamp)和显示时间标签PTS(Presentation Time Stamp),PTS已经在步骤2计算得出了;步骤3.5、统计复用传输流模块打TS包,计算PCR值;步骤3.6、统计复用传输流模块判断是否所有的PES包都处理完了,若是,进行步骤3.1,若否,进行步骤3.5。
7.如权利要求6所述的统计复用传输流的方法,其特征在于,所述的步骤3.2包含以下步骤步骤3.2.1、计算这段时间内传输流中所有路节目的视频传输流ts包和音频ts包的个数的总和audio_video_packets;步骤3.2.2、计算时间段内传输流中的填充包的个数padding_packets_num;步骤3.2.3、判断padding_packets_num>0是否成立,若是,进行步骤3.3,若否,进行步骤3.2.4;步骤3.2.4、判断被统计的视频帧中是否还有B帧,若是,进行步骤3.2.5,若否,进行步骤3.2.6;步骤3.2.5、丢掉优先级最低的那路节目的一帧B帧,设置该帧的BP_throw_flag为1;这里,若某一帧的BP_throw_flag标志等于1,则表示在统计复用时要丢弃该帧;步骤3.2.6、判断被统计的视频帧中是否还有P帧,若是,进行步骤3.2.7,若否,进行步骤3.2.8;步骤3.2.7丢掉优先级最低的那路节目的一帧P帧,设置该帧的BP_throw_flag为1;步骤3.2.8、报错退出。
8.如权利要求6所述的统计复用传输流的方法,其特征在于,所述的步骤3.5包含以下步骤步骤3.5.1、视频PES包打TS包;步骤3.5.2、音频PES包打TS包;因为音频TS包中不包含PCR信息,所以在将音频PES包打包成TS包的时候只需根据标准中规定的传输流的TS包的语法格式按照PES包的数据的顺序将它们写入TS包中即可;步骤3.5.3、计算PCR值;往pcr_flag等于1的视频TS包中填写PCR信息是在将每一路的音视频TS包,PSI信息包以及填充包均匀的写入输出文件中这些TS包写入输出文件过程中完成的,在完成将每一路的视频PES和音频PES打包成TS包后,就已经知道每一路的视频TS包和音频TS包的个数,还有PSI信息包和填充包的个数,这样就可以很方便的将这个时间段的这些TS包均匀的写入输出文件中,在写入的过程的要计算PCR,在某个复用时间段内,第TsNum包的PCR的计算方法如下int64_t timestampll=(((nPacket_salframe*pcr_jisuan+TsNum)*188)/(TS_BITRATE/1000.0))*8.0;pcr=(int64_t)(timestampll*90.0+0.5);其中nPacket_salframe是步骤1中计算出来的,即根据要复用的传输流的传输率,以及预先设定好的在多长的一个时间段内对输入码流进行统计复用的这个时间长度,计算出在这一段时间内,传输流应该有多少个传输流包输出;pcr_jisuan表示是第几个时间段,每完成一个时间段的复用,该值自加1;TsNum表示该视频包在这个时间段内是第几个TS包;TS_BITRATE表示该输出的TS文件的传输率;步骤3.6、判断是否所有的PES包都处理完了,若是,进行步骤3.1,若否,进行步骤3.5。
9.如权利要求8所述的统计复用传输流的方法,其特征在于,所述的步骤3.5.1包含以下步骤步骤3.5.1.1、判断vp->v_packet_num%vp->pcr_demand_perpackets_v=0是否成立,若是,进行步骤3.5.1.2,若否,进行步骤3.5.1.3;其中,vp->v_packet_num表示这路节目的视频包的序号;vp->pcr_demand_perpackets_v表示这路节目每隔几个视频包,会有一个视频包含有PCR信息;步骤3.5.1.2、判断length-nPesUsedByte<176是否成立,若是,进行步骤3.5.1.4,若否,进行步骤3.5.1.5;其中,Length是该视频帧的长度;nPesUsedByte表示这一帧视频数据中已经处理的字节数;步骤3.5.1.3、判断length-nPesUsedByte<184是否成立,若是,进行步骤3.5.1.4,若否,进行步骤3.5.1.6;步骤3.5.1.4、设置该PES包的adaptation_field_control=11;adaptation_field_length=184-(length-nPesUsedByte)-1;进行步骤3.5.1.7;其中,adaptation_field_control表示该TS包是否含有调整字段和有效负载;adaptation_field_length表示调整字段中的字节数;步骤3.5.1.5、设置该PES包的adaptation_field_control=11;adaptation_field_length=0X07;将PES包中的176个字节打入当前TS包的末尾176个字节中nPesUsedByte+=176;设置该PES包的pcr_flag=1;进行步骤3.5.1.1;其中,pcr_flag表示该TS包是否含有PCR信息;步骤3.5.1.6、设置该PES包的adaptation_field_control=00;将PES包中的184个字节打入当前TS包的末尾184个字节中nPesUsedByte+=184;设置该PES包的pcr_flag=0;进行步骤3.5.1.1;步骤3.5.1.7、判断vp->v_packet_num%vp->pcr_demand_perpackets_v=0是否成立,若是,进行步骤3.5.1.8,若否,进行步骤3.5.1.9;步骤3.5.1.8、将PES包中的(176-(length-nPesUsedByte))个填充字节打入当前TS包中;进行步骤3.5.1.10;步骤3.5.1.9、将PES包中的(184-(length-nPesUsedByte))个填充字节打入当前TS包中;进行步骤3.5.1.10;步骤3.5.1.10、将PES包中的(length-nPesUsedByte)个字节打入当前TS包的末尾(length-nPesUsedByte)个字节中;输出nTsPacketNum;其中,nTsPacketNum表示该PES包一共打包成了多少个TS包。
全文摘要
一种统计复用传输流的方法,其包含了初始化、统计输入文件信息和统计复用传输流等步骤,本发明提供的一种统计复用传输流的方法,提供了一种简单高效的,完全脱离编码器,对视音频基本流文件进行多路统计的方法,复用得到的传输流的传输率能够完全恒定。
文档编号H04L29/00GK1905681SQ200610029599
公开日2007年1月31日 申请日期2006年8月1日 优先权日2006年8月1日
发明者李萍, 李国平, 陈勇 申请人:上海广电(集团)有限公司中央研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1