命令格式的吐槽(请跳过这部分)
ffmpeg和其他Fabrice Bellard写的软件一样。拥有看了让人一头雾水的命令选项。一个命令有起码两种写法。有些更是没有文档可以看。这里使用我认为最短的选项写法。 因为懒
基础选项解释
-i 指定输入文件
不一定非得是输入的视频,还可能是音频,字幕文件,图片等。
-c:a -c:v -c:s 指定对a(音频)v(视频)s(字幕)做什么(转码等)
比如-c:a copy表示原样复制音频轨道(而不是默认的转码)
-vf 视频滤镜, af 音频滤镜
Simple filtergraphs are those that have exactly one input and output, both of the same type (audio or video). They are configured with the per-stream -filter option (with -vf and -af aliases for -filter
(video) and -filter (audio) respectively). Note that simple filtergraphs are tied to their output stream, so e.g. if you have multiple audio streams, -af will create a separate filtergraph for each one.
-ss 指定位置
格式是:
-ss 00:00:15.000分别是HH:MM
或者:
-ss 10+7ms表示10秒加上7毫秒。
-crf
后跟一个整数,控制输出质量。
- 对于
x264:在18和28之间,默认是23 - 对于
x265:默认是28 - 对于
libvpx:没有默认值,取值在0到63之间 - 如果你想用
av1:取值在0到63之间。默认值取决于具体编解码器。
视频质量随着数值减小而增加。(换言之18比23看上去更清晰。)
-preset
同样用于控制质量。常见的:
较慢的预设会带来更好的压缩率,较快的预设会带来更差的压缩。可以是:ultrafast, superfast, veryfast, faster, fast, medium(默认), slow 和 veryslow。总结:按照你的经验选择。 自己看着办
查看视频信息
VLC可以看到一些信息:
使用VLC打开视频。菜单栏->工具->媒体信息或者编解码器信息
ffprobe是一个查看视频信息的不错的工具:
ffprobe input.mp3示例输出:
➜ ~ ffprobe 'くるくるぱぁ-初音ミク for LamazeP - sm24347485.mkv'ffprobe version n8.1.2 Copyright (c) 2007-2026 the FFmpeg developers built with gcc 16 (GCC) configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-amf --enable-avisynth --enable-cuda-llvm --enable-lto --enable-fontconfig --enable-frei0r --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-lcms2 --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libdav1d --enable-libdrm --enable-libdvdnav --enable-libdvdread --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgsm --enable-libharfbuzz --enable-libiec61883 --enable-libjack --enable-libjxl --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libplacebo --enable-libpulse --enable-librav1e --enable-librsvg --enable-librubberband --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpl --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-nvdec --enable-nvenc --enable-opencl --enable-opengl --enable-shared --enable-vapoursynth --enable-version3 --enable-vulkan --disable-decoder=magicyuv libavutil 60. 26.102 / 60. 26.102 libavcodec 62. 28.102 / 62. 28.102 libavformat 62. 12.102 / 62. 12.102 libavdevice 62. 3.102 / 62. 3.102 libavfilter 11. 14.102 / 11. 14.102 libswscale 9. 5.102 / 9. 5.102 libswresample 6. 3.102 / 6. 3.102Input #0, matroska,webm, from 'くるくるぱぁ-初音ミク for LamazeP - sm24347485.mkv': Metadata: COMPATIBLE_BRANDS: isomiso2avc1mp41 MAJOR_BRAND : isom MINOR_VERSION : 512 ENCODER : Lavf62.12.102 Duration: 00:03:27.51, start: 0.000000, bitrate: 2106 kb/s Stream #0:0: Video: h264 (Main), yuv420p(tv, bt709, progressive), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 1k tbn (default) Metadata: HANDLER_NAME : VideoHandler DURATION : 00:03:18.733000000 Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default) Metadata: HANDLER_NAME : SoundHandler DURATION : 00:03:18.763000000 Stream #0:2: Subtitle: ass (ssa) Metadata: DURATION : 00:03:27.510000000关于中间文件
很多时候我们不得不使用中间文件。如果你担心对硬盘写入太多影响寿命,你可以把视频输出到/tmp。
至于Windows,可以用RAMDisk软件。或者如果你只关心自动删除,输出到C:\Users\你的用户名\AppData\Local\Temp也是一个不错的选择。
正片
转换格式
把mp4封装转换为mkv封装:
ffmpeg -i input.mp4 output.mkv如果你不想转码:
ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv这一般情况下会更快。
合并音频和视频
ffmpeg -i input.mp4 -i input.mp3 -c:v copy -c:a copy output.mp4我一般用于抓取B站视频和音频以后手工合并。
提取音频
ffmpeg -i input.avi -vn -c:a copy output-audio.aac这里-vn表示不要输出视频轨道
关于这里的-c:a copy
这里尝试直接复制。取决于目标编码和源编码,可能会不兼容,这时候就必须转码(转码的话删掉这部分就可以了)。
改变音量
把音量变为原来的7倍(大约是+16.9dB):
ffmpeg -i input.mp4 -af volume=7 -c:v copy output.mp4很不幸地,7倍是一个非常大的数值,很有可能会导致削波……
如果你想要尝试添加限制器来避免削波:
ffmpeg -i input.mp4 -af "volume=7,alimiter" -c:v copy output.mp4ffmpeg -i input.mp4 -af loudnorm -c:v copy output.mp4转换视频编码
ffmpeg -i input.mp4 -c:v libx264 -c:a copy -crf 18 output.mp4关于-crf和-preset选项的数值参照前文。
向视频封装中添加字幕文件(外挂字幕)
比如你的字幕文件是subtitles.ass:
ffmpeg -i input.mp4 -i subtitles.ass -c:v copy -c:a copy -c:s copy output.mkv注意mp4封装不支持内置字幕轨道。
烧录字幕(内嵌字幕)
这是把字幕「焊接」到视频帧上:
ffmpeg -i input.mp4 -vf ass=subtitles.ass output.mp4提取视频中的某一帧或者一些帧
如果你想要只提取一帧,VLC可以干这个:用VLC打开视频,调整到你想要的位置,右键视频,选择视频->截图。然后它会提示你保存在哪了,打开那个路径就能看到结果。
提取一帧的ffmpeg版本(这个版本非常准确,因为它允许你指定具体数值):
ffmpeg -i input.mp4 -ss 00:00:10.000 -vframes 1 output.png如果你想要一段内的全部帧:(1到5秒内的所有帧以及11秒到15秒的所有帧)
ffmpeg -i input.mp4 -vf select='between(t,1,5)+between(t,11,15)' output_%d.png注意那两个单引号,逗号在bash中有特别含义。
更改帧大小(缩放视频)
比如你的视频是2560x1440的,你想要缩放到1920x1080
ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4如果你觉得默认的参数输出太糊,想要更高质量:
ffmpeg -i input.mp4 -vf scale=1920:1080 -preset slow -crf 18 output.mp4关于-crf和-preset选项的数值参照前文。
如果你希望保持纵横比,只关心目标宽或高。把另一个设置为-1即可。这是一个例子,等比缩放,让高是1080:
ffmpeg -i input.mp4 -vf scale=-1:1080 -preset slow -crf 18 output.mp4转换视频为.gif(制作赛博琥珀)
在这个问题上,使用ffmpeg的好处是你可以自己任意控制输出质量,达到更好的效果,而不是像大部分在线转换网站一样不给你任何选项。
从视频的第30秒开始,提取3秒的时长,设置帧率为10fps,保持宽高比缩放到320像素宽,让gif循环:(冷知识,gif最初被创造出来的时候是一种图片格式,动图是附带功能)
ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif这里palettegen用于生成调色板,paletteuse用于使用刚刚生成的调色板。更多选项在这里
参考
https://gist.github.com/steven2358/ba153c642fe2bb1e47485962df07c730
https://ffmpeg.org/ffmpeg.html
https://ffmpeg.org/ffmpeg-filters.html
https://ffmpeg.org/ffmpeg-utils.html
https://man.archlinux.org/man/ffmpeg.1.en
https://stackoverflow.com/questions/60257883/is-it-possible-to-change-volume-with-no-reencode-with-ffmpeg
https://superuser.com/questions/323119/how-can-i-normalize-audio-using-ffmpeg
https://superuser.com/questions/490683/cheat-sheets-and-preset-settings-that-actually-work-with-ffmpeg-1-0
部分信息可能已经过时