前言
最近在整理视频资源时,发现很多老项目用的是FLV格式,但现代播放器和流媒体服务更倾向MP4。于是研究了下用FFmpeg进行格式转换,这里记录下从入门到优化的全过程。
为什么要转换格式
FLV和MP4都是容器格式,但差异明显:
FLV:早期Flash视频专用,对H.264/AAC支持有限,部分新编码器不兼容MP4:标准ISO格式,支持H.265/VP9等现代编码,兼容所有主流平台
特别遇到这些情况建议转换:
需要在移动端播放要使用HEVC编码节省存储需要嵌入字幕或章节信息
基础转换命令
最简转换命令(无参数优化):
ffmpeg -i input.flv -c copy output.mp4
这个命令直接复制原始流(-c copy),速度最快但可能有问题:
部分FLV的音频是MP3编码,MP4标准要求AAC时间戳可能不兼容
参数优化方案
1. 视频质量控制
推荐使用CRF(恒定质量模式):
ffmpeg -i input.flv -c:v libx264 -crf 23 -preset slow output.mp4
-crf 23:视觉无损范围(18-28),值越小质量越高-preset:速度与压缩率权衡,可选ultrafast到veryslow
2. 音频处理
强制转AAC音频(兼容性最佳):
ffmpeg -i input.flv -c:v libx264 -c:a aac -b:a 128k output.mp4
3. 多线程加速
ffmpeg -threads 4 -i input.flv -c:v libx264 -threads 4 output.mp4
完整生产级示例
ffmpeg \
-i input.flv \
-c:v libx264 -crf 22 -preset faster -movflags +faststart \
-c:a aac -b:a 160k -ar 44100 \
-vf "scale=1280:720,fps=30" \
-threads 0 \
-y output.mp4
参数详解:
-movflags +faststart:优化网络播放-vf 缩放和帧率统一-threads 0:自动选择线程数
常见问题解决
音频不同步
尝试添加-async 1参数:
ffmpeg -i input.flv -async 1 output.mp4
时间戳错误
重建时间戳:
ffmpeg -i input.flv -vsync passthrough output.mp4
性能实测对比
测试环境:4核CPU,1080p视频
| 参数组合 | 转换时间 | 输出大小 |
|----------|---------|---------|
| -c copy | 8s | 98MB |
| CRF23+fast | 42s | 86MB |
| CRF20+slow | 3m15s | 78MB |
批量处理技巧
用find+xargs批量转换:
find . -name "*.flv" -print0 | xargs -0 -I {} ffmpeg -i "{}" "{}.mp4"
结语
实际使用时建议:
先小样测试确定参数长时间运行监控内存(FFmpeg可能内存泄漏)不同内容适用不同preset,访谈类用faster,电影用slow
遇到有趣的结果欢迎分享你的参数组合~