ffmpeg 是一个非常实用的工具,处理多媒体文件必备,以下命令基于 ffmpeg 执行环境成功搭建配置。
常用选项
信息参数
参数 | 说明 |
---|---|
-version | 显示版本 |
-formats | 显示可用的格式(包括设备) |
-demuxers | 显示可用的 demuxers |
-muxers | 显示可用的 muxers |
-devices | 显示可用的设备 |
-codecs | 显示 libavcodec 已知的所有编解码器 |
-decoders | 显示可用的解码器 |
-encoders | 显示所有可用的编码器 |
-bsfs | 显示可用的比特流 filter |
-protocols | 显示可用的协议 |
-filters | 显示可用的 libavfilter 过滤器 |
-pix_fmts | 显示可用的像素格式 |
-sample_fmts | 显示可用的采样格式 |
-layouts | 显示 channel 名称和标准 channel 布局 |
-colors | 显示识别的颜色名称 |
主要选项
-f fmt(输入 / 输出)
强制输入或输出文件格式。通常会自动为输入文件检测格式,并从输出文件的文件扩展名中猜测格式,因此在大多数情况下不需要此选项。
-i url(输入)
输入文件 URL
-y(全局)
覆盖输出文件而无需询问。
-n(全局)
不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出。
-stream_loop 数值(输入)
设置输入流应循环的次数。循环 0 表示无循环,循环 - 1 表示无限循环。
-c [:stream_specifier] 编解码器(每个流的输入 / 输出)
-codec [:stream_specifier] 编解码器 编解码器(输入 / 输出,每个流)
为一个或多个流选择编码器(在输出文件之前使用)或解码器(在输入文件之前使用)。编解码器是解码器 / 编码器的名称,或者是特殊值 copy(仅用于输出),用于指示将不对流进行重新编码。
-t 持续时间(输入 / 输出)
-to 和 - t 是互斥的,并且 - t 具有优先级。
-to 位置 (input/output)
在位置停止写入输出或读取输入。
-fs limit_size(输出)
设置文件大小限制,以字节为单位。超出限制后,不再写入更多字节。输出文件的大小略大于请求的文件大小。
-ss 位置(输入 / 输出)
当用作输入选项(之前 - i)时,在此输入文件中搜索到指定位置。请注意,在大多数格式中,无法精确搜索,因此 ffmpeg 将搜索到指定位置之前最接近的搜索点。当转码和 -accurate_seek
启用(默认),则搜索点和位置之间的此额外片段将被解码并丢弃。何时进行流复制或何时 -noaccurate_seek
使用,它将被保留。
当用作输出选项时(在输出 url 之前),将解码但丢弃输入,直到时间戳到达指定位置为止。
指定位置的参数必须是持续时间规范[1]
-sseof 位置(输入)
类似于 -ss
选项,但位于 “文件结束”。That is negative values are earlier in the file, 0 is at EOF.[2]
......
视频选项
-vframes 数值(输出)
设置要输出的视频的帧数。对于 -frames:v
,这是一个过时的别名,您应该使用它
-r [:stream_specifier] fps(输入 / 输出,每个流)
设置帧频(Hz 值,分数或缩写)。
-aspect [:stream_specifier] aspect (输出,每个流)
设置由指定的视频显示宽高比方面。
Aspect 可以是浮点数字符串,也可以是 num:den 形式的字符串,其中 num 和 den 是纵横比的分子和分母。例如,“4:3”,“ 16:9”,“ 1.3333” 和 “ 1.7777” 是有效的参数值。
如果与 -vcodec copy
,它将影响存储在容器级别的纵横比,但不会影响存储在编码帧中的纵横比。
-vcodec 编解码器(输出)
设置视频编解码器。别名 -codec:v
。
-vf filtergraph(输出)
创建 filtergraph 指定的 filtergraph 并使用它过滤流。别名 -filter:v
。
-autorotate
根据文件元数据自动旋转视频。默认启用,使用 -noautorotate
禁用它。
-autoscale
根据第一帧的分辨率自动缩放视频。默认启用,使用 -noautoscale
禁用它。禁用自动缩放后,过滤器图形的所有输出帧可能不会具有相同的分辨率,并且可能不足以支持某些编码器 / 复用器。因此,除非您真的知道自己在做什么,否则不建议禁用它。禁用自动缩放功能后果自负。
音频选项
-aframes 数值 (输出)
设置要输出的音频的帧数。对于 -frames:a
,这是一个过时的别名,您应该使用它
-ar [:stream_specifier] freq(输入 / 输出,每个流)
设置音频采样频率。对于输出流,默认情况下将其设置为相应输入流的频率。对于输入流,此选项仅对音频捕获设备和原始多路分配器有意义,并映射到相应的多路分配器选项。
-aq q(输出)
设置音频质量(特定于编解码器的 VBR)。别名 -q:a
-ac [:stream_specifier] 通道(输入 / 输出,每个流)
设置音频通道数。对于输出流,默认情况下将其设置为输入音频通道的数量。对于输入流,此选项仅对音频捕获设备和原始多路分配器有意义,并映射到相应的多路分配器选项。
-acodec 编解码器(输入 / 输出)
设置音频编解码器。别名 -codec:a
-sample_fmt [:stream_specifier] sample_fmt(输出,每个流)
设置音频样本格式。
-af filtergraph(输出)
创建 filtergraph 指定的 filtergraph 并使用它过滤流。别名 -filter:a
字幕选项
-scodec 编解码器(输入 / 输出)
设置字幕编解码器。别名 -codec:s
常用命令
纯转格式
ffmpeg -i ./input.avi output.mp4
-i 后带是输入文件路径
输出文件的路径前面不需要带任何参数符
调整视频质量
输出 avi 格式时
ffmpeg -i ./input.mp4 -q 23 output.avi
-q 通常设置 20~23,-q 的值越大,视频的质量越差且体积越小,反之视频的质量越好且体积越大。
注意:是转 avi 格式时有效,对 mp4 格式无效
输出 mp4 格式时
ffmpeg -i input.avi -crf 18 output.mp4
调整比特率
调整音频时
ffmpeg -i input.mp3 -b:a 128k output.mp3
调整视频时
ffmpeg -i input.avi -b:v 2000k output.mp4
同时调整
ffmpeg -i input.avi -b:v 2000k -b:a 320k output.mp4
切割视频
从视频开始持续 6 分钟结束:
ffmpeg -i input.mp4 -ss 00:00:00 -t 00:06:00 -acodec copy -vcodec copy output.mp4
从视频第 1 分钟开始到 6 分 12 秒结束:
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:06:12 -acodec copy -vcodec copy output.mp4
其它
webp 动图循环,-loop n( )循环执行 n 次,n 值自定,n=0 时 次循环
ffmpeg -i input.gif -loop 0 output.webp
使用过滤器
ffmpeg 里有很多的过滤器,不同的过滤器对不同媒体流有不同的影响。
ffmpeg 过滤器由 libavfilter 库提供。
在 libavfilter 里,一个过滤器可以有多个输入和输出,为了尽可能说明各种可能出现的情况,我们思考以下过滤器执行图为例
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
此图将输入流分成两个流,其中 tmp 流通过 crop 和 vflip 过滤器,然后返回到上面通过 overlay 与 main 合并输出。您可以用以下命令实现:
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
效果是把原视频的上半部分镜像并覆盖到下半部分。
同一条线的过滤器用 ,
分隔,而不同线的过滤器由 ;
分隔(注意是英文符号)。在上面的示例中,crop、vflip 在同一条线中,split 和 overlay 在另一条线中。两条线交点由方括号内的 [名称]
标记。在该示例中,split 过滤器拆分成两个 [main] 和 [tmp] 标签线并联输出。[3]
调整音量
volume 参数值是乘数,这里意思是把声音放大到原来的两倍
ffmpeg -i INPUT -filter:a "volume=2" OUTPUT
-filter:a
可以简写为 -af
ffmpeg -i INPUT -af "volume=2" OUTPUT
重新映射声道
这里把只有左声道的假立体声重置为左右双声道立体声
ffmpeg -i INPUT -af "channelmap=0-0|0-1" OUTPUT
画面裁剪
其中 x 与 y 的值是可选项,如果省略 x,y,位置为原视频中央画面
ffmpeg -i INPUT -filter:v "crop=w=640:h=480:x=200:y=200" OUTPUT
把 w 和 h 设置为原来的 进行裁剪
ffmpeg -i INPUT -filter:v "crop=w=1/2*in_w:h=1/2*in_h" OUTPUT
-filter:v
也可以简写成 -vf
ffmpeg -i INPUT -vf "crop=w=1/2*in_w:h=1/2*in_h" OUTPUT
画面缩放
直接按值设置
ffmpeg -i INPUT -vf "scale=w=640:h=480" OUTPUT
缩放至原来视频画面的
ffmpeg -i INPUT -vf "scale=w=1/2*in_w:h=1/2*in_h" OUTPUT
按比例缩放
ffmpeg -i INPUT -vf "scale=w=640:h=-1" OUTPUT
画面旋转
画面顺时针旋转 90°
ffmpeg -i INPUT -vf "rotate=90*PI/180" OUTPUT
使用复合过滤器
-lavfi
等效于 -filter_complex
导出音频的频谱图
导出 audio.flac 的频谱图,内部画面设置 1024×1024 像素,主调色设置为绿色
ffmpeg -i audio.flac -lavfi showspectrumpic=s=1024x1024:color=green spectrogram.png
颜色参数有:channel、intensity、rainbow、moreland、nebulae、fire、fiery、fruit、cool、magma、green、viridis、plasma、cividis、terrain
导出音频的波形图
导出 audio.flac 的波形图,设置通道为分开展示(默认值为 0),画面设置 1024×1024 像素(默认值为 600x240),第一声道颜色设置为雅绿色,第二声道设置为黄色
ffmpeg -i INPUT -lavfi showwavespic=split_channels=1:s=1024x800:colors="#1ABC9C|yellow" waveform.png
视频拼接
ex: 将双语版的 opening.mkv、episode.mkv、ending.mkv(流 0 中的视频、流 1 和流 2 中的音频)拼接在一起
最好先查看视频的信息,这里假设打开的目录存在这些文件,执行如下命令
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv
查看每个 Stream #后的数字,可能是
Stream #0:0 : Video ...
...
Stream #0:1 : Audio ...
...
Stream #0:2 : Audio ...
...
Stream #1:0 : Video ...
......
拼接命令如下:
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -lavfi "[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2] concat=n=3:v=1:a=2 [v] [a1] [a2]" -map "[v]" -map "[a1]" -map "[a2]" output.mkv
其中 [0:0] [0:1]...[2:2] 表示第 1~3 个输入文件的视频,音频 1,音频 2,concat=n=3:v=1:a=2 表示有 3 个输入文件,输出一条视频流和两条音频流,[v][a1][a2] 是视频流和两个音频流的名字
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至feicyblog@hotmail.com