FFmpeg 工具介绍

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 提取输出文件的元数据/帧进行断言

  1. 视频对比/回归测试

    对比两个视频是否完全一致

    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 -

  2. 生成测试数据

    生成特定规格的测试视频

    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

  3. 流媒体推拉流测试

    自动启动推流

    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

  4. 性能/压力测试

    批量并发转码测试

    for i in {1..100}; do

    ffmpeg -i input.mp4 -c:v libx264 output_$i.mp4 &

    done

    wait

    统计成功率、耗时、资源占用

  5. 音视频同步测试

    提取音视频分别计算时长,验证同步性

    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

  6. 兼容性测试

测试矩阵:

├── 编码器:libx264 / libx265 / VP9 / AV1

├── 容器:mp4 / mkv / webm / mov

├── 分辨率:720p / 1080p / 4K / 8K

└── FFmpeg 版本:4.4 / 5.0 / 6.0 / 7.0

→ 用 FFmpeg 生成所有组合的测试文件

→ 验证播放器能否正确解析

  1. 自动化截图对比

    定时截取视频帧

    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 在测试中既是「造雨者」(生成测试素材)又是「裁判」(验证输出结果),是音视频相关产品自动化测试的利器。

相关推荐
jr-create(•̀⌄•́)3 小时前
简单视频编辑tools
python·ffmpeg
山栀shanzhi20 小时前
在做直播时,I帧的间隔(GOP)一般是多少?
网络·c++·面试·ffmpeg
weixin_421607551 天前
SRT字幕驱动视频自动分镜切割:电影解说批量生成的工程实现思路
ffmpeg·srt字幕·ai剪辑·影视解说·ai电影解说·视频自动切割·字幕文件解析
相偎1 天前
arm平台编译mpp、ffmpeg和xfreerdp
arm开发·ffmpeg
LoyalToOrigin2 天前
iOS 26 libass字幕渲染问题兼容解决实践
ios·ffmpeg·objective-c
siv772 天前
影视解说视频智能生产全链路方案解析:从脚本生成到多平台分发
ffmpeg·srt字幕·ai剪辑·影视解说·ai电影解说·视频自动切割·字幕文件解析
独占的甜蜜2 天前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析过程
ffmpeg·whisper·音视频
独占的甜蜜2 天前
从FLAC到WAV:whisper.cpp中的FFmpeg音频预处理全解析
ffmpeg·whisper·音视频
JMchen1233 天前
集成第三方 C/C++ 库到 Android NDK 项目:OpenCV 与 FFmpeg 实战指南
opencv·ffmpeg·音视频开发·cmake·jni·ndk·abi 兼容性