ffmpeg的简单使用

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 \isin \text{自然数} )循环执行 n 次,n 值自定,n=0 时\infty 次循环

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 设置为原来的121 \over 2 进行裁剪

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

缩放至原来视频画面的121 \over 2

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] 是视频流和两个音频流的名字


  1. https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax ↩︎

  2. https://ffmpeg.org/ffmpeg.html ↩︎

  3. https://ffmpeg.org/ffmpeg-filters.html ↩︎


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至feicyblog@hotmail.com