FFmpeg是非常强大的音视频处理工具,我们可以使用它来处理视频合成、剪辑、加特效等等操作。
关于音视频是什么,可以看一下这篇文章:NDK模块开发:关于音视频,你所需要了解的东西
FFmpeg的官方文档命令真的是太多太多,而且都是英文,感觉精通完这些命令,都够学一门新语言了!
SO 为了让一些小伙伴们快速的用上FFmpeg,我整理了一些FFmpeg的常用的知识和大部分日常用到的命令供大家查阅!
还不收藏吗?废话不多说上干货!
-i 输入文件的地址
-y 表示直接覆盖已经存在的输出文件
-n 表示若某个输出文件已经存在则退出(若没有设置-y或-n选项,且某个输出文件已经存在ffmpeg会询问是否要覆盖输出文件)
-codec(-c) 指定输入输出的解码编码器 copy 则将输入流直接复制到输出流不进行编解码操作
-c:v 或-vcodec 可以为所有视频流指定编码器,-c✌️1为第2个视频流指定编解码器。xvid(使用XVID编码压缩视频,不能改的)
-c:a 或-acodec 可以为所有音频流指定编码器,-c️12为第13个视频流指定编解码器。
-pixel_format/-pix_fmt 指定转换格式 例:yuv420p
-vol 音量
-ss 选项用于设置流的开始时间,可以设置输入输出或者滤镜。在开始时间之前的帧将被跳过不被处理(输入不被解码,输出不被编码,滤镜不被处理)。
例:ffmpeg -ss 2 -t 10 -i test.mp4 test.mov
时长的格式:如-t 10, -t 23.167 时分秒: 如-t 10:23, -t 21:31:00.233
-t 选项用于用于设置输入输出,-t在-i前可以限制输入时长,-t在输出文件前可以限制输出时长
-to 选项类似于-t选项,不同的是-to指定结束时刻,-t指定持续时间
-f 强制设置输入输出的文件格式,默认情况下ffmpeg会根据文件后缀名判断文件格式
-filter / -filter_complex 使用过滤器对流进行处理 复杂过滤器
-vf 代替-filter:v处理视频流
-af 代替-filter:a处理音频流
-vframes 设置要输出的视频帧的数量: 例:ffmpeg -i test.mp4 -vframes 10 test.mov
-aframes 设置要输出的音频帧的数量。这是-frames:a的一个过时的别名。
-vn 不将视频流写到输出文件中无视频的意思 例:ffmpeg -i test.mp4 -vn -a:c copy out.mp3
-an 不将音频流写到输出文件中无音频的意思 例:ffmpeg -i test.mp4 -v:c copy -an out.mp4
-r 设置某个流的帧率按ffmpeg官方文档说-r与-framerate作用相同,但实际测试时发现不同。-framerate 用于限制输入,而-r用于限制输出 例:ffmpeg -i test.mp4 -r:v 30 test.mov
-s 设置帧的大小 例:ffmpeg -i test.mp4 -s 1080x680 out.mp4
-aspect [:stream_specifier] 宽高比(输出,每个流) 设置方面指定的视频显示宽高比。aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。如果与-vcodec副本一起使用,则会影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。
-threads 设置处理线程数 例:ffmpeg -threads 8 -i test.mp4 out.mp4
-shortest 当最短的输入流结束后即停止编码和输出 例:ffmpeg -i bgm.mp3 -i test.mp4 -shortest output.mp4
-sample_fmts 设置音频采样格式。使用-sample_fmts获取支持的样本格式列表。
-b:a 指定音频码率。 b 是 bitrate的缩写, a是 audio的缩写
-b:v 指定视频码率。 b 是 bitrate的缩写, v是 video的缩写
-loop 循环输入流。只工作于图像流
concat 拼接视频 例:ffmpeg -i “concat:1.mp4|2.mp4|3.mp4” -c copy output.mp4
Filter(滤镜)
复杂过滤器(filter_complex)
过滤器会对已解码的帧进行处理,处理后的帧会被重新编码输出
scale
指定操作源的大小,iw指定按整型取视频的宽度,ih指定按整型取视频的高度。-1为按原图比例变化 例:iw/2:-1视频缩小一倍
overlay
指定操作源摆放的位置 overlay=30:10 main_w和main_h为底层视频的宽和高,overlay_w和overlay_h为叠加视频的宽和高
delogo
删除水印 例:delogo=x=800:y=20:w=70:h=80
crop
裁剪 格式:crop=out_w:out_h: x :y out_w: 输出的宽度。可以使用 in_w 表式输入视频的宽度。 out_h: 输出的高度。可以使用 in_h 表式输入视频的高度。 x : X坐标 y : Y坐标 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪
setpts
setpts=0.5*PTS表示每帧视频的pts时间戳都乘0.5,也就是视频加快一倍
-map
可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。"[v]" 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。
水平翻转hflip
镜像
crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right]
各种特效curves
curves=‘vintage’(复古) ‘strong_contrast’(强对比度)‘lighter’(变亮) ‘negate’(底片) ‘none’ ‘color_negative’(彩色底片);
边缘检测edgedetect
光晕vignette=PI/4
变暗
colorlevels=rimin=0.058:gimin=0.058:bimin=0.058
增加对比度
fftfilt=dc_Y=0:weight_Y='exp(-4 * ((Y+X)/(W+H)))
降噪
hqdn3d=luma_spatial=15.0
锐化
fftfilt=dc_Y=0:weight_Y=‘1+squish(1-(Y+X)/100)’
低通滤波
fftfilt=dc_Y=0:weight_Y=‘squish((Y+X)/100-1)’
高通滤波
fftfilt=dc_Y=128:weight_Y=‘squish(1-(Y+X)/100)’
fade 视频淡入淡出效果
例:fade=in:0:25, fade=out:975:25 从0桢开始淡入25帧,从975开始淡出25帧 fade=in:5:20:color=yellow 开始淡入前为黄色 fade=in:0:25:alpha=1 淡入完成后过去15帧的透明度 fade=t=in:st=5.5:d=0.5 5.5秒开始,淡入0.5秒 d为时长
fps滤镜通过删除帧或者复制帧的方法强制设置帧率 例:ffmpeg -y -i test.mp4 -vf “fps=60” out.mp4
如果你需要深入NDK学习的话,可以看相关资料,需要相关内容点这里。