ffmpeg导出章节时间元数据与ffprobe输出不一致如何处理
ffmpeg与ffprobe章节时间偏差处理方案
偏差原因
你看到的时间差本质是ffprobe默认对格式化输出的时间字段做了四舍五入,不是两者读取的原始元数据有差异:
- ffmpeg导出的
ffmetadata中START/END是基于章节指定TIMEBASE的原始整数计数,没有任何舍入处理 - ffprobe输出的
start_time/end_time是面向阅读的展示值,默认保留6位小数,会自动对更精细的时间戳做四舍五入,所以和原始值有偏差
正确处理方式
方法1:用原始字段自行计算(无精度损失,优先推荐)
不要直接使用start_time/end_time这两个格式化字段,改用ffprobe输出的原始整数+时间基计算精确时间:
- 取ffprobe输出的
start、end整数字段,结合对应章节的time_base(格式为分子/分母)计算:
以你给出的示例为例,精确时间(秒) = 整数字段值 * 分子 / 分母time_base为1/1000时,533975 * 1 / 1000 = 533.975秒,和ffmpeg导出的结果完全一致。
如果发现ffprobe输出的start/end整数字段和ffmpeg的不匹配,给命令加-keep_chapters 1参数即可保留章节原始时间基,不会做自动转换。
方法2:调整ffprobe参数直接输出无舍入时间
如果需要ffprobe直接输出和ffmpeg对齐的格式化时间,修改命令增加精度参数即可:
ffprobe -i INPUT.mp4 -keep_chapters 1 -show_chapters -print_format json -precision 9
-precision 9会保留9位小数,关闭默认的四舍五入逻辑,输出的start_time/end_time就和ffmpeg的原始时间完全匹配。
方法3:元数据回写适配
如果需要把ffprobe读取的章节信息重新写入ffmetadata格式,直接把ffprobe的start/end整数字段作为START/END的值,把time_base作为TIMEBASE的值即可,不需要额外换算。
内容的提问来源于stack exchange,提问作者loretoparisi
相关产品推荐
相关产品推荐

