FFmpeg Linux 完整教程
目录
什么是 FFmpeg?
FFmpeg 是一个开源的、跨平台的命令行工具集,用于处理音视频文件,它功能极其强大,被誉为“音视频领域的瑞士军刀”。

你可以用它来:
- 转码:将视频或音频从一种格式转换为另一种格式(如 MP4, MKV, AVI, MOV, MP3, AAC 等)。
- 转换:改变视频的分辨率、帧率、码率、编码方式等。
- 切割/合并:从视频中截取片段,或将多个小的视频/音频文件合并成一个。
- 流媒体:将音视频推送到流媒体服务器或从流媒体服务器拉取流。
- 录制:录制你的屏幕、摄像头或音频输入。
- 处理:添加水印、字幕、调整亮度/对比度、应用滤镜等。
它的核心优势在于自动化和灵活性,非常适合在服务器、脚本或工作流中集成。
安装 FFmpeg
在大多数现代 Linux 发行版中,安装 FFmpeg 非常简单。
基于 Debian/Ubuntu 的系统 (使用 apt)
# 更新软件包列表 sudo apt update # 安装 FFmpeg sudo apt install ffmpeg # (可选) 安装一些常用的编码器,如 libx265 (HEVC) 和 libvpx (VP9) sudo apt install libavcodec-extra
基于 RHEL/CentOS/Fedora 的系统 (使用 dnf/yum)
# 对于 Fedora / CentOS 8+ / RHEL 8+ sudo dnf install ffmpeg # 对于 CentOS 7 / RHEL 7 sudo yum install epel-release sudo yum install ffmpeg
基于 Arch Linux 的系统 (使用 pacman)
sudo pacman -S ffmpeg
验证安装
安装完成后,打开终端,输入以下命令检查版本:

ffmpeg -version
如果看到版本信息,说明安装成功。
核心概念:你必须知道的三大组件
理解 FFmpeg 的核心工作流程,你需要先认识它最常用的三个工具:
ffmpeg: 核心命令行工具,它用于读取、转换、输出音视频数据,这是你日常使用最频繁的命令。ffprobe: 分析工具,用于探测音视频文件的详细信息,如格式、编码、时长、码率、帧率、分辨率等,而不会对文件进行任何修改,在处理未知文件时非常有用。ffplay: 简单的播放器,一个基于 FFmpeg 的命令行播放器,可以用来快速播放音视频文件,或者测试滤镜效果。
基本语法结构
FFmpeg 的命令遵循一个基本模式:
ffmpeg [输入选项] -i <输入文件> [输出选项] <输出文件>
ffmpeg: 调用主程序。[输入选项]: 专门用于输入文件的参数,如-ss(开始时间)、-t(持续时间)。-i <输入文件>:-i是 "input" 的缩写,后面跟着你要处理的文件路径,一个命令可以有多个-i,表示多个输入源(视频和音频分开)。[输出选项]: 专门用于输出文件的参数,如-c:v(视频编码器)、-b:v(视频码率)。<输出文件>: 最终生成的文件路径。
常用操作与实战案例
让我们通过一些最常见的例子来学习 FFmpeg 的使用。

案例 1:视频格式转换 (如 MP4 转 MKV)
这是最简单的用法,FFmpeg 会自动选择合适的编码器。
# 将 input.mp4 转换为 output.mkv,视频和音频编码保持不变 ffmpeg -i input.mp4 output.mkv
案例 2:提取视频中的音频
你想从视频中保存音频部分吗?很简单。
# 提取 input.mp4 的音频,保存为 output.mp3 (自动转码为 MP3) ffmpeg -i input.mp4 output.mp3 # 提取音频并保持原始格式 (如 AAC) ffmpeg -i input.mp4 -vn -c:a copy output.aac # -vn: 禁用视频 # -c:a copy: 直接复制音频流,不进行重新编码,速度最快,质量无损
案例 3:从视频中提取图片帧
想把视频中的某一帧保存为图片吗?
# 从视频中提取第 30 秒的帧,保存为高质量图片 output.jpg ffmpeg -i input.mp4 -ss 00:00:30 -vframes 1 output.jpg # -ss: 指定时间点 (HH:MM:SS.ms) # -vframes 1: 只提取 1 帧
案例 4:压缩视频文件大小
压缩视频主要通过降低码率和分辨率来实现。
方法 A:通过码率压缩 (适用于在线视频)
# 将视频码率固定为 1M,文件大小会显著减小,但可能损失画质 ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4 # -b:v 1M: 视频码率为 1 Megabit/s # -b:a 128k: 音频码率为 128 Kilobit/s
方法 B:通过 CRF (Constant Rate Factor) 压缩 (推荐)
CRF 是 H.264/H.265/VP9 等编码器的一种质量控制方法,值越高质量越好,文件越大。
- H.264: 通常范围是 18-28,23 是默认值。
- H.265: 通常范围是 28-30,28 是默认值。
# 使用 H.264 编码,CRF 设为 28 (比默认 23 压缩率更高,画质稍差) ffmpeg -i input.mp4 -c:v libx264 -crf 28 -c:a copy output.mp4 # 使用 H.265 (HEVC) 编码,CRF 设为 28,文件更小 ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a copy output.mp4
案例 5:合并多个视频文件
FFmpeg 本身不能直接按顺序合并视频(因为需要解码再编码,会损失画质且慢),但可以通过一个文本列表文件来实现无损合并。
假设你有 part1.mp4, part2.mp4, part3.mp4。
-
创建一个名为
mylist.txt的文件,内容如下:file 'part1.mp4' file 'part2.mp4' file 'part3.mp4'注意: 路径必须是相对于
mylist.txt文件的相对路径,或者使用绝对路径。 -
使用
concatdemuxer 进行合并:ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.mp4 # -f concat: 指定输入格式为 concat # -safe 0: 允许使用绝对路径或特殊字符 # -c copy: 直接复制流,不重新编码,实现无损快速合并
案例 6:裁剪视频的某一部分
裁剪可以从时间和空间两个维度进行。
A. 裁剪时间片段
# 从第 30 秒开始,截取 10 秒的视频,保存为 output.mp4 ffmpeg -i input.mp4 -ss 00:00:30 -t 10 -c copy output.mp4
B. 裁剪画面区域 (缩小画幅)
# 将画面缩小到中心的一个 800x600 的矩形区域 ffmpeg -i input.mp4 -filter:v "crop=800:600" output.mp4
案例 7:为视频添加字幕/水印
A. 添加硬字幕(将字幕“烧”进视频画面)
假设你有一个 subtitles.ass 字幕文件。
ffmpeg -i input_video.mp4 -vf "subtitles=subtitles.ass" output_video.mp4
B. 添加图片水印
假设你有一个 logo.png 水印图片,想放在右下角。
ffmpeg -i input_video.mp4 -i logo.png -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output_video.mp4 # -filter_complex: 用于处理复杂的滤镜 # overlay: 水印滤镜 # main_w-overlay_w-10: 水平位置 (视频宽度 - 水印宽度 - 10像素右边距) # main_h-overlay_h-10: 垂直位置 (视频高度 - 水印高度 - 10像素下边距)
案例 8:录制屏幕或摄像头
A. 录制整个屏幕
# -f x11grab: 指定使用 X11grab 来抓取屏幕 # -s: 分辨率 (1920x1080) # -i : 指定抓取的屏幕区域 (:0.0 表示整个默认屏幕) # -r: 帧率 ffmpeg -f x11grab -s 1920x1080 -i :0.0 -r 30 output.mp4
B. 录制摄像头
# /dev/video0 通常是第一个摄像头设备 # -f v42l2: 指定使用 Video4Linux2 驱动 # -s: 摄像头分辨率 # -i: 摄像头设备 ffmpeg -f v4l2 -s 640x480 -i /dev/video0 -r 30 output.mp4
进阶技巧与参数详解
视频编码器 (-c:v)
指定视频编码器,选择合适的编码器是控制质量和文件大小的关键。
libx264: 目前最流行的 H.264 编码器,兼容性好,压缩率高。libx265: H.265 (HEVC) 编码器,压缩率比 x264 更高,但更消耗 CPU。libvpx: Google 的 VP8/VP9 编码器,适合 Web 视频。copy: 直接复制视频流,不进行转码,用于快速封装格式转换。
ffmpeg -i input.mp4 -c:v libx265 output.mp4
音频编码器 (-c:a)
指定音频编码器。
aac: 最常用的音频编码器。mp3: 经典的音频编码器。copy: 直接复制音频流。
ffmpeg -i input.mp4 -c:a aac output.mp4
码率控制 (-b:v, -crf)
- 平均码率
-b:v: 设定一个目标平均码率。-b:v 1M表示 1Mbps。 - CRF (Constant Rate Factor)
-crf: 设定一个恒定的质量因子。对于 H.264/H.265,推荐使用 CRF。- H.264:
18(无损) ~28(较小文件) - H.265:
28(无损) ~30(较小文件)
- H.264:
视频分辨率 (-s)
改变视频的分辨率。-s 1280x720。
帧率 (-r)
改变视频的帧率。-r 24 表示每秒 24 帧。
视频过滤器 (-vf)
-vf 是 -filter:v 的简写,用于应用视频滤镜,FFmpeg 的滤镜功能非常强大,可以通过一个链或图来组合使用。
示例:调整视频亮度和对比度
# 增加亮度和对比度 ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2" output.mp4
示例:视频缩放
# 将视频缩放到 854x480 (16:9) ffmpeg -i input.mp4 -vf "scale=854:480" output.mp4
实用技巧:使用 FFmpeg 脚本批处理
当你需要对一个文件夹里的所有文件进行相同操作时,脚本就派上用场了。
示例:批量转换当前目录下所有 .mp4 文件为 .mkv
创建一个名为 convert.sh 的文件:
#!/bin/bash
# 遍历当前目录下所有 .mp4 文件
for file in *.mp4; do
# 获取不带扩展名的文件名
filename="${file%.*}"
# 执行转换
echo "Converting $file to ${filename}.mkv..."
ffmpeg -i "$file" "${filename}.mkv"
done
echo "All conversions complete!"
然后赋予执行权限并运行:
chmod +x convert.sh ./convert.sh
总结与资源
FFmpeg 是一个功能极其强大的工具,本教程只是触及了它的皮毛,掌握它的关键在于:
- 多练习:尝试修改参数,观察输出结果的变化。
- 善用帮助:
ffmpeg -h可以查看所有选项,ffmpeg -encoders可以查看所有可用的编码器。 - 学会分析:遇到问题时,先用
ffprobe分析输入文件,用ffmpeg的-report选项生成详细的日志。
推荐资源
- 官方文档: FFmpeg Documentation (最权威,但比较晦涩)
- FFmpeg Wiki: FFmpeg Wiki (社区维护,有很多实用的教程和技巧)
- Command Line Fu: 一个收集了各种命令行技巧的网站,搜索 "ffmpeg" 可以发现很多巧妙的用法。
- 视频教程: 在 YouTube 上搜索 "FFmpeg tutorial",有很多优秀的视频教程。
希望这份教程能帮助你顺利入门 FFmpeg,并在 Linux 的世界里玩转音视频!
