FFmpeg 音视频处理
一句话概述:FFmpeg 是音视频处理的命令行瑞士军刀,能转格式、剪辑、合并、压缩、提取音频,几乎所有视频软件底层都用它。
核心知识点
| 概念 | 白话解释 |
|---|
| FFmpeg | 音视频处理器 = 命令行视频编辑器 |
| Codec | 编解码器 = 视频的压缩/解压方式(H.264/H.265/VP9) |
| Container | 容器格式 = 视频文件格式(mp4/mkv/avi) |
| Bitrate | 比特率 = 视频质量/文件大小的关键参数 |
| Stream | 流 = 视频里的轨道(视频流/音频流/字幕流) |
| Filter | 滤镜 = 视频处理效果(缩放/裁剪/旋转等) |
安装
# Linux
sudo apt install ffmpeg # Ubuntu/Debian
# macOS
brew install ffmpeg # Homebrew
# 验证
ffmpeg -version # 查看版本
ffmpeg -codecs # 列出支持的编解码器
ffmpeg -formats # 列出支持的格式
常用操作
# === 格式转换 ===
ffmpeg -i input.avi output.mp4 # AVI → MP4
ffmpeg -i input.mkv -c copy output.mp4 # MKV → MP4(不重编码,秒转)
ffmpeg -i input.mov -c:v libx264 -c:a aac output.mp4 # MOV → MP4(H.264+AAC)
# === 压缩视频 ===
ffmpeg -i input.mp4 -crf 28 output.mp4 # 压缩(CRF 越大=越小=越糊)
# CRF 参考值:18=高质量 23=默认 28=小文件 35=很糊
ffmpeg -i input.mp4 -vf scale=1280:720 -crf 23 small.mp4 # 缩小分辨率+压缩
# === 提取音频 ===
ffmpeg -i video.mp4 -vn -acodec mp3 audio.mp3 # 提取为 MP3
ffmpeg -i video.mp4 -vn -acodec copy audio.aac # 提取原始音频(不重编码)
# === 剪辑 ===
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:00:45 clip.mp4 # 从1:30开始剪45秒
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:15 clip.mp4 # 从1:30到2:15
# === 合并视频 ===
# 先创建文件列表
echo "file 'part1.mp4'" > list.txt # 创建列表
echo "file 'part2.mp4'" >> list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy merged.mp4 # 合并(不重编码)
# === 截图 ===
ffmpeg -i video.mp4 -ss 00:00:30 -frames:v 1 thumb.jpg # 截取第30秒一帧
ffmpeg -i video.mp4 -vf fps=1 frames/frame_%04d.jpg # 每秒截1帧
# === GIF ===
ffmpeg -i video.mp4 -vf "fps=10,scale=480:-1" output.gif # 转 GIF
# === 添加字幕 ===
ffmpeg -i video.mp4 -vf subtitles=sub.srt output.mp4 # 烧录字幕
# === 调整速度 ===
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" fast.mp4 # 2倍速
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" slow.mp4 # 0.5倍速
查看信息
# 查看视频详细信息
ffprobe input.mp4 # 简要信息
ffprobe -v quiet -print_format json -show_streams input.mp4 # JSON 格式详情
常见报错
| 报错 | 原因 | 解决 |
|---|
Unknown encoder | 编解码器未编译 | 检查 ffmpeg -codecs,安装完整版 |
Invalid data found | 输入文件损坏 | 检查文件完整性 |
Output file is empty | 参数错误 | 检查 -ss/-t 时间格式 |
Permission denied | 输出路径无权限 | 检查目录权限 |
Avi很大 | 没指定编码 | 加 -c:v libx264 -crf 23 |
速查表
# 基本语法
ffmpeg -i <input> [options] <output>
# 常用选项
# -i 输入文件
# -c copy 不重编码(直接复制流)
# -c:v 视频编码器(libx264/libx265/libvpx-vp9)
# -c:a 音频编码器(aac/mp3/copy)
# -crf N 质量(18-28,越小越好)
# -b:v 2M 视频比特率
# -vf 视频滤镜
# -af 音频滤镜
# -ss 开始时间
# -t 持续时间
# -to 结束时间
# -vn 去掉视频
# -an 去掉音频
# -y 覆盖输出文件
# 常用滤镜 (-vf)
# scale=1280:720 缩放
# crop=640:480:0:0 裁剪
# rotate=PI/2 旋转90度
# fps=30 设置帧率
# subtitles=sub.srt 烧字幕