FFmpeg 封装格式转换:FLV 转 MP4 时的 metadata 保留与时间戳修复
此方案在保留元数据的同时,通过时间戳重映射确保 MP4 文件的时间基准 $\Delta t = \frac{1}{timescale}$ 符合标准,满足 $\sum \Delta t_i = duration$ 的连续性要求。
·
FFmpeg FLV 转 MP4:元数据保留与时间戳修复
1. 核心问题分析
- 元数据丢失:FLV 的
onMetaData标签(如视频尺寸、时长、帧率)在默认转换中可能被丢弃。 - 时间戳异常:FLV 的时间戳基值(
timescale)与 MP4 不同步,导致播放时出现音画不同步或跳帧。
2. 完整解决方案命令
ffmpeg -fflags +genpts -i input.flv \
-map_metadata 0 \ # 保留所有元数据
-movflags use_metadata_tags \ # 强制写入元数据
-copyts \ # 继承原始时间戳
-avoid_negative_ts make_zero \ # 修复负时间戳
-c:v copy -c:a copy \ # 流复制避免重编码
output.mp4
3. 关键参数说明
| 参数 | 作用 |
|---|---|
-fflags +genpts |
重新生成连续的时间戳序列 |
-map_metadata 0 |
将输入文件的元数据映射到输出文件 |
-movflags use_metadata_tags |
确保元数据写入 MP4 的 moov 头 |
-copyts |
直接复制原始时间戳值 |
-avoid_negative_ts make_zero |
将负时间戳归零(常见于直播流FLV) |
4. 验证转换结果
# 检查元数据是否保留
ffprobe -show_format output.mp4 | grep -E "TAG:"
# 检查时间戳连续性
ffprobe -show_frames output.mp4 | grep "pkt_pts_time"
5. 特殊场景处理
- 修复音画不同步:若仍有同步问题,添加
-vsync passthrough保持原始时间关系:ffmpeg -i input.flv -vsync passthrough -map_metadata 0 ... output.mp4 - 关键帧缺失:FLV 无固定 GOP 结构时,强制插入关键帧:
-force_key_frames "expr:gte(t,n_forced*2)" # 每2秒插入关键帧
6. 注意事项
- 优先使用
-c copy流复制避免质量损失 - 若源文件有损坏时间戳,需先修复 FLV:
flvmeta input.flv fixed.flv - 对于直播流 FLV,建议添加
-fflags +igndts忽略解码时间戳
此方案在保留元数据的同时,通过时间戳重映射确保 MP4 文件的时间基准 $\Delta t = \frac{1}{timescale}$ 符合标准,满足 $\sum \Delta t_i = duration$ 的连续性要求。
更多推荐
所有评论(0)