龙空技术网

一种视频自适应降帧率算法

北京IT界圈交流 350

前言:

此时大家对“图像去抖动算法”都比较注重,各位老铁们都需要知道一些“图像去抖动算法”的相关内容。那么小编也在网上搜集了一些有关“图像去抖动算法””的相关文章,希望大家能喜欢,咱们一起来了解一下吧!

在流媒体领域中,因为网络条件变化,或者终端性能的差异,可能需要根据设备能力或者网络能力做帧率调整,以达到降低带宽,降低终端解码和渲染的开销。而常规的编码器特别是硬件编码器一般都不支持降帧率(目前只知道openh264 的frameskip相关的接口开源降低帧率),虽然编码初始化设置某个帧率,但这个帧率不决定编码器输出帧率,仅仅作用用输出SPS的帧率参数,实际决定编码器输出帧率还是采集后往编码器输入的帧率。笔者根据实际项目需要,设计了2个方案,以达到编码降帧率输出。

方案一 多线程方案

多线程降帧率方案

采集作为一个生产者线程A,将采集的一帧往buffer送,编码器做一个消费者线程B,从buffer里面读取数据。A线程根据前端采集帧(如摄像头帧率,桌面视频和游戏帧率)按既定帧率往buffer送,不管线程B是否消费,没有消费的话,就直接覆盖。而线程B按业务需求按帧率对应的时间间隔主动去读帧数据(当然AB线程要做好互斥和资源管理)。

该方案优点:实现简单,而且输出帧率稳定,且行对输入帧图像来说,输出丢帧均匀。缺点:需要改造软件框架,有些既有框架是采集和编码是同一个线程,如果是第三方写的代码,改造起来要估计比较困难。

方案二. 单线程方案

如果原来项目采集编码一个线程的话,且无法拆分双线程,就需要在送入解码器之前主动丢帧。具体思路如下。

单线程降帧率方案

该方案优点:在单线程框架下不需要改动框架,确保原有的代码的稳定性。缺点是:丢帧算法要设计合理,否则丢帧不均匀,会造成视频在客户端端播放卡顿,且前端采集帧率抖动会引发算法丢帧策略的调整,从而引发输出帧率的抖动,不过根据实际情况调节参数,尽量减少输出帧率抖动,尽量保证均匀间隔丢帧。

丢帧算法

设计原则:尽量做到均匀丢帧,防止不合理的连续丢帧造成卡顿

参数:r=fps_in/fps_out

其中:fps_in 代表丢帧算法模块的输入帧率,即采集输出帧率

fps_out 代表丢帧算法模块的输出这里,即编码器输入帧率

丢帧算法公式:

样例分析:

录屏游戏60fps,fps_out =30,r=2送入解码器帧为:1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59(隔一帧丢一帧)

录屏视频帧率为25,fps_out=15,r=1.6,送入解码器帧为:

1,3,5,7,9,11,13,15,17,19,21,22,23,24,25 (隔一帧丢一帧,丢完就连续送入)。

录屏视频帧率为25,fps_out=20,r=1.25送入解码器帧为:

1,2,3,5,6,7,9,10,11,13,14,15,17,18,19,21,22,23,24,25(隔三帧丢一帧, 丢完就连续送入)

经测试:

在远程桌面场视频25帧场景下,输出帧率测试结果如下:

本算法在理论上输出帧率是非常准的,同时丢帧也比较均匀。但实际项目中,如果fps_in存在大幅度抖动(主要是桌面采集,摄像头采集帧率一般都是固定的),算法策略需要调整,可能会产生输出帧率抖动,需要根据实际项目情况进行算法调优。更多更详细信息请关注公众号:AV_Chat

标签: #图像去抖动算法