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. 注意事项
  1. 优先使用 -c copy 流复制避免质量损失
  2. 若源文件有损坏时间戳,需先修复 FLV:
    flvmeta input.flv fixed.flv
    

  3. 对于直播流 FLV,建议添加 -fflags +igndts 忽略解码时间戳

此方案在保留元数据的同时,通过时间戳重映射确保 MP4 文件的时间基准 $\Delta t = \frac{1}{timescale}$ 符合标准,满足 $\sum \Delta t_i = duration$ 的连续性要求。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐