name: ffmpeg description: FFmpeg使用指南 - 一个全面的多媒体框架,用于视频/音频编码、转换、流媒体和过滤。在处理媒体文件、转换格式、提取音频、创建流、应用过滤器或优化视频/音频质量时使用。 license: LGPL/GPL version: 1.0.0
FFmpeg 技能
FFmpeg 是一个全面的开源多媒体框架,用于处理视频、音频和其他多媒体文件和流。它提供了命令行工具和库,用于录制、转换和流式传输音频和视频。
何时使用此技能
在以下情况使用此技能:
- 在格式之间转换媒体文件(MP4、MKV、WebM、AVI 等)
- 使用不同编解码器编码/解码视频(H.264、H.265、VP9、AV1)
- 处理音频文件(AAC、MP3、FLAC、Opus)
- 直播到平台(Twitch、YouTube、RTMP 服务器)
- 创建 HLS/DASH 自适应流
- 从视频文件提取音频
- 应用视频/音频过滤器(缩放、裁剪、降噪、音量)
- 屏幕录制和捕获
- 优化视频质量和文件大小
- 批量处理媒体文件
- 分析媒体文件属性
核心组件
命令行工具
ffmpeg:用于转码、转换和流式传输的主要工具 ffprobe:媒体分析和检查工具 ffplay:用于测试的简约多媒体播放器
库
- libavcodec:编解码器编码/解码
- libavformat:容器格式和 I/O
- libavfilter:音频/视频过滤框架
- libavutil:实用函数
- libswscale:视频缩放和颜色转换
- libswresample:音频重采样和混合
常见视频编解码器
现代编解码器
H.264 (libx264):最广泛支持,优秀的压缩/质量平衡
- 最佳用于:通用兼容性、流媒体、网络视频
- 质量范围:CRF 17-28(越低 = 质量越好)
H.265/HEVC (libx265):比 H.264 压缩率高 25-50%
- 最佳用于:4K 视频、减小文件大小
- 编码较慢,浏览器支持有限
VP9:免版税,WebM 格式
- 最佳用于:YouTube、开源项目
- 良好的质量/压缩率,Chrome/Firefox 支持
AV1 (libaom-av1, libsvtav1):下一代编解码器,最佳压缩率
- 最佳用于:未来证明、终极质量/大小比
- 编码非常慢(随着 SVT-AV1 改进)
传统编解码器
- MPEG-4 (Xvid/DivX)
- MPEG-2
- VP8
常见音频编解码器
AAC:行业标准,优秀质量 MP3:通用兼容性,良好质量 Opus:低比特率下最佳质量,适合语音/流媒体 FLAC:无损压缩,归档质量 Vorbis:开源,良好质量 AC-3/DTS:环绕声格式
容器格式
MP4:通用兼容性,流媒体友好 MKV (Matroska):功能丰富,支持多轨道/字幕 WebM:网络优化(VP8/VP9 + Vorbis/Opus) AVI:传统格式,广泛兼容性 MOV:Apple QuickTime 格式 TS:广播传输流 FLV:Flash 视频(传统流媒体)
基本操作
格式转换
简单格式转换,无需重新编码:
ffmpeg -i input.mkv -c copy output.mp4
使用特定编解码器转换:
ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4
基于质量的编码(CRF)
恒定速率因子 - 最适合质量导向的编码:
# H.264 编码(CRF 23 = 默认,推荐范围 17-28)
ffmpeg -i input.mkv -c:v libx264 -preset slow -crf 22 -c:a copy output.mp4
# H.265 编码(更高压缩率)
ffmpeg -i input.mkv -c:v libx265 -preset medium -crf 24 -c:a copy output.mp4
# VP9 编码(WebM)
ffmpeg -i input.mkv -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
CRF 标度:
- 0 = 无损(文件大小巨大)
- 17-18 = 视觉无损
- 20-23 = 高质量(推荐)
- 24-28 = 中等质量
- 30+ = 低质量
- 51 = 最差质量
预设(速度 vs 压缩率):
- ultrafast、superfast、veryfast、faster、fast
- medium(默认)
- slow、slower、veryslow(更好压缩率)
- placebo(不推荐 - 增益最小)
基于比特率的编码(两次通过)
针对特定文件大小:
# 第 1 次通过(分析)
ffmpeg -y -i input.mkv -c:v libx264 -b:v 2600k -pass 1 -an -f null /dev/null
# 第 2 次通过(编码)
ffmpeg -i input.mkv -c:v libx264 -b:v 2600k -pass 2 -c:a aac -b:a 128k output.mp4
音频提取
提取音频,无需重新编码:
ffmpeg -i video.mp4 -vn -c:a copy audio.m4a
提取并转换为 MP3:
ffmpeg -i video.mp4 -vn -q:a 0 audio.mp3
以特定比特率提取:
ffmpeg -i video.mp4 -vn -c:a libmp3lame -b:a 192k audio.mp3
视频缩放/调整大小
缩放到特定尺寸:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
缩放保持宽高比:
# 宽度 1280,高度自动计算
ffmpeg -i input.mp4 -vf scale=1280:-1 output.mp4
# 高度 720,宽度自动计算
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
缩放到一半分辨率:
ffmpeg -i input.mp4 -vf scale=iw/2:ih/2 output.mp4
修剪/剪切视频
剪切无需重新编码(快速但不精确):
ffmpeg -i input.mp4 -ss 00:01:30 -to 00:03:00 -c copy output.mp4
剪切并重新编码(精确):
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:01:30 -c:v libx264 -c:a aac output.mp4
参数:
-ss:开始时间(HH:MM:SS 或秒)-to:结束时间-t:持续时间(代替结束时间)
拼接
方法 1:拼接解复用器(相同编解码器/格式)
创建 concat.txt:
file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
运行:
ffmpeg -f concat -safe 0 -i concat.txt -c copy output.mp4
方法 2:拼接过滤器(不同格式)
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 \
-filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" output.mp4
高级过滤
视频过滤器
多个过滤器(用逗号链接):
ffmpeg -i input.mp4 -vf "scale=1280:720,hqdn3d" output.mp4
降噪:
ffmpeg -i input.mp4 -vf hqdn3d output.mp4
去隔行:
ffmpeg -i input.mp4 -vf yadif output.mp4
裁剪:
# 从左上角 (0,0) 裁剪到 1280x720
ffmpeg -i input.mp4 -vf "crop=1280:720:0:0" output.mp4
# 自动检测并移除黑边
ffmpeg -i input.mp4 -vf "cropdetect" output.mp4
旋转:
# 顺时针旋转 90 度
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# 旋转 180 度
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" output.mp4
水印/徽标:
ffmpeg -i video.mp4 -i logo.png \
-filter_complex "overlay=10:10" output.mp4
速度调整:
# 2 倍速度
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
# 0.5 倍速度(慢动作)
ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -af "atempo=0.5" output.mp4
音频过滤器
音量调整:
# 增加音量 10dB
ffmpeg -i input.mp4 -af "volume=10dB" output.mp4
# 设置为 50% 音量
ffmpeg -i input.mp4 -af "volume=0.5" output.mp4
音频标准化:
ffmpeg -i input.mp4 -af loudnorm output.mp4
音频交叉淡化:
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0][1]acrossfade=d=5" output.mp3
混合多个音频轨道:
ffmpeg -i input1.mp3 -i input2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" output.mp3
流媒体
RTMP 流媒体(Twitch/YouTube)
基本流:
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast \
-maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 \
-c:a aac -b:a 128k -ar 44100 \
-f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
屏幕捕获 + 流(Linux):
ffmpeg -f x11grab -s 1920x1080 -framerate 30 -i :0.0 \
-f pulse -ac 2 -i default \
-c:v libx264 -preset veryfast -tune zerolatency \
-maxrate 2500k -bufsize 5000k -pix_fmt yuv420p \
-c:a aac -b:a 128k -ar 44100 \
-f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
屏幕捕获(Windows DirectShow):
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Stereo Mix" \
-c:v libx264 -preset ultrafast -tune zerolatency \
-maxrate 750k -bufsize 3000k \
-f flv rtmp://live.twitch.tv/app/YOUR_STREAM_KEY
重要流媒体参数:
-re:以原生帧率读取输入(实时)-tune zerolatency:优化低延迟-g 50:每 50 帧一个关键帧(25fps 时 2 秒)-maxrate:最大比特率-bufsize:速率控制缓冲区(通常为 2 倍 maxrate)
HLS 流媒体
生成自适应 HLS 流:
ffmpeg -i input.mp4 \
-c:v libx264 -preset fast -crf 22 -g 48 -sc_threshold 0 \
-c:a aac -b:a 128k \
-f hls -hls_time 6 -hls_playlist_type vod \
-hls_segment_filename "segment_%03d.ts" \
playlist.m3u8
多比特率 HLS:
ffmpeg -i input.mp4 \
-map 0:v -map 0:a -map 0:v -map 0:a \
-c:v libx264 -crf 22 -c:a aac -b:a 128k \
-b:v:0 2000k -s:v:0 1280x720 -b:v:1 5000k -s:v:1 1920x1080 \
-var_stream_map "v:0,a:0 v:1,a:1" \
-master_pl_name master.m3u8 \
-f hls -hls_time 6 -hls_list_size 0 \
stream_%v/index.m3u8
UDP/RTP 流媒体
UDP 流:
ffmpeg -re -i input.mp4 -c copy -f mpegts udp://192.168.1.100:1234
RTP 音频流:
ffmpeg -re -i audio.mp3 -c:a libopus -f rtp rtp://192.168.1.100:5004
硬件加速
NVIDIA NVENC
# 使用 NVENC 的 H.264
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc -preset fast -crf 22 output.mp4
# 使用 NVENC 的 H.265
ffmpeg -hwaccel cuda -i input.mp4 -c:v hevc_nvenc -preset fast -crf 24 output.mp4
Intel QuickSync (QSV)
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
-c:v h264_qsv -preset fast -global_quality 22 output.mp4
AMD VCE
ffmpeg -hwaccel auto -i input.mp4 \
-c:v h264_amf -quality balanced -rc cqp -qp 22 output.mp4
媒体分析
检查媒体文件
# 详细信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# 人类可读格式
ffprobe input.mp4
# 获取时长
ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 input.mp4
# 获取分辨率
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height \
-of csv=s=x:p=0 input.mp4
# 获取比特率
ffprobe -v error -show_entries format=bit_rate \
-of default=noprint_wrappers=1:nokey=1 input.mp4
批量处理
批量转换的 Bash 循环
# 将所有 MKV 文件转换为 MP4
for file in *.mkv; do
ffmpeg -i "$file" -c:v libx264 -crf 22 -c:a aac "${file%.mkv}.mp4"
done
# 将所有视频调整为 720p
for file in *.mp4; do
ffmpeg -i "$file" -vf scale=-1:720 "720p_${file}"
done
使用 GNU Parallel 并行处理
# 安装:sudo apt-get install parallel
# 并行处理多个文件
ls *.mkv | parallel ffmpeg -i {} -c:v libx264 -crf 22 -c:a aac {.}.mp4
常见模式
从视频创建 GIF
# 高质量 GIF
ffmpeg -i input.mp4 -vf "fps=15,scale=640:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" output.gif
# 简单 GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1" output.gif
提取帧为图像
# 提取所有帧
ffmpeg -i input.mp4 frame_%04d.png
# 每秒提取 1 帧
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
# 在 5 秒时提取单帧
ffmpeg -ss 00:00:05 -i input.mp4 -frames:v 1 frame.png
从图像创建视频
# 从编号图像
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -crf 22 -pix_fmt yuv420p output.mp4
# 从模式
ffmpeg -framerate 24 -pattern_type glob -i '*.png' -c:v libx264 output.mp4
添加字幕
# 将字幕烧入视频
ffmpeg -i video.mp4 -vf subtitles=subtitles.srt output.mp4
# 嵌入字幕轨道(软字幕)
ffmpeg -i video.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
移除音频
ffmpeg -i input.mp4 -an -c:v copy output.mp4
替换音频
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
创建缩略图
# 在 5 秒时创建单个缩略图
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 -vf scale=320:-1 thumb.jpg
# 多个缩略图(每分钟一个)
ffmpeg -i input.mp4 -vf fps=1/60,scale=320:-1 thumb_%03d.jpg
性能优化
速度 vs 质量权衡
快速编码(实时处理):
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 23 output.mp4
平衡(默认):
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 22 output.mp4
高质量(归档):
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 18 output.mp4
多线程
FFmpeg 自动使用多个 CPU 核心。覆盖:
ffmpeg -threads 8 -i input.mp4 -c:v libx264 output.mp4
最佳实践
- 使用 CRF 进行质量导向的编码 - 对于大多数用例,比比特率更好
- 针对大小目标使用两次通过 - 当文件大小至关重要时
- 尽可能复制流 - 使用
-c copy避免重新编码 - 选择合适的预设 - 平衡速度 vs 压缩率
- 匹配输出到源 - 不要放大或使用比源更高的质量
- 首先测试短片段 - 在批量处理前验证设置
- 硬件加速 - 使用 GPU 编码进行更快处理
- 音频重要 - 不要忽视音频编解码器/比特率选择
- 高效使用过滤器 - 用逗号链接多个过滤器
- 验证输出 - 编码后总是检查质量
常见参数参考
视频参数
-c:v或-vcodec:视频编解码器-b:v:视频比特率(如2M、2500k)-crf:恒定速率因子(0-51)-preset:编码速度/质量(ultrafast 到 veryslow)-tune:编码优化(film、animation、zerolatency)-pix_fmt:像素格式(yuv420p 以兼容)-r:帧率(如30、60)-g:GOP 大小(关键帧间隔)
音频参数
-c:a或-acodec:音频编解码器-b:a:音频比特率(如128k、192k)-ar:音频采样率(如44100、48000)-ac:音频通道(1=单声道,2=立体声)-q:a:音频 VBR 质量(0=MP3 最佳)
通用参数
-i:输入文件-y:覆盖输出而不询问-n:从不覆盖输出-t:编码持续时间-ss:开始时间偏移-to:结束时间-vf:视频过滤器-af:音频过滤器-map:流选择-metadata:设置元数据-f:强制格式
故障排除
“未知编码器” 错误
安装编解码器库:
# Ubuntu/Debian
sudo apt-get install ffmpeg libx264-dev libx265-dev libvpx-dev
# 检查可用编码器
ffmpeg -encoders
输出兼容性问题
使用安全默认值以最大化兼容性:
ffmpeg -i input.mkv -c:v libx264 -profile:v high -level 4.0 \
-pix_fmt yuv420p -c:a aac -b:a 128k output.mp4
性能问题
- 使用硬件加速(
-hwaccel) - 选择更快预设(
-preset fast) - 使用缩放过滤器降低分辨率
- 显式使用多个线程
质量问题
- 降低 CRF 值(18-22 为高质量)
- 使用更慢预设(
-preset slow) - 使用两次通过编码以更好分布比特率
- 匹配或超过源比特率
资源
- 官方文档:https://ffmpeg.org/documentation.html
- FFmpeg 维基:https://trac.ffmpeg.org/
- 编解码器指南:https://trac.ffmpeg.org/wiki/Encode
- 过滤器文档:https://ffmpeg.org/ffmpeg-filters.html
- GitHub 仓库:https://github.com/ffmpeg/ffmpeg
- 社区示例:https://trac.ffmpeg.org/wiki/
实施清单
使用 FFmpeg 时:
- [ ] 验证 FFmpeg 安装(
ffmpeg -version) - [ ] 检查可用编解码器以适应用例
- [ ] 首先在短片段上测试编码设置
- [ ] 为目标平台选择合适的编解码器
- [ ] 设置质量级别(CRF 或比特率)
- [ ] 配置音频编解码器和比特率
- [ ] 应用必要过滤器(缩放、裁剪等)
- [ ] 如有可用,考虑硬件加速
- [ ] 验证输出质量和文件大小
- [ ] 在目标设备上测试输出兼容性
- [ ] 记录设置以可重现
- [ ] 为重复任务创建批量脚本