FFmpeg是什么?
FFmpeg 是音视频处理的终极工具箱,支持编解码、转换、剪辑、合并、流媒体推拉流等几乎所有音视频操作。
ffmpeg = 视频编码转换 + 音频处理 + 流媒体 + 提取/合并 + 滤镜特效
核心组件
| 组件 | 功能 |
|---|---|
| ffmpeg | 音视频转换/处理主程序 |
| ffprobe | 分析媒体文件信息 |
| ffplay | 简易播放器 |
| ffmpeg-libav* | 库供其他程序调用 |
使用场景
-
格式转换
视频转换 MP4 → WebM
ffmpeg -i input.mp4 output.webm
视频转 GIF
ffmpeg -i input.mp4 -vf "fps=10,scale=480:-1" output.gif
音频转格式 WAV → MP3
ffmpeg -i audio.wav -vn -ar 44100 -ac 2 -b:a 192k output.mp3
-
剪辑提取
剪切片段(从 10秒 开始,剪 30秒)
ffmpeg -i input.mp4 -ss 10 -t 30 -c copy output.mp4
提取音频
ffmpeg -i video.mp4 -vn -c:a copy audio.aac
提取单帧图片
ffmpeg -i input.mp4 -ss 00:01:23 -vframes 1 frame.jpg
-
合并/拼接
合并两个视频
ffmpeg -f concat -i filelist.txt -c copy output.mp4
-
压缩优化
压缩视频(H.264)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
CRF 范围:18(接近无损)~ 28(高压缩)
-
添加水印/字幕
添加图片水印
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
烧录 SRT 字幕
ffmpeg -i input.mp4 -vf " subtitles=subs.srt" output.mp4
-
流媒体推流
推流到 RTMP 服务器
ffmpeg -i input.mp4 -f flv rtmp://live.example.com/live/stream_key
拉流录制
ffmpeg -i rtmp://live.example.com/live/stream_key -c copy record.mp4
-
降噪/增强
视频降噪
ffmpeg -i input.mp4 -filter_complex "denoise=s=7" output.mp4
音频降噪
ffmpeg -i input.mp4 -af "audiodenoise=0.8" output.mp4
-
分辨率/帧率调整
缩放到 720p
ffmpeg -i input.mp4 -vf "scale=-2:720" output.mp4
帧率从 30fps 降到 24fps
ffmpeg -i input.mp4 -r 24 output.mp4
常用参数速查
| 参数 | 含义 |
|---|---|
| -i | 输入文件 |
| -c:v | 视频编码器 |
| -c:a | 音频编码器 |
| -ss | 开始时间 |
| -t | 持续时间 |
| -crf | 质量压缩率 |
| -b:a | 音频比特率 |
| -vf | 视频滤镜 |
| -af | 音频滤镜 |
| -f | 强制格式 |
| -y | 自动覆盖输出 |
核心应用场景
- 媒体处理功能测试
测试场景:验证视频转码功能是否正确
├── 输入各种格式的视频文件(mp4/mkv/avi/webm)
├── 调用转码逻辑
└── 用 FFmpeg 提取输出文件的元数据/帧进行断言
-
视频对比/回归测试
对比两个视频是否完全一致
ffmpeg -i actual.mp4 -i expected.mp4 -lavfi \
"ssim=stats_file=ssim.log" -f null -
检测像素差异(找出画面变化)
ffmpeg -i before.mp4 -i after.mp4 -lavfi \
"psnr=stats_file=psnr.log" -f null -
-
生成测试数据
生成特定规格的测试视频
ffmpeg -f lavfi -i testsrc=duration=10:size=1280x720:rate=30 \
-c:v libx264 -pix_fmt yuv420p test_video.mp4
生成纯色/静音测试文件
ffmpeg -f lavfi -i color=c=blue:s=1280x720:d=5 test_blue.mp4
ffmpeg -f lavfi -i anullsrc=r=44100:cl=stereo -t 5 silent.wav
-
流媒体推拉流测试
自动启动推流
ffmpeg -re -i test.mp4 -f flv rtmp://server/live &
自动验证拉流是否成功
ffprobe -v error -select_streams v:0 -show_entries \
stream=codec_name,codec_type rtmp://server/live
-
性能/压力测试
批量并发转码测试
for i in {1..100}; do
ffmpeg -i input.mp4 -c:v libx264 output_$i.mp4 &
done
wait
统计成功率、耗时、资源占用
-
音视频同步测试
提取音视频分别计算时长,验证同步性
ffprobe -v error -show_entries format=duration input.mp4
ffprobe -v error -select_streams a:0 -show_entries stream=duration input.mp4
ffprobe -v error -select_streams v:0 -show_entries stream=duration input.mp4
-
兼容性测试
测试矩阵:
├── 编码器:libx264 / libx265 / VP9 / AV1
├── 容器:mp4 / mkv / webm / mov
├── 分辨率:720p / 1080p / 4K / 8K
└── FFmpeg 版本:4.4 / 5.0 / 6.0 / 7.0
→ 用 FFmpeg 生成所有组合的测试文件
→ 验证播放器能否正确解析
-
自动化截图对比
定时截取视频帧
ffmpeg -i video.mp4 -vf "fps=1" frames_%04d.png
比对 UI 渲染后的视频输出
ffmpeg -i render_output.mp4 -ss 00:00:01 -vframes 1 frame1.png
常见测试框架集成
| 框架 | 集成方式 |
|---|---|
| Python + PyTest | subprocess 调用 FFmpeg,解析输出 |
| Node.js | child_process 执行命令 |
| Robot Framework | 自定义 Library 调用 FFmpeg |
| Jenkins/GitLab CI | Docker 容器中运行 FFmpeg |
典型测试流程示例
def test_video_transcoding_1080p():
# 1. 生成测试文件
subprocess.run([
'ffmpeg', '-f', 'lavfi', '-i', 'testsrc=duration=5:size=1920x1080',
'-c:v', 'libx264', '-pix_fmt', 'yuv420p', 'test_input.mp4'
])
# 2. 调用被测转码器
result = video_codec.transcode('test_input.mp4', 'output.webm')
# 3. 用 FFmpeg 验证输出
probe = subprocess.run([
'ffprobe', '-v', 'error', '-select_streams', 'v:0',
'-show_entries', 'stream=width,height,codec_name',
'-of', 'json', 'output.webm'
], capture_output=True, text=True)
# 4. 断言
info = json.loads(probe.stdout)
assert info['streams'][0]['width'] == 1920
assert info['streams'][0]['height'] == 1080
assert info['streams'][0]['codec_name'] == 'vp8'
一句话:FFmpeg 在测试中既是「造雨者」(生成测试素材)又是「裁判」(验证输出结果),是音视频相关产品自动化测试的利器。