FFmpeg命令行滤镜使用

对视频的滤镜处理还是很有吸引力的,因为可以做出各种比较炫酷的视频效果。这篇学习使用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添加纯字母水印使用drawtext滤镜来做:
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滤镜的使用。

  • movie滤镜使用
ffmpeg -i input.mp4 -vf "movie=logo.png[wm]; [in][wm]overlay=30:10[out]" output.mp4

执行这条命令的时候注意把input.mp4路径写为绝地路径以后,logo.png不用写为绝地路径,因为它还报错。可能是可以通过找到视频然后自然找视频下面的图片吧。

  • movie滤镜和colorkey滤镜做成半透明效果
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
  • 通过nullsrc创建一个overlay画布,画布大小为宽640,高480
  • 使用[0:v][1:v][2:v][3:v]将输入的4个视频流去除,分别进行缩放处理为宽320,高240的视频
  • 基于nullsrc生成的画布进行视频平铺

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生成音视频测试流
ffmpeg -re -f lavfi -i abuffer=sample_rate=44100:sample_fmt=s16p:channel_layout=stereo -acodec aac -y output.aac

以上命令生成测试音频流失败,原因未知

  • FFmpeg生成视频测试流
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 
  • 2倍速处理
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
  • 2倍速处理
ffmpeg -i input.mp4 -filter_complex "setpts=PTS/2" output.mp4

猜你喜欢

转载自blog.csdn.net/lyman_ye/article/details/80415627