温馨提示:本文最后更新于2023年6月2日,已超过 30 天没有更新,某些文章具有时效性,若有错误或已失效,请在下方留言!

0 写在最前面

如果你想系统了解FFmpeg,可以完整阅读本文章、查找相关资料,欢迎在评论区讨论。

如果你只想使用FFmpeg完成某项任务,具有操作命令行的基本功,但以前又没有使用过FFmpeg,或者是被我发了个链接来到这里,可以直接阅读第1节、第2节,并在第4节查阅。

如果你不会命令行,建议学习,或使用格式工厂之类的软件(但会有较大限制,例如转GIF功能就不好用)。

1 简介

官网:https://ffmpeg.org/

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
最后更新于 2023-06-02