NDK模块开发:音视频处理工具FFmpeg的基本字符命令

前言

FFmpeg是非常强大的音视频处理工具,我们可以使用它来处理视频合成、剪辑、加特效等等操作。

关于音视频是什么,可以看一下这篇文章:NDK模块开发:关于音视频,你所需要了解的东西

FFmpeg的官方文档命令真的是太多太多,而且都是英文,感觉精通完这些命令,都够学一门新语言了!

SO 为了让一些小伙伴们快速的用上FFmpeg,我整理了一些FFmpeg的常用的知识和大部分日常用到的命令供大家查阅!

还不收藏吗?废话不多说上干货!

NDK模块开发:音视频处理工具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学习的话,可以看相关资料,需要相关内容点这里

NDK模块开发:音视频处理工具FFmpeg的基本字符命令

NDK模块开发:音视频处理工具FFmpeg的基本字符命令