FFmpeg是什么?
FFmpeg 是音视频处理的终极工具箱,支持编解码、转换、剪辑、合并、流媒体推拉流等几乎所有音视频操作。
ffmpeg = 视频编码转换 + 音频处理 + 流媒体 + 提取/合并 + 滤镜特效
核心组件
|
组件 |
功能 |
|---|---|
|
ffmpeg |
音视频转换/处理主程序 |
|
ffprobe |
分析媒体文件信息 |
|
ffplay |
简易播放器 |
|
ffmpeg-libav* |
库供其他程序调用 |
使用场景
1. 格式转换
# 视频转换 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
2. 剪辑提取
# 剪切片段(从 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
3. 合并/拼接
# 合并两个视频
ffmpeg -f concat -i filelist.txt -c copy output.mp4
4. 压缩优化
# 压缩视频(H.264)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
# CRF 范围:18(接近无损)~ 28(高压缩)
5. 添加水印/字幕
# 添加图片水印
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
6. 流媒体推流
# 推流到 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
7. 降噪/增强
# 视频降噪
ffmpeg -i input.mp4 -filter_complex "denoise=s=7" output.mp4
# 音频降噪
ffmpeg -i input.mp4 -af "audiodenoise=0.8" output.mp4
8. 分辨率/帧率调整
# 缩放到 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 |
自动覆盖输出 |
核心应用场景
1. 媒体处理功能测试
测试场景:验证视频转码功能是否正确
├── 输入各种格式的视频文件(mp4/mkv/avi/webm)
├── 调用转码逻辑
└── 用 FFmpeg 提取输出文件的元数据/帧进行断言
2. 视频对比/回归测试
# 对比两个视频是否完全一致
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 -
3. 生成测试数据
# 生成特定规格的测试视频
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
4. 流媒体推拉流测试
# 自动启动推流
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
5. 性能/压力测试
# 批量并发转码测试
for i in {1..100}; do
ffmpeg -i input.mp4 -c:v libx264 output_$i.mp4 &
done
wait
# 统计成功率、耗时、资源占用
6. 音视频同步测试
# 提取音视频分别计算时长,验证同步性
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
7. 兼容性测试
测试矩阵:
├── 编码器:libx264 / libx265 / VP9 / AV1
├── 容器:mp4 / mkv / webm / mov
├── 分辨率:720p / 1080p / 4K / 8K
└── FFmpeg 版本:4.4 / 5.0 / 6.0 / 7.0
→ 用 FFmpeg 生成所有组合的测试文件
→ 验证播放器能否正确解析
8. 自动化截图对比
# 定时截取视频帧
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 在测试中既是「造雨者」(生成测试素材)又是「裁判」(验证输出结果),是音视频相关产品自动化测试的利器。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/aovenus/article/details/160451215



