0 写在最前面
如果你想系统了解FFmpeg,可以完整阅读本文章、查找相关资料,欢迎在评论区讨论。
如果你只想使用FFmpeg完成某项任务,具有操作命令行的基本功,但以前又没有使用过FFmpeg,或者是被我发了个链接来到这里,可以直接阅读第1节、第2节,并在第4节查阅。
如果你不会命令行,建议学习,或使用格式工厂之类的软件(但会有较大限制,例如转GIF功能就不好用)。
1 简介
FFmpeg(Fast Forward mpeg)是一款开源免费工具,可以轻易地实现多种视频格式之间的相互转换。其名称来自MPEG视频编码标准,是一套可以用来记录、转换数字音频、视频,并能将其转化为流的计算机程序。
2 下载和配置
2.1 下载地址
【推荐】戴维难云盘下载:FFmpeg-5.1.2-full_build.zip
官网下载:Download FFmpeg
官网下载说明:
打开官网下载地址,点击Windows图标,点击“Windows builds from gyan.dev”,如图所示:

在新打开的网页中,找到“release builds”,点击“ffmpeg-release-essentials.zip”,即可开始下载。

2.2 配置
解压缩下载的文件,如图所示:

打开“bin”文件夹,里面有3个文件:ffmpeg.exe、ffplay.exe和ffprobe.exe。复制这3个文件,粘贴到C:\Windows目录下即可完成配置。

3 参数
FFmpeg命令的基本形式:
ffmpeg [全局参数] {[输入文件参数] -i 输入文件地址} ... {[输出文件参数] 输出文件地址} ...
最基本、最常用的:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
要注意的是,所有的参数仅仅对仅接下来的文件有效(下一个命令得把参数再写一遍)。
所有没有使用 -i 指定的文件都被认为是输出文件。FFmpeg可以接受多个输入文件并输出到指定的位置。你也可以将输入输出都指定为同一个文件名,不过此时需要在输出文件前使用 -y 。
常用的参数及其作用:
参数 | 作用 |
---|---|
-an | 去除音频 |
-vn | 去掉视频 |
-f | 输出格式(视频转码) |
-g | 关键帧间隔控制(视频跳转需要关键帧) |
-s | 设定画面的宽和高,分辨率控制 |
-i | 设定输入流 |
-ss | 指定开始时间 |
-t | 指定持续时间 |
-b | 设定视频流量,默认是200Kbit/s |
-aspect | 设定画面的比例 |
-r | 提取图像频率 |
-y | 输出时覆盖输出目录已存在的同名文件 |
-vf | 视频过滤器 |
4 示例
4.1 基本操作
(1)获得媒体文件的信息
ffmpeg最简单的使用就是用来显示文件信息,视频和音频文件都可以使用:
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
(2)转换媒体文件格式
ffmpeg可以轻松地在不同媒体格式之间进行自由转换:
ffmpeg -i video_input.mp4 video_output.avi
ffmpeg -i video_input.webm video_output.flv
ffmpeg -i audio_input.mp3 audio_output.ogg
ffmpeg -i audio_input.wav audio_output.flac
也可以同时指定多个输出后缀,这样就会输出多个文件:
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
想看支持的格式,可以使用:
ffmpeg -formats
你可以在输出文件前使用 -qscale 0 来保留原始的视频质量:
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
(3)从视频中抽取音频
为了从视频文件中抽取音频,直接加一个 -vn 参数就可以了:
ffmpeg -i video.mp4 -vn audio.mp3
(4)让视频静音
可以使用 -an 来获得纯视频:
ffmpeg -i video_input.mp4 -an -video_output.mp4
(5)从视频中提取图片
比如你可能有一些幻灯片,你想从里面提取所有的图片,那么下面这个命令就能帮你:
ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
解释:
-r 代表帧率(一秒内导出多少张图像,默认25), -f 代表输出格式(image2 实际上 image2 序列的意思)。
最后一个参数(输出文件)的命名使用了 %3d 来指示输出的图片有三位数字 (000,001,等等),也可以用 %2d(两位数字)或者 %4d(四位数字),当然也有其他写法。
(6)更改视频分辨率或长宽比
使用 -s 参数来缩放视频:
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
也可以使用 -aspect 来更改长宽比:
ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
(7)压缩媒体文件
有多种方法可以压缩文件体积,但是文件压缩的太厉害会让文件质量显著降低。
对于音频文件,可以降低比特率(使用 -b:a 或 -ab):
ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
常用的比特率有:96k,112k,128k,160k,192k,256k,320k。数值越大,文件体积越大。
对于视频文件,最推荐的方法是使用 -crf 参数(恒定质量因子)。crf 越小,码率越大。crf 设置为 20 到 30 是最常见的,当然也可以尝试一些其他的值(我个人用24最多):
ffmpeg -i video_input.mp4 -crf 24 video_output.mp4
也可以降低视频比特率(通过 -b:v):
ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
降低帧率也有效果,不过这会让视频看起来很卡:
ffmpeg -i video_input.mp4 -r 24 video_output.mp4
-r 表示输出视频帧率(这里是 24)。
(8)裁剪媒体文件
想要从开头开始剪辑一部分,使用 -t 参数来指定时间:
ffmpeg -i input_video.mp4 -t 5 output_video.mp4
ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
该参数对音频和视频都适用。以上两个命令做了相同一件事:保存一段5s的输出文件(从文件开头开始算)。上面使用了两种不同的表示时间的方式,一个单纯的数字,另一个是 HH:MM:SS (时:分:秒)。第二种方式实际上指示了结束时间。
也可以通过 -ss 给出一个开始时间,-to 给出结束时间:
ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
可以看到 开始时间(-ss HH:MM:SS),持续秒数(-t duration),结束时间(-to HH:MM:SS),和开始秒数(-s duration)的用法。
4.2 进阶操作
(1)分割媒体文件
只需要为每个输出文件分别指定开始时间、结束或者持续时间就可以了,例如:
ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4
语法很简单,这个例子中为第一个文件指定了 -t 00:00:30 作为持续时间(第一个部分是原始文件的前30秒内容),然后指定接下来的所有内容作为第二个文件(从第一部分的结束时间开始,也就是 00:00:30)。
该功能也适用用音频文件。
(2)拼接媒体文件
为了实现多个媒体文件的合并,需要先创建一个文本文件(例如 videos_to_join.txt ),把需要合并的文件路径写入,例如:
/test/video_1.mp4
/test/video_2.mp4
/test/video_3.mp4
然后使用下面的命令:
ffmpeg -f concat -i videos_to_join.txt output.mp4
这样,videos_to_join.txt 里的所有文件都会被拼接成一个独立的文件了。
(3)录制屏幕
可以通过 ffmpeg 录制屏幕,将格式 -f 设定为 x11grab,就会抓取你的 XSERVER。输入的话可以是屏幕编号(一般都是0:0). 抓取是从左上角开始计算的,可以指定屏幕分辨率 -s,一般笔记本电脑都是 1920×1080。 注意屏幕分辨率硬在输入之前指定 t :
ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4
按 q 或者 Ctrl+C 可以结束录制屏幕。
如果不知道屏幕分辨率大小,可以通过命令获得真实的分辨率:
-s $(xdpyinfo | grep dimensions | awk '{print $2;}')
完整的命令这么写:
ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4
@echo off
::在下方设置要处理的视频或音频格式,这里列出了一些主要的视频格式
set Ext=*.mp4
md output
echo 开始转换
::在下方设置输出格式,这里输出为mp4,可自行更改
for %%a in (%Ext%) do (
echo 正在转换:%%a
ffmpeg -i "%%a" -vf scale=160:112 "output\%%~na.gif" -y
)
echo 搞好了
pause
Comments NOTHING