FFmpeg除了具有强大的封装/解封装、编/解码功能之外,还包含了一个非常强大的组件——滤镜avfilter组件,经常用于进行多媒体的处理与编辑,能够实现的音频、视频、字幕渲染效果数不胜数。
一、FFmpeg滤镜Filter
Filter参数排列方式
[输入流或标记名]滤镜参数[临时标记名]; [输入流或标记名]滤镜参数[临时标记名]…
1 | # [1:v]代表输入第1个文件的视频信息,即logo.png,[0,v]代表输入第0个文件的视频信息,即input.mp4 |
二、FFmpeg视频流滤镜
文字水印
文字水印可用参数如下:
1 | # 左上角20.20位置添加hello world文字,文字颜色绿色、背景颜色黄色 |
图片水印
为视频添加图片水印可以使用movie滤镜。
movie滤镜的参数:
1 | # 设定水印位置x坐标30、y坐标10 |
画中画
在FFmpeg中,可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。尤其是用在图层处理与合并场景中,多数都会与overlay滤镜配合使用。
overlay滤镜的参数:
1 | # 将sub.mp4视频文件缩放成宽480、高320的视频,然后显示在视频input.mp4的x坐标为0、y坐标为0的位置。 |
多宫格展示:
1 | # 通过nullsrc创建一个640x480的overlay画布,base、upperleft、upperright、lowerleft、lowerright为创建的临时标记名,对应整体、左上、右上、左下、右下的视频流。然后将4个视频分别插入到base、tmp1、tmp2、tmp3之后。 |
视频抠图合并
可以把视频的图像中指定的颜色(或者在一定相似度范围内)的像素替换成透明色,把符合条件的像素抠掉,再替换成其他背景的图片或视频,来实现虚拟背景直播等场景。
可使用chromakey滤镜来处理这种情况,主要处理YUV数据,所以一般来说做绿幕处理更有优势。
也可使用colorkey参数,主要处理处理RGB的纯色数据。
1 | # input_0.mp4为虚拟背景,input_1.mp4为背景色相对固定的视频(比如背景是绿幕)。抠出input_1.mp4中的人物等,放到虚拟背景上合成新的视频 |
3D视频处理
VR推出时,配备的头戴设备也随之推出,出现了左右眼的问题。FFmpeg通过stereo3d滤镜方式实现3D效果。
1 | #使用黄蓝眼镜观看 |
视频截图
对视频内容进行分析时,需要对视频定时截图。
1 | # 定位到视频的第7秒位置,获得对应的视频帧,然后将图像解码出来编码成RGB24的图像并封装成PNG图像 |
FFmpeg的fps滤镜是可以在间隔时间获得图片。
1 | # 每隔一秒生成一张png图片 |
另外,还可以判断图像类型是否为I帧,如果是I帧则会生成一张PNG图像
1 | $ ffmpeg -i input.mp4 -vf "select='eq(pict_type, PICT_TYPE_I)'" -vsync vfr img/idr_%04d.png |
视频测试元数据生成
可以通过FFmpeg虚拟设备虚拟出来一个输入视频流,可以通过FFmpeg模拟多种视频源:allrgb、allyuv、color、haldclutsrc、nullsrc、rgbtestsrc、smptebars、smptehdbars、testsrc、testsrc2、yuvtestsrc。
1 | # 生成长度为5.3秒、图像大小为QCIF分辨率、帧率为25fps的视频图像数据,并编码成为H.264 |
视频倍速处理
在音视频处理中,音视频的倍速处理,如2倍速播放、4倍速播放,常见的处理方式包含跳帧播放与不跳帧播放,两种处理方式FFmpeg均可支持,跳帧处理方式的用户体验稍差一些,我们尽量使用不跳帧的倍速播放。
视频倍速处理采用setpts滤镜。
1 | # 半速处理 |
三、FFmpeg音频流滤镜
FFmpeg可以对音频进行操作,例如拆分声道、合并多声道为单声道、调整声道布局、调整音频采样率等。而进行音频的拆分与合并,在FFmpeg中可以通过amix、amerge、pan、channelsplit、volume、volumedetect等滤镜进行常用的音频操作。
声道布局
先理解下声道布局支持情况。
1 | # front前置、back后置、side中置 |
双声道合并单声道
1 | # 看到input.aac是stereo布局,即有FL和FR两个声道。在同一个流Stream#0中。 |
双声道提取
1 | # 将音频为stereo的布局提取为两个mono流,输出左声道一个流,输出右声道一个流。 |
双声道转双音频流
FFmpeg不但可以将双声道音频提取出来生成两个音频文件,还可以将双声道音频提取出来转为一个音频文件两个音频流,每个音频流为一个声道。
1 | # 从输出可以清楚看到只有1个output,Stream有2个。大多数播放器在默认情况下会播放第一个音频Stream。 |
单声道转双声道
1 | # 其实是伪双声道,可使用下面两个音频源合并成真正的双声道 |
两个音频源合并双声道
1 | $ ffmpeg -i left.aac -i right.aac -filter_complex "[0:a][1:a]amerge=inputs=2[aout]" -map "[aout]" -acodec aac output_stereo.mka |
多个音频合并为多声道
1 | $ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[aout]" -map "[aout]" output.wav |
音频音量探测
1 | # 音频的平均大小mean_volume,即-18.3dB |
音频波形
1 | # 将会生成一个宽高为640×120大小的output.png图片,图片内容为音频波形 |
1 | # 可以使用showwavepic与split_channel滤镜配合绘制出不同的单个声道的波形图 |
音频测试元数据生成
可以通过lavfi虚拟音频源的abuffer、aevalsrc、anullsrc、flite、anoisesrc、sine滤镜生成音频流。
1 | # 使用abuffer生成 |
音频倍速处理
音频倍速处理使用atempo滤镜,只有一个参数:tempo,将这个参数的值设置为浮点型,取值范围从0.5到2。0.5则是原来速度的一半,调整为2则是原来速度的2倍速。
1 | # 2倍速处理 |
四、FFmpeg字幕滤镜
为视频添加字幕的分为2种:
- 将字幕编码进入视频流,和视频增加水印相似
- 在封装容器中加入字幕流
ASS字幕流写入视频流
使用FFmpeg可以将字幕流写入视频流,通过ASS滤镜即可,首先需要将视频流进行解码,然后将ASS字幕写入视频流,编码压缩之后再进行容器封装即可。
如下为一个ASS字幕。
1 | [Script Info] |
1 | # 将字幕写入视频流,可以看到输出Video和Audio两个流,没有字幕流(因为写入了视频流)。 |
ASS字幕流写入封装容器
1 | # output.mkv文件将会包含三个流,分别为视频流、音频流以及字幕流。 |
单独封装成字幕流的好处是,可以随时修改替换。
1 | # 将原有input.mp4中的视频流和音频流,以及input.ass中的字幕流进行合成 |
https://www.jianshu.com/p/32e1ca5432e1 FFmpeg Basics》中文版-09-overlay-画中画