用 ffmpeg 6.1 把 2 小时直播录像按 30 秒切片,参数 -c copy,切出来的每段前 2 到 3 秒花屏,播放器要等关键帧才恢复;重新编码就正常,但耗时多 8 倍。
把日志和配置对完,能解释这个现象的基本就这几处。-c copy 只能从关键帧开始,切片点落在 P 帧;没有加 force_key_frames,segment_time 对不齐 GOP;源流 GOP 长度 10 秒,30 秒切片跨了多个关键帧;没开 reset_timestamps,时间戳跳变导致解码异常。
先看源流的关键帧间隔
ffprobe -v error -select_streams v:0 -show_frames -show_entries frame=pkt_pts_time,key_frame -of csv input.ts | grep ',1$' | head
然后切之前强制每 30 秒一个关键帧
ffmpeg -i input.ts -c:v libx264 -force_key_frames 'expr:gte(t,n_forced*30)' -c:a aac out.mp4
再按段切片并重置时间戳
ffmpeg -i out.mp4 -c copy -f segment -segment_time 30 -reset_timestamps 1 part_%03d.ts
末了抽第一段前 5 秒检查有无花屏帧
ffmpeg -i part_000.ts -t 5 -f null - 2>&1 | grep -i error
这类问题以前遇到过,但这次的触发条件和上次不一样。
改完先别撤,确认这几项。每段开头直接是关键帧,前 5 秒解码没有报错,播放器首帧时间小于 300 毫秒,切片总时长与源文件一致。
补一句。-c copy 快是因为不解码,但也失去了在任意位置切的能力;要精确切片就得先转码并固定关键帧,或者接受从关键帧对齐的切片点。这类问题最好一次改到位,反复小改反而容易把原因搅混。
