核心工具:FFmpeg
FFmpeg 是一个开源、跨平台的音视频处理工具集,被誉为“音视频领域的瑞士军刀”,它几乎可以处理所有格式的音视频文件。

安装 FFmpeg
在大多数 Linux 发行版中,都可以通过包管理器轻松安装。
-
Debian / Ubuntu:
sudo apt update sudo apt install ffmpeg
-
CentOS / RHEL / Fedora:
# CentOS/RHEL 7/8 sudo yum install epel-release sudo yum install ffmpeg # Fedora sudo dnf install ffmpeg
-
Arch Linux:
(图片来源网络,侵删)sudo pacman -S ffmpeg
安装后,可以检查版本:
ffmpeg -version
FFmpeg 基本语法和核心概念
理解基本语法是转码的关键。
ffmpeg -i [输入文件] [选项] [输出文件]
-i: 指定输入文件。[选项]: 用于设置编码器、比特率、分辨率、帧率等参数。[输出文件]: 指定转码后的输出文件名。FFmpeg 会根据输出文件的扩展名自动选择封装格式和默认编码器。.mp4会默认使用 H.264 视频编码和 AAC 音频编码。
核心概念:
- 编码器: 将音视频数据压缩成特定格式(如 H.264, H.265/HEVC, AAC)的算法。
- 解码器: 将压缩的音视频数据解压成原始数据。
- 容器格式: 封装音视频流、字幕、元数据的“外壳”,如
.mp4,.mkv,.avi,.flv等。 - 比特率: 控制文件大小和质量的参数,比特率越高,质量越好,文件越大,单位通常是
k(千比特/秒)。
常见转码场景与命令示例
视频格式转换(最常见)
目标:将 .mkv 文件转换为 .mp4 文件。
ffmpeg -i input.mkv output.mp4
说明:

- FFmpeg 会自动检测
input.mkv中的视频流(如 H.264)和音频流(如 AAC),并将它们封装进output.mp4容器中,如果输入流的编码与 MP4 容器兼容,这个过程非常快,几乎是“重新封装”(remuxing)。
调整视频分辨率(缩放)
目标:将视频分辨率从 1920x1080 降为 1280x720(同时保持原格式)。
# 方法1:指定固定输出尺寸 ffmpeg -i input.mp4 -vf "scale=1280:720" output_720p.mp4 # 方法2:指定宽度,高度自动保持比例 ffmpeg -i input.mp4 -vf "scale=1280:-1" output_1280w.mp4 # 方法3:指定高度,宽度自动保持比例 ffmpeg -i input.mp4 -vf "scale=-1:720" output_720h.mp4
说明:
-vf是-filter:v的缩写,表示应用视频滤镜。scale是缩放滤镜。- 使用
-1可以让 FFmpeg 自动计算另一个维度的值,以保持视频的宽高比,避免画面变形。
调整视频比特率(控制文件大小)
目标:将视频的比特率降低到 1500 kbps,以减小文件体积。
# 使用 CRF (Constant Rate Factor) 控制质量 (推荐,H.264/H.265) # CRF 范围: 0-51,值越小质量越好,18-28 是常用范围。 ffmpeg -i input.mp4 -c:v libx264 -crf 23 output_small.mp4 # 使用比特率 控制大小 # -b:v 指定视频比特率 ffmpeg -i input.mp4 -b:v 1500k output_small.mp4
说明:
-c:v libx264: 明确指定使用 H.264 编码器,如果不指定,FFmpeg 可能会选择其他编码器。- CRF (Constant Rate Factor) 是更现代、更智能的质量控制方式,它会在保持视觉质量相对恒定的前提下,动态调整比特率。
23是 H.264 的默认值,提供了很好的质量/大小平衡。 -b:v(或-video_bitrate) 是传统的比特率控制,直接指定一个平均比特率。
只提取音频或视频
目标:从视频中提取音频。
# 提取为 MP3 格式 ffmpeg -i input.mp4 -vn -ab 192k output.mp3 # 提取为 AAC 格式 ffmpeg -i input.mp4 -vn -acodec copy output.aac
说明:
-vn: 表示 "disable video"(禁用视频流)。-ab 192k: 设置音频比特率为 192 kbps。-acodec copy: 表示直接复制音频流,不进行重新编码,速度最快,且质量无损。
目标:从视频中提取视频画面(无声音)。
# 提取为 H.264 编码的 MP4 ffmpeg -i input.mp4 -an -c:v copy output_video.mp4 # 转换为 GIF (需要额外工具支持) ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif
说明:
-an: 表示 "disable audio"(禁用音频流)。-c:v copy: 直接复制视频流。
修改帧率
目标:将视频帧率从 30fps 降为 15fps。
ffmpeg -i input.mp4 -r 15 output_15fps.mp4
说明:
-r 15: 设置输出视频的帧率为 15,这会通过丢弃或复制帧来实现,可能会影响视频流畅度。
高级组合 - 多参数转码
目标:将一个 .mkv 文件转换为 .mp4,同时将分辨率缩放到 720p,使用 CRF 20 保证高质量,并保持音频不变。
ffmpeg -i input.mkv -vf "scale=1280:-1" -c:v libx264 -crf 20 -c:a copy output_high_quality.mp4
说明:
- 这个命令非常强大且实用:
-vf "scale=1280:-1": 先缩放视频。-c:v libx264 -crf 20: 用 H.264 编码视频,质量设为较高水平(CRF 20)。-c:a copy: 直接复制原始音频流,避免再次编码导致的音质损失和耗时。
FFmpeg 参数速查表
| 参数 | 全称 | 说明 | 示例 |
|---|---|---|---|
-i |
input_file |
指定输入文件 | -i video.mkv |
-c |
codec |
指定编码器(可以是视频或音频) | -c:v libx264, -c:a aac |
-c:v |
video_codec |
仅指定视频编码器 | -c:v libx265 |
-c:a |
audio_codec |
仅指定音频编码器 | -c:a libopus |
-b:v |
video_bitrate |
设置视频比特率 | -b:v 2000k |
-b:a |
audio_bitrate |
设置音频比特率 | -b:a 128k |
-crf |
constant_rate_factor |
设置视频质量(H.264/H.265) | -crf 23 |
-r |
fps |
设置帧率 | -r 30 |
-s |
size |
设置分辨率(宽x高) | -s 1920x1080 |
-vf |
video_filters |
应用视频滤镜 | -vf "scale=1280:-1" |
-af |
audio_filters |
应用音频滤镜 | -af "aformat=sample_rates=44100" |
-an |
disable_audio |
禁用音频流 | -an |
-vn |
disable_video |
禁用视频流 | -vn |
-y |
overwrite |
覆盖已存在的输出文件,不提示 | -y output.mp4 |
-n |
never_overwrite |
不覆盖已存在的输出文件 | -n output.mp4 |
其他相关工具
虽然 ffmpeg 是最强大的,但有时也需要一些轻量级工具。
avconv
libav 项目下的工具,曾是 ffmpeg 的一个分支,但现在已独立发展,其语法和 ffmpeg 非常相似,在很多场景下可以互换,如果你的系统上只有 avconv,它的用法基本通用。
iconv
这个工具不用于音视频,而是用于文本编码的转换,例如将 GBK 编码的中文文件转换为 UTF-8。
# 将 gbk.txt 从 GBK 编码转换为 utf-8.txt iconv -f gbk -t utf-8 gbk.txt -o utf-8.txt
总结与最佳实践
- 先测试:对于大文件或重要文件,先用一小段视频测试转码参数是否满意。
- 使用
-c:a copy:如果输入音频的编码(如 AAC)与目标容器兼容,尽量复制音频流,可以节省大量时间并保证音质。 - CRF 优于
-b:v:对于追求质量而非精确大小的场景,优先使用 CRF。 - 善用
-vf:分辨率、裁剪、加水印等操作都通过滤镜实现,非常灵活。 - 查看流信息:在不确定输入文件格式时,使用
ffprobe查看,它是ffmpeg套件的一部分。ffprobe -v quiet -print_format json -show_streams input.mp4 | jq '.streams[] | {codec_type: .codec_type, codec_name: .codec_name}'
希望这份详细的指南能帮助你掌握 Linux 下的转码技巧!
