一种动态规划优化视频编码关键帧位置方法
技术领域
本发明涉及多媒体领域,特别涉及音视频编码领域。
背景技术
编码视频的关键帧是指那些在视频中不需要之前帧的数据,依靠帧自身的信息就能完成编解码的视频帧,比如H.264中的IDR帧;相邻两个关键帧的间隔对编码压缩的质量效率以及播放时可以拖动的精度都有较大的影响;在H.264编码码率固定时,关键帧间隔越长,压缩误差越小,清晰度主观感觉越好,但是播放拖动精度会较差;关键帧间隔越短,压缩误差越大,清晰度主观感觉越差,但是播放拖动精度较好;
目前行业内大多数编码器的设计构思分为两种:一种是根据预先人工设定的关键帧间隔来设置每个关键帧位置;还有一种是综合考虑关键帧间隔与视频的场景切换点来设置关键帧位置,技术手段主要是采用简单的帧数累加统计和场景变化部分在整个帧画面中的占比统计来实现。对于这两种方法,都容易将关键帧切分在画面变化较小的部分,将本来只需要很少码率编码的画面用很大的码率来编码,浪费了带宽,并且容易人为的引入播放的不流畅;在码率固定时也会影响画质。
发明内容
针对现有技术中存在的缺陷,本发明提出如下发明构思:通过对视频的预编码,来分析计算出关键帧位置的合理安排,达到既不影响拖动精度又能节省编码码率(或改善画质)的效果。
本发明的方法包括:对于每一个需要转码的视频,分析出播放拖动精度固定的情况下,一个较优的安排视频关键帧的位置方案,以节省码率或提升画面清晰度。
具体实现步骤如下:
1.指定转码工具与预编码的参数,进行预编码;
2.所述预编码结束后得到编码视频的每一帧的编码大小以及所有的场景切换点位置;
3.所述场景切换点的视频帧均设为关键帧;
4.根据任意相邻两个所述场景切换点之间一个编码帧的大小信息,计算出这一段的优化的关键帧分配方案;
综合所述步骤3,4的结果,得到整个视频的所述优化关键帧分配方案,应用于后续的转码。
其中所述步骤1中的指定参数,对于H.264压缩标准,设一个超过编码帧数的关键帧间隔,同时需要设定场景切换阈值,以及一个大小适中的量化因子QP;
其中所述步骤4中,计算每一段的关键帧分配方案,具体通过求解动态规划的递归算法来计算得到。
设前一个场景切换点的位置在第0帧,后一个场景切换点的位置在第N+1帧,设定关键帧最大间隔为K,第i帧在预编码中的码率大小是Xi(i=1~N);其中N、K、i均为正整数;
出于播放时定位精度考虑,会设定一个最大关键帧间隔K来达到相应的拖动精度;于是对于这N帧的视频中,就至少需要Kn=[N/K]个关键帧,[x]表示将数x取整;
一般来说,编码关键帧所需要的码率比非关键帧会大很多,将本来非关键帧编码码率较小的帧用关键帧来编码意味着较大的浪费,所以要尽量用非关键帧编码消耗码率较大的帧作为关键帧,以减少这种浪费;于是问题就变成求下面的最优化问题:
设关键帧的位置选取在第tj帧(j=1~Kn),那么就是在限制条件tj+1-tj≤K(j=1~Kn-1)和t1≤K,tKn≥N+1-K下,取得最大值时,tj(j=1~Kn)的取值就是对应的关键帧安排的优化位置。
这是一个经典的动态规划问题,可以使用求解动态规划的递归算法来求解此类问题。
但是求解动态规划的递归算法复杂度是与(K(Kn+1)-N)Kn成正比,当计算复杂度过高是时采用一个复杂度很低的算法来代替,将限制条件tj+1-tj≤K(j=1~Kn-1)用tj+1-tj=K(j=1~Kn-1)来简化最优化问题。
本发明使用视频预编码获得的每帧的码流大小及场景变化帧之间的编码帧数等信息,通过优化算法计算出一种在不影响播放拖动精度情况下的节省码率的关键帧分配方案。
有益效果:在不影响播放拖动精度和画面质量的情况下,能够节省码率(节省的程度和要求播放拖动精度相关);或者说在相同的码率和播放拖动精度的条件下,能够对画面质量有部分的改善。
具体实施方式
下面将对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
一个有50帧的视频关键帧的选择,设定最大关键帧间隔为10帧。
1.用带场景检测和关键帧最大间隔为300(>50)的编码参数对这个视频进行快速预编码,得到每个场景变化点的帧位置以及每一帧的类型及大小如下:
根据目前现有技术,会选择第11,21,31以及43帧为关键帧,这些帧的大小总计为1300+400+300+500=2500个字节,假设每个相同画质的关键帧的大小都为15000个字节,那么总计需要增加15000×4-2500=57500个字节,以达到播放拖动精度在10帧的要求。
本发明的方法的技术,以场景分割帧33将关键帧的优化分成独立2个子部分分别优化;
第1部分K=10,N=33-1-1=31,Kn=[N/K]=3,Xi(i=1~31)的值对应表中的第2~32帧的大小,关键帧的位置分别在tj(j=1,2,3)帧;最优化问题就是:
在条件t1≤11,t2-t1≤10,t3-t2≤10,t3≥23下,求的最大值,用编程写好的动态规划递归算法程序求解这个问题,得到在t1=6,t2=15,t3=25时,满足条件t1≤11,t2-t1≤10,t3-t2≤10,t3≥23,同时取得最大值为3200+2000+5000=10200.
第2部分K=10,N=51-33-1=17,Kn=[N/K]=1,Xi(i=1~17)对应表中的34~50帧的大小,关键帧的位置在t1帧;最优化问题就是:在条件41≤t1≤43下,的最大值很明显是t1=41时取最大值2300.
综合第1和第2部分,整个视频的优化的关键帧位置分配应该是在第6,15,25和41帧;这些帧的大小总计为10200+2300=12500,假设每个相同画质关键帧的大小为15000,那么要达到拖动播放精度在10帧内的要求,需增加15000×4-12500=47500;在提供相同用户播放体验情况下,比现有技术节省57500-47500=10000个字节,占整个视频的近6%。
实施例二
另一个60帧的视频关键帧的选择,设最大关键帧间隔为8帧。
1.用带场景检测和最大关键帧间隔为1000(1000>60)的编码参数对这个视频进行快速预编码,得到每一帧的大小如下:
根据现有技术会选择第9,17,25,33,41,49和57帧为关键帧,这些帧的大小总计为1500+300+500+400+800+1000+300=4800个字节,假设每个相同画质的关键帧的大小都为15000,那么总计需要增加15000×7-4800=100200个字节,以达到播放拖动精度在8帧的要求。
本发明的方法技术,由于表中的数据没有检测到场景切换点,所以需要作为一个整体来求取关键帧的优化位置。本例中K=8,N=61-1-1=59,Kn=[N/K]=7,Xi(i=1~59)的值对应表中的第2~60帧大小,关键帧的位置分别在tj(j=1~7)帧,最优化问题就是:在条件t1≤9,tj+1-tj≤8(j=1~6),t7≥53下,求的最大值。
由于求解这个问题的计算复杂度与(8×(7+1)-59))^8=390625成正比,假定认为这个计算复杂度过高,最优化问题需要简化为:在条件t1≤9,tj+1-tj=8,t7≥53下,求的最大值。调用求解这个问题的程序,得到t1=7,tj=7+8×(j-1)(j=1~7),同时取值为16100,即这些帧的大小和我16100字节,需要增加15000×7-16100=88900字节,以达到播放拖动精度为8帧的要求,比现有算法节省100200-88900=2300字节,节省了大约1%的码率。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。