对视频的滤镜处理还是很有吸引力的,因为可以做出各种比较炫酷的视频效果。这篇学习使用FFmpeg命令行来简单的操作制作视频的滤镜效果。
Filter
Filter的参数排列格式为:
输入流或标记名
滤镜参数
临时标记
输入流或标记名
滤镜参数
临时标记名
看一个命令行示例:
ffmpeg -i input.mp4 -i logo.png -filter_complex "[1:v]scale=176:144[logo];[0:v][logo]overlay=x=0:y=0" output.mp4
上面实现功能输入两个文件,一个视频一个图片,将图片缩放然后放在视频的左上角。
FFmpeg视频添加水印文字水印
ffmpeg -i input.mp4 -vf "drawtext=fontsize=30:fontfile=/System/Library/Fonts/SFNSText.ttf:text="Lyman":x=20:y=35" output.mp4
如果没有安装freetype库会报drawtext滤镜库找不到的错误,安装一下这个库就可以了,然后是字体路径要使用系统存在的字体。
ffmpeg -i input.mp4 -vf "drawtext=fontsize=30:fontfile=/System/Library/Fonts/SFNSText.ttf:text="Lyman":fontcolor=red:x=20:y=35" output.mp4
ffmpeg -i input.mp4 -vf "drawtext=fontsize=30:fontfile=/System/Library/Fonts/SFNSText.ttf:text="Lyman":fontcolor=red:box=1:boxcolor=yellow:x=20:y=35" output.mp4
ffmpeg -i input.mp4 -vf "drawtext=fontsize=30:fontfile=/System/Library/Fonts/SFNSText.ttf:text='%{localtime:%Y-%m-%d %H-%M-%S}':fontcolor=red:box=1:boxcolor=yellow:x=20:y=35" output.mp4
ffmpeg -i input.mp4 -vf "drawtext=fontsize=30:fontfile=/System/Library/Fonts/SFNSText.ttf:text='%{localtime:%Y-%m-%d %H-%M-%S}':fontcolor=red:enable=lt(mod(t,3),1):box=1:boxcolor=yellow:x=20:y=35" output.mp4
FFmpeg添加图片水印
为视频添加图片水印可以使用movie滤镜来完成,开始的时候我们使用了filter滤镜也可以添加图片水印。现在主要了解movie滤镜的使用。
ffmpeg -i input.mp4 -vf "movie=logo.png[wm]; [in][wm]overlay=30:10[out]" output.mp4
执行这条命令的时候注意把input.mp4路径写为绝地路径以后,logo.png不用写为绝地路径,因为它还报错。可能是可以通过找到视频然后自然找视频下面的图片吧。
ffmpeg -i input.mp4 -vf "movie=logo.png,colorkey=black:1.0:1.0 [wm]; [in][wm]overlay=30:10[out]" output.mp4
FFmpeg视频多宫格
ffmpeg -re -i ~/Movies/i_am_you.mp4 -re -i ~/Movies/i_am_you.mp4 -re -i ~/Movies/i_am_you.mp4 -re -i ~/Movies/i_am_you.mp4 -filter_complex "nullsrc=size=640x480 [base];[0:v] setpts=PTS-STARTPTS,scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS,scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS,scale=320x240 [lowerleft];[3:v] setpts=PTS-STARTPTS,scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1[tmp1];[tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft]overlay=shortest=1:y=240 [tmp3];[tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 ~/Movies/output.flv
FFmpeg音频流滤镜
上面我们了解了一些FFmpeg对视频的滤镜处理,它还可以对音频进行滤镜处理。
双声道合并单声道
ffmpeg -i input -ac 1 output.aac
input的布局方式为stereo为FL和FR两个声道,通过ac输出output.aac为单声道mono布局
双声道提取
提取方式为将音频stereo的布局提取为两个mono流,左声道一个流,右声道一个流,使用map_channel参数实现。
ffmpeg -i input.aac -map_channel 0.0.0 left.aac -map_channel 0.0.1 right.aac
双声道转双音频流
FFmpeg可以将双声道音频提取出来转为一个音频文件两个单声道的音频流。
ffmpeg -i input.aac -filter_complex channelsplit=channel_layout=stereo output.mka
单声道转双声道
把一个只要mono布局的音频文件转为stereo布局的音频文件
ffmpeg -i left.aac -ac 2 output.m4a
两个音频源合并双声道
ffmpeg -i left.aac -i right.aac -filter_complex "[0:a][1:a] amerge=inputs=2[aout]" -map "[aout]" output.mka
音频音量获取
ffmpeg -i output.wav -filter_complex volumedetect -c:v copy -f null /dev/null
绘制音频波形
使用showwavespic滤镜来绘制音频的波形图
ffmpeg -i output.wav -filter_complex "showwavespic=s=640x120" -frames:v 1 output.png
这个绘制是整个音频的波形图,可以绘制出每个声道的音频的波形图
ffmpeg -i output.wav -filter_complex "showwavespic=s=640x120:split_channels=1" -frames:v 1 output.png
FFmpeg为视频加字幕
为视频添加字幕的方式大致分为两种
ASS字幕流写入视频流
使用FFmpeg将字幕流写入视频流,可以通过ASS滤镜实现,先将视频流进行解码,然后将ASS字幕写入视频流,编码压缩之后再进行容器封装。
ffmpeg -i input.mp4 -vf ass=t1.ass -f mp4 output.mp4
ASS字幕流写入封装容器
ffmpeg -i input.mp4 -i t1.ass -acodec copy -vcodec copy -scodec copy output.mkv
如果原来的输入文件有字幕流,我们希望使用我们自己的字幕流,可以使用map将对应的字幕流指定封装进去。
ffmpeg -i input.mp4 -i t1.ass -map 0:0 -map 0:1 -acodec copy -vcodec copy -scodec copy output.mkv
FFmpeg视频抠图合并
FFmpeg可以进行视频抠图与背景视频合并操作,使用chromakey。由于这条命令要一个背景比较明显的视频,然后扣出我们需要的部分贴到另外一个视频上面,我没有合适的素材,没有检验这条命令:
ffmpeg -i input.mp4 -i input_green.mp4 -filter_complex "[1:v]chromakey=Green:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mp4
FFmpeg 3D视频处理
VR视频经常看到左右眼的3D视频效果,可以左右眼观看。stereo3d滤镜可以将左右眼视频转变为红蓝眼视频观看。
ffplay -vf "stereo3d=sbsl:aybd" input.mp4
FFmpeg定时视频截图
通过vframe截取指定位置的一张图片
ffmpeg -i input.flv -ss 00:00:7.423 -vframes 1 output.png
fps滤镜定时获取图片
ffmpeg -i input.flv -vf fps=1 out%d.png
每隔一秒截取一张图片,其中参数fps=1/60,fps=1/600则代表每隔一分钟截取一张图片和每隔十分钟截取一张图片。
安装关键帧截取图片
ffmpeg -i input.flv -vf "select='eq(pict_type,PICT_TYPE_I)'" -vsync vfr thumb%04d.png
FFmpeg生成测试元数据
FFmpeg不尽可以处理处理音视频文件,还可以生成音视频文件,可以通过lavfi设备虚拟音视频源数据
ffmpeg -re -f lavfi -i abuffer=sample_rate=44100:sample_fmt=s16p:channel_layout=stereo -acodec aac -y output.aac
以上命令生成测试音频流失败,原因未知
ffmpeg -re -f lavfi -i testsrc=duration=5.3:size=qcif:rate=25 -vcodec libx264 -r:v 25 output.mp4
命令执行后根据testsrc生成长度为5.3秒,图像大小为QCIF分辨率,帧率为25fps,编码为H.264的视频图像数据。
FFmpeg音视频倍速处理
FFmpeg可以对音频和视频进行倍速播放操作
atempo音频倍速处理
ffmpeg -i input.wav -filter_complex "atempo=tempo=0.5" -acodec aac output.aac
ffmpeg -i input.wav -filter_complex "atempo=tempo=2.0" -acodec aac output.aac
setpts视频倍速处理
ffmpeg -re -i input.mp4 -filter_complex "setpts=PTS*2" output.mp4
ffmpeg -i input.mp4 -filter_complex "setpts=PTS/2" output.mp4
评论(0)