基于Vapoursynth和ffmpeg的视频编辑
2022-07-23北方工业大学信息学院余海鑫李文邦
北方工业大学信息学院 余海鑫 丁 航 李文邦
目前大部分的视频处理大多都是采用Avisynth这一视频文件后期处理工具,但是从最近几年来看,这款工具由于其代码不规范,更新缓慢,版本更替出现各种各样的问题而饱受非议。现如今出现一种新兴的视频处理工具vapoursynth,由于其必须基于python的环境下,因此其代码与python语言有着相同的规范。文章通过对vapoursynth进行了研究,采用该工具来设计实现了对视频进行降噪与去色带处理,在视频编码方面采用visualstudio调用ffmpeg包中的编码器来对视频进行编码。最终处理结果符合预期效果。
随着通信技术的不断发展,使视频的传播变得更为迅捷,高效。那么视频的传输与处理就相当的关键。视频处理部分目前普遍使用Avisynth,其优点有很多,其内置滤镜支持在YUV格式下进行处理,省去了将YUV文件转到RGB文件这一过程,同时Avisynth内建大量视频处理滤镜,也支持第三方强力滤镜等等。但该产品已经停滞发展了,其所使用的脚本语言是自定义的,需要重新学习。而新兴的产品vaporsynth是基于python环境下的,其脚本语言也采用python语言,简单方便。大部分Avisynth中的滤镜都可以移植到vaporsynth中,因此使得其功能也会相当强大。视频传输核心部分是视频压缩,而视频编码就是将原有视频的图像进行压缩处理,去除掉冗余数据,以此达到视频压缩的目的。有高编码效率的视频可以有更高的通信效率,在传输的过程中也有更低的噪声,目前最广泛流行的视频编码格式当属H.264。传统视频编码采用基于块划分的混合编码框架,包括帧内预测、帧间预测、变换、量化、熵编码和环路滤波等技术模块。本文设计实现了基于Vapoursynth和ffmpeg的视频编辑系统,阐述了基于ffmpeg的h.264编码的过程以及基于vapoursynth的降噪与去色带的原理以及结果分析。
1 系统设计
该系统包括视频处理和视频编码两个模块,视频处理模块包含降噪处理与去色带处理,整个系统的框图如图1所示。
图1 系统框图
先将视频用vapoursynth进行降噪或者是去色带等一系列非线性编辑处理(若视频质量符合条件可以不进行处理)。然后对视频进行编码,使用visual studio调用ffmpeg包中的编码器对视频编码。
2 系统实现
2.1 开发工具及环境配置
实现降噪和去色带模块的开发工具是vapoursynth,它是可以支持开发Python脚本来进行非线性的处理的一种frameserver库,与停滞发展的Avisynth相比,vapoursynth有支持多线程的处理工作、多种视频编码格式等优点。
vapoursynth下载地址为:https://github.com/vapoursynth/vapoursynth/releases
Python:下载地址为:https://www.python.org/downloads/release/python-370a4/
安装完成python和vapoursynth及vapoursyntheditor后可在python编辑器中输入以下代码查看是否安装成功:from vapoursynth import core
print(core.version())
若能输出vapoursynth的版本信息代表安装成功,且成功识别出已安装的python环境。
实现视频编码模块的开发工具是ffmpeg,它是一套开源多功能媒体编辑计算机程序。本文主要利用其中的libavcodec音视频编解码库进行操作。安装完成后在visual studio中新建工程并完成与ffmpeg的联合调试即可。
ffmpeg下载地址为http://ffmpeg.org/
visual studio:下载地址为https://visualstudio.microsoft.com/zhhans/downloads
2.2 视频处理
要进行视频处理,必须要调用所需的函数,因此首先引入函数库,调用函数读入视频,接着对视频进行一系列的处理,所需的函数必须在函数库中存在,将处理结束的视频输出。
本文的视频处理方式共有两种,分别是降噪处理和去色带处理。2.2.1 降噪处理
首先通过MATLAB对原视频图像进行加噪,MATLAB的的加噪函数为:
imnoise(img1,ÿsalt & pepperÿ,0.2);
该函数的第一个参数img1是需要进行处理的图像,第二个参数是所加噪声类型,本文使用的类型为椒盐噪声,还可以使用的噪声有高斯噪声,乘性噪声等等,第三个参数是噪声密度,噪声密度越大,噪声点越明显,本文采用0.2使噪声更为明显。
通过调用vapoursynth插件中的降噪模块实现对视频的降噪处理,其原理为对原像素亮度值一致的像素亮度取算术平均值,以抑制噪声方差。降噪函数为:
core.rgvs.RemoveGrain(clip,mode=4)
其中第一个参数为所要进行降噪的视频,第二参数为降噪模式,有1~24共24个模式,不同模式的降噪方式不同,本文采用的使降噪模式4,其vapoursynth源代码为:
import vapoursynth as vs
from vapoursynth import core#引入函数库
file_path=ÿtest.mp4ÿ#文件的路径,此为相对路径
clip = core.lsmas.LWLibavSource(file_path,threads=1)#threads为线程数
clip = core.rgvs.RemoveGrain(clip, mode=4)#降噪函数
clip.set_output()#输出视频进行预览
2.2.2 去色带处理
色带是由于色彩精确度不够导致的,这里我们采用的方法是将构成色带的像素替换为临近像素直接的中间值,并施加抖动加噪以淡化色带。其中抖动算法通过对周围相邻像素使用非均匀分布的量化误差以达成抖动目的。去色带函数为:
core.f3kdb.Deband(clip,range=31,y=511,cb=511,cr=511,grainy=0,grainc=0)
其中参数clip为要进行处理的视频文件名,参数range为色带检测范围,可以设0~31之间的数,参数y,cb,cr分别为亮度平面,蓝色色度平面和红色色度平面的色带检测阈值,可以为0~511,grainy和grainc为亮度和色度平面的抖动值,可以为0`64。
2.3 视频编码
利用基于ffmpeg的视频编码器,可以将yuv视频编码成h.264压缩编码数据。流程图如图2所示。在开始之前,先将视频转换为yuv格式的视频文件。然后初始化各结构体。将视频的每一帧送入编码器编码。将编码完成的数据流写入文件。
图2 视频编码流程图
3 系统测试与结果
3.1 降噪处理结果分析
为了方便对比结果,原视频图像应清晰明亮,轮廓明显,细节清楚可观察。原视频中的一帧图像如图3所示。
图3 原图像
可以使用MATLAB对其进行增加噪声点,可以增加高斯噪声,椒盐噪声,乘性噪声等,如图4所示加入了噪声密度为0.1的椒盐噪声,可以看到有些轮廓已经有些模糊了,有许多零零散散的噪声点分布在图像中。
图4 加噪后的图像
使用vapoursynth处理该图片后,采用降噪模式4的图像如图5所示,用第8个相邻像素的第四个最小值和第四个最大值来对该像素进行编辑,与图4相比可以明显感觉到大部分的噪声点已经被去除掉,但是与图4相比还是能感觉到还残有部分的噪声点没有去除,但总体效果上来看还是能达到目标的。
图5 经过模式4降噪后的图像
采用降噪模式2的图像如图6所示,使用第8个相邻像素的第二个最小值和第二个最大值来对该像素进行编辑,与图3相比还残余有大量的噪声点,去除的效果比较差,因此采用模式4进行降噪效果更好。
图6 经过模式2降噪后的图像
3.2 去色带处理结果分析
可以看出如图7所示的图像中各个颜色之间出现了块状的明显色带,接下来用vapoursynth对该图进行去色带处理。
图7 具有色带的原图像
如图8所示,设置色带检测范围range为31,亮度平面y、蓝色色度平面cb和红色色度平面cr都设置为511,grainy和grainc代表亮度和色度平面的抖动值,设置为0即可,经过去色带以后的图像大部分的色带消失,图像颜色之间过渡平滑。经过去色带处理后的图像可以尽可能减小因压缩而产生的影响。如图9所示,将色带检测范围设置为3,其他不变,处理后的图像色带未完全去除,依然存在较为明显的色带。如图10所示,将亮度平面色带检测阈值设置为200,处理后的图像也依然剩余部分色带未清除。因此,各个参数对色带的去除都有影响,色带检测范围range越大,其去除效果越好,亮度平面与色度平面检测阈值越大,去除效果也越好。
图8 经过去色带后的图像
图9 色带检测范围为3的图像
图10 亮度平面色带检测阈值为200的图像
图11 原视频帧图像
图12 H264编码后视频帧图像
3.3 视频编码的结果分析
视频编码之前应该先播放该视频查看视频的清晰度是否方便对比,若是符合才可进行编码操作,若是不符合,则应另外选则合适的视频进行编码。如图11所示为原视频中的一帧图像。视频清晰度符合要求,可进行下一步编码。
经过H264编码后的一帧图像如图12所示,对比编码后的视频与原视频,可以看到几乎是等同的,因此视频编码成功。
本文基于vapoursynth库与H.264框架。使用降噪模块抑制噪声方差,将压缩过程中产生的噪声点去除。通过将构成色带的像素替换为临近像素的中间值,去除不同颜色间的色带,使颜色之间过渡平滑。能够有效解决视频编码中出现的图像失真严重问题,且此视频编码方法具有代码简单易懂、容易操作的特点,可以尽可能减小失真,在视频编码和噪声修复等实际应用中有较强的实用价值。本文所使用的两种编辑方式其难点在于需要多种软件相互协调,共同处理视频文件,对环境的配置要求较高。