FFmpeg快速入门:轻松处理视频和音频
FFmpeg 是一个功能强大的开源命令行工具,可让您转换、流式传输、录制和编辑音频和视频文件。它几乎是任何多imedia 操作任务的通用解决方案。
核心概念
在深入研究命令之前,了解一些基本的 FFmpeg 概念会很有帮助:
- 容器(格式):这些是 MP4、MKV、AVI、MOV、MP3、WAV 等文件类型。容器充当包装器,其中包含不同的流(视频、音频、字幕)。
- 编解码器:这些是用于在容器内压缩和解压缩(编码和解码)音频和视频数据的算法。示例包括用于视频的 H.264、H.265、VP9,以及用于音频的 AAC、MP3、Opus。
- 流:媒体文件由一个或多个流组成,通常是一个视频流和一个或多个音频流。FFmpeg 可以单独使用这些流。
安装
首先,通过打开终端或命令提示符并键入以下内容来验证您的系统上是否已安装 FFmpeg:
bash
ffmpeg -version
如果已安装,您将看到版本信息。否则,请按照您的操作系统的说明进行操作。
Windows
- 下载:访问官方 FFmpeg 网站并导航到 Windows 构建部分(例如 gyan.dev)。下载静态版本(例如
ffmpeg-release-full.zip)。 - 解压缩:将下载的 ZIP 文件的内容解压缩到一个简单、易于记忆的位置,例如
C:\FFmpeg。 - 添加到 PATH:您需要将 FFmpeg 文件夹中的
bin目录(例如C:\FFmpeg\bin)添加到系统的 PATH 环境变量中。这允许您从命令提示符中的任何目录运行ffmpeg命令。- 在 Windows 搜索栏中搜索“编辑系统环境变量”。
- 在“系统属性”窗口中,单击“环境变量…”。
- 在“系统变量”下,找到并选择
Path变量,然后单击“编辑…”。 - 单击“新建”并添加 FFmpeg
bin文件夹的路径(例如C:\FFmpeg\bin)。 - 在所有窗口上单击“确定”以保存更改。
- 重新启动命令提示符:关闭并重新打开命令提示符或终端以使更改生效。
macOS
在 macOS 上安装 FFmpeg 的最简单方法是使用 Homebrew,一个包管理器。
- 安装 Homebrew(如果尚未安装):
bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - 安装 FFmpeg:
bash
brew install ffmpeg
Homebrew 将下载 FFmpeg 及其依赖项。
Linux (Ubuntu/Debian)
- 更新包列表:打开终端并更新系统的包列表以确保您获得最新版本。
bash
sudo apt update - 安装 FFmpeg:使用
apt安装 FFmpeg。
bash
sudo apt install ffmpeg
基本 FFmpeg 命令结构
FFmpeg 命令的通用语法是:
bash
ffmpeg [global_options] [input_options] -i input_file [output_options] output_file
-i:指定输入文件。-y:覆盖输出文件而不要求确认。-c:v:设置视频编解码器。-c:a:设置音频编解码器。-c copy:复制流而不重新编码,这样速度更快并保留原始质量,但仅当输出容器支持输入编解码器时才有效。-vn:禁用视频录制(用于提取音频)。-an:禁用音频录制(用于仅提取视频)。
常见用例及示例
以下是一些如何使用 FFmpeg 执行各种多媒体任务的实际示例。
1. 转换视频格式
要将视频从一种格式转换为另一种格式:
-
简单转换(FFmpeg 选择默认值):
bash
ffmpeg -i input.mp4 output.mkv
此命令将input.mp4转换为output.mkv。FFmpeg 将自动选择合适的视频和音频编解码器。 -
指定编解码器:
bash
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mkv
这将使用 H.264 视频编解码器和 AAC 音频编解码器将input.mp4转换为output.mkv。 -
重新封装(在不重新编码的情况下更改容器):
如果您只想更改容器格式而不重新编码视频或音频流(这样速度更快且无损),请使用-c copy。仅当编解码器与新容器兼容时,这才是可能的。
bash
ffmpeg -i input.mp4 -c copy output.mkv
2. 从视频中提取音频
要从视频中获取音频文件:
-
提取音频(FFmpeg 重新编码为 MP3):
bash
ffmpeg -i input.mp4 -vn output.mp3
-vn选项告诉 FFmpeg 禁用视频,从而有效地仅提取音频流并将其转换为 MP3。 -
提取音频而不重新编码:
如果要提取音频流而不重新编码(快速且无损),请使用-vn -acodec copy。确保输出格式与原始音频编解码器匹配(例如,AAC 用于.aac文件)。
bash
ffmpeg -i input.mp4 -vn -acodec copy output.aac -
提取特定音轨:
如果您的视频有多个音轨,您可以使用-map指定要提取的音轨。例如,要提取第二个音轨(索引 1,因为索引从 0 开始):
bash
ffmpeg -i input.mp4 -map 0:a:1 -vn output_track2.mp3
3. 转换音频格式
要将音频文件从一种格式转换为另一种格式:
- 将 WAV 转换为具有比特率的 MP3:
bash
ffmpeg -i input.wav -b:a 192k output.mp3
这将input.wav转换为output.mp3,音频比特率为 192 kbps。
4. 调整/缩放视频
要更改视频的分辨率:
-
特定分辨率(可能会扭曲纵横比):
bash
ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
这将视频大小调整为 1280×720 像素。请注意,如果纵横比发生变化,这可能会拉伸或压缩视频。 -
设置宽度,自动计算高度(保持纵横比):
bash
ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4
这将宽度设置为 1280 像素,并自动计算高度以保持原始纵横比。 -
设置高度,自动计算宽度(保持纵横比):
bash
ffmpeg -i input.mp4 -vf "scale=-1:720" output.mp4
这将高度设置为 720 像素,并自动计算宽度。 -
调整大小以适合带黑边框的框:
要在特定尺寸(例如 1280×720)内调整视频大小而不失真,必要时添加黑条(信箱或柱箱):
bash
ffmpeg -i input.mp4 -vf "scale=w=1280:h=720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
5. 修剪/剪切视频
要提取视频的片段:
-
按开始时间和持续时间修剪(快速):
将-ss(开始搜寻)放在-i(输入)之前速度更快,但可能帧精度较低。
bash
ffmpeg -ss 00:01:00 -i input.mp4 -t 00:00:30 -c copy output.mp4
此命令从input.mp4的 1 分钟(00:01:00)处开始,并提取 30 秒长的片段(-t 00:00:30),并将其另存为output.mp4。-c copy选项确保不重新编码,使其速度非常快。 -
按开始和结束时间修剪(快速):
bash
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:01:30 -c copy output.mp4
这将提取从 1 分钟(00:01:00)到 1 分 30 秒(00:01:30)的片段。
6. 添加水印(图像或文本)
要在视频上叠加图像或文本:
-
图像水印:
bash
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
这会将watermark.png叠加到input.mp4上。overlay=10:10将水印放置在距顶部 10 像素和距左边缘 10 像素的位置。 -
文本水印:
bash
ffmpeg -i input.mp4 -vf "drawtext=text='Your Text':fontfile=/path/to/font.ttf:fontsize=24:fontcolor=white:x=10:y=H-th-10" output.mp4
这会将“Your Text”添加到视频中。fontfile:指定.ttf字体文件的路径。fontsize:文本的大小。fontcolor:文本的颜色。x=10:y=H-th-10:将文本放置在距左侧 10 像素和距底部 10 像素的位置(H是视频高度,th是文本高度)。
7. 从视频创建 GIF
要将视频片段转换为动画 GIF:
-
基本 GIF 创建:
bash
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" output.gif
这将从input.mp4创建一个 GIF。fps=10:将帧速率设置为每秒 10 帧。scale=320:-1:将 GIF 大小调整为 320 像素宽,并保持纵横比。flags=lanczos:使用 Lanczos 缩放算法以获得更好的质量。
-
从特定部分创建 GIF:
bash
ffmpeg -ss 00:00:10 -i input.mp4 -t 00:00:05 -vf "fps=10,scale=320:-1:flags=lanczos" output.gif
这将从视频的 10 秒标记处开始创建一个 5 秒的 GIF。 -
更高质量的 GIF(使用 palettegen):
为了在 GIF 中获得更好的色彩再现,建议生成自定义调色板。
bash
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output_high_quality.gif
8. 连接视频
要将多个视频文件合并为一个:
-
连接具有相同编解码器/格式的视频(Concat Demuxer):
如果所有输入视频具有相同的属性(编解码器、分辨率、帧速率),则此方法速度快且可避免重新编码。- 创建一个文本文件(例如
mylist.txt),其中列出您的视频文件,每行一个,如下所示:
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4' - 运行 FFmpeg 命令:
bash
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4
通常需要-safe 0选项以允许列表中的相对或复杂文件路径。
- 创建一个文本文件(例如
-
连接具有不同编解码器/格式的视频(Concat 过滤器):
如果您的视频具有不同的属性,则需要使用concat过滤器,这涉及重新编码。这更复杂,需要指定视频和音频流。
bash
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mp4n=2:输入视频的数量。v=1:一个视频输出流。a=1:一个音频输出流。[0:v:0]:从输入 0 中选择视频流 0。[0:a:0]:从输入 0 中选择音频流 0。
结论和更多资源
FFmpeg 是一个非常通用的工具。本教程介绍了一些最常见的操作,但其功能远不止于此。有关更多深入信息和高级用法,请参阅: