07-ffprobe 与排错:流选择(map)、同步、常见报错¶
目录页:见 FFmpeg 文档目录
FFmpeg 真正“劝退新手”的地方不是转码命令,而是:
- 输入文件不规整(多音轨、多字幕、VFR、时间戳异常)
- 输出容器/编码要求多(播放器/平台限制)
- 报错信息看不懂
这章给你一套可复用的排错顺序。
1. 先用 ffprobe 把输入“看清楚”¶
1.1 最常用:直接看流信息¶
你要重点看:
- 有几条视频/音频/字幕流
- 编码是什么(h264/hevc/aac/opus…)
- 帧率是 CFR 还是 VFR(观察 avg_frame_rate / r_frame_rate)
- 像素格式(yuv420p / yuv444p / nv12…)
1.2 结构化输出(更适合“看字段”)¶
2. -map:把“选流”变成可控的¶
2.1 只要视频 + 第一条音频¶
2.2 只要视频,不要音频/字幕¶
2.3 选指定语言的音轨¶
工程建议:
- 只要你发现文件里有多条流,就别赌默认策略,直接写
-map
3. 同步问题:先判断是不是 VFR¶
“音画不同步/剪切后错位/抽帧不均匀”常见根因之一是 VFR。
处理思路:
ffprobe看帧率字段与时长是否异常- 需要稳定剪辑就转 CFR:
当你只想转封装(-c copy)但又遇到同步坑时,通常意味着:
- 你需要接受“重编码一次换稳定”
4. 常见报错与第一反应¶
4.1 Non-monotonous DTS / Invalid DTS¶
直觉:时间戳顺序不对或容器里写得很怪。
第一反应:
- 先转码一次(让 FFmpeg 重新生成时间戳)
- 或者转封装到更宽容的容器(例如 mkv)
4.2 moov atom not found(MP4)¶
直觉:文件不完整/不是标准 mp4。
第一反应:
- 确认文件是否下载完整
- 如果是你自己生成 mp4 时中断了,通常救不了
4.3 Could not find codec parameters¶
直觉:容器信息不足/需要更多探测数据。
第一反应(增加探测):
4.4 Unknown encoder 'libx264'¶
直觉:你的 FFmpeg build 没带这个编码器(或是受 license/feature 影响)。
第一反应:
ffmpeg -encoders | findstr x264- 换成你现有 build 支持的编码器
5. 日志与报告:让问题可复现¶
5.1 让输出更“可读”¶
常用 loglevel:
error:只看错误warning:警告 + 错误info:默认偏详细verbose/debug:排错用
5.2 生成报告文件¶
会在当前目录生成日志文件,适合你把问题贴出来或自己回看。
6. 排错清单(按顺序做,效率最高)¶
- 用
ffprobe看清楚流:有几条视频/音频/字幕,编码是什么 - 明确你要“转封装”还是“转码”
- 涉及多流就写
-map - 遇到同步坑先怀疑 VFR,再决定是否转 CFR
- 兼容性问题优先试
-pix_fmt yuv420p - 遇到诡异报错先开日志与
-report,保证可复现