一种H264视频码流检测到错误后处理错误的方法
【技术领域】
本发明涉及一种针对出错情况下的H264视频码流的处理错误的方法,该方法应用于嵌入式移动电视设备上对于由于误码和丢包引起的264码流不能正常解码情况下的错误隐藏、纠正及恢复方法。
【背景技术】
H264/AVC解码流程主要模块包括帧内预测、运动补偿,去块滤波、反变换、反量化和熵编码。解码的主要流程是,当压缩视频码流读入解码器缓冲区后,首先需要进行熵编码,得到视频流的一系列重要编码信息和实际压缩帧的数据,然后经过反扫描重新排序,通过反量化、反变换后得到编码帧的预测残差值及运动矢量等,根据得到的码流语义解释进行相应的帧内预测或帧间运动补偿,对于帧间预测还需要进行编码器端完全相同的去块滤波操作,形成重建的参考帧,在完成所有宏块的价码后,就得到相应的解码重建帧,输出解码视频序列。
当视频业务的传输载体为ISDB、DVB、CMMB等无线信道时,由于无线信道有着时变,干扰因素复杂,事先难于预计的特点,所以一般误码率比较高,视频比特流也会因为信道的不稳定而产生误码和丢包的现象。丢包现象对于手持电视的低比特率的应用尤其如此,因为264码流中P帧的大小足以放到一个传送包中,一旦产生丢包就有可能造成后续视频序列缺少参考而不能进行正常的解码。由于264编码器采用了空间的帧内预测和时间上的帧间预测以及熵编码等技术,经过高压缩后的视频码流对传输所产生的误码非常敏感,一旦产生误码,不仅影响该误码数据的恢复,还会影响与之相关的其他数据的恢复,造成误码扩散。
目前主要的在编码端的错误控制的方法有分片(将一帧数据分成几个互相之间数据没有相关性的片进行编码的方法),数据分割,分级编码,FMO(Flexible MacroBlock Ordering),ASO(Arbitrary Slice Order)。但这些都会增加编解码器的负担,因此大部分在H264实际出现编码器中并没有被使用,而分片虽然有使用,但在DVB、CMMB、ISDB中没有经常被使用,因此就需要靠解码器端来进行错误的隐藏和恢复工作。
在中国发明专利CN200610170066中有提到一些对Mainprofile以及HighProfile中的一些错误纠正的方法,在美国专利US200505254584中介绍了如何产生运动向量(Motion Vector)进行帧间(Inter picture)恢复以及如何进行帧内图象(Intra picture)内插没有正确解码的区域,它适用于H264以及以前的Mpeg系列。美国专利US20060045190中介绍了一种在264解码过程中如何选取Intra Prediction进行预测没有正确加码的区域的方法。但是以上专利论文介绍的错误纠正和隐藏的方法对H264 Baseline以及手持嵌入式设备来说不是很适合,也不是很完善。
【发明内容】
本发明所要解决的技术问题在于提供一种手持嵌入式设备上的H264视频码流检测到错误后处理错误的方法。
本发明采用以下技术方案解决上述技术问题:
一种H264视频码流检测到错误后处理错误的方法,包括如下步骤:
步骤10:解码器检测到错误;
步骤20:判断错误是否在帧头出现?是,转入步骤70,否,转入步骤30;
步骤30:判断当前的帧和之前解码出来的帧是否有场景切换?是,转入步骤40,否,转入步骤60;
步骤40:判断是否解码出大部分图像?是,转入步骤50,否,转入步骤70;
步骤50:通过帧内预测恢复剩下的图像数据,然后将当前帧放入帧缓存中进行后续的处理;
步骤60:保留已经解码的数据,并将前一帧中对应当前帧应错误未解码的宏块数据拷贝过来,补全整帧图象后将当前帧放入帧缓存中继续进行解码;
步骤70:当前出错的帧不再进行错误恢复并且丢弃,从码流去寻找下一个IDR帧。
所述步骤30中判断当前的帧和之前解码出来的帧是否有场景切换具体包括如下步骤:
根据错误发生前正确解码出的YUV数据中零散的取出若干个宏块的数据和前一个解码帧相应位置的数据进行比较,并计算他们的误差,如果误差大于一个阀值就说明两帧的差别比较大,那么就可以判断上一个解码出来的帧和当前解码帧有着场景切换,如果小于一个阀值的话,那么就把当前帧和前一帧看做同一场景中,判断为两帧之间无场景切换。
本发明的有益效果在于:无线实时视频信号中出现丢包或错误比特的概率非常高,本发明能够有效改善此环境下由于丢包和数据错误而是解码器出现花屏和跳帧的情况。
【附图说明】
下面参照附图结合实施例对本发明作进一步的描述。
图1是本发明工作流程示意图。
【具体实施方式】
手持设备的特点:芯片上解码器资源少,运算能力弱——因此主要只实现H264 Baseline Profile。
DVB、CMMB、ISDB等标准定义的H264 Baseline码流有以下特点:码率低(有的帧可以包含在一个网络包中)、P帧小I帧大(一般相差5-10倍)、由于设备上芯片的资源过少导致解码器不如PC上的稳定,对错误敏感。
这些情况造成解码器所收到的264码流特点为i帧由很多个包组成,易出现误码和丢包,p帧基本可以包含在一个包内,易出现丢包。由于资源较少,解码器对错误比较敏感、一般1-2秒中有且只有一个IDR(i帧并且为同步帧)帧、Baseline Profile只存在I帧和P帧,在每帧有且仅有一个参考帧(就是在帧管理Buffer中前面的那帧)、一般每帧都只有1个slice,因此Slice可以当成帧来看待、由于I帧比P帧大很多,所以误码一般都出现在I帧。
具体处理错误的方法如图1所示,包括如下步骤:
一种H264视频码流检测到错误后处理错误的方法,包括如下步骤:
步骤10:解码器检测到错误;
步骤20:判断错误是否在帧头出现?是,转入步骤70,否,转入步骤30;
步骤30:判断当前的帧和之前解码出来的帧是否有场景切换?是,转入步骤40,否,转入步骤60;
其中判断当前的帧和之前解码出来的帧是否有场景切换具体包括:
根据错误发生前正确解码出的YUV数据中零散的取出若干个宏块的数据和前一个解码帧相应位置的数据进行比较,并计算他们的误差,如果误差大于一个阀值就说明两帧的差别比较大,那么就可以判断上一个解码出来的帧和当前解码帧有着场景切换,如果小于一个阀值的话,那么就把当前帧和前一帧看做同一场景中,判断为两帧之间无场景切换。
步骤40:判断是否解码出大部分图像?是,转入步骤50,否,转入步骤70;
步骤50:通过帧内预测恢复剩下的图像数据,然后将当前帧放入帧缓存中进行后续的处理;
步骤60:保留已经解码的数据,并将前一帧中对应当前帧应错误未解码的宏块数据拷贝过来,补全整帧图象后将当前帧放入帧缓存中继续进行解码;
步骤70:当前出错的帧不再进行错误恢复并且丢弃,从码流去寻找下一个IDR帧。
对于移动电视标准来说,一般的H264帧都只有一个Slice,所以都是帧的前半部分被解码,后半部分由于误码或者丢包而没有被解码,然后根据具体情况判断是否进行错误隐藏。
在没有场景变化的情况下恢复的效果较好,因此首选此情况下的错误恢复。而帧内预测进行错误恢复的方式可以根据具体情况选择是否采用,一方面当出现丢包和误码的时候使用此方法恢复的效果较差,另一方面不采用此方法在场景切换的情况下就会出现整个图象序列的丢失。
本发明能够有效改善由于丢包和数据错误而是解码器出现花屏和跳帧的情况。