FFmpeg提取关键帧时出现Invalid pts错误,求解决方案
解决FFmpeg提取关键帧时PTS重复报错问题
问题重现
执行以下命令提取视频场景关键帧时,部分视频出现PTS重复错误导致中断:
ffmpeg -i data/full_videos/pleasantville_1998.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames/%05d.jpg
错误信息:
[mjpeg @ 0x6492f1e8a3c0] Invalid pts (3883) <= last (3883) [vost#0:0/mjpeg @ 0x6492f213e6c0] Error submitting video frame to the encoder [vost#0:0/mjpeg @ 0x6492f213e6c0] Error encoding a frame: Operation not permitted [vost#0:0/mjpeg @ 0x6492f213e6c0] Task finished with error code: -1 (Operation not permitted) [vost#0:0/mjpeg @ 0x6492f213e6c0] Terminating thread with return code -1 (Operation not permitted) [out#0/image2 @ 0x6492f1fc1340] video:1898KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown frame= 47 fps=9.7 q=24.8 Lsize=N/A time=00:02:41.99 bitrate=N/A speed=33.5x Conversion failed!
解决方案
方案1:修改命令,添加错误容忍与PTS重置滤镜
直接在原命令中加入错误忽略参数和PTS重置滤镜,强制生成递增的时间戳,避免编码器报错:
ffmpeg -i data/full_videos/pleasantville_1998.mp4 -err_detect ignore_err -filter:v "select='gt(scene,0.1)',setpts=N/FRAME_RATE/TB,showinfo" -vsync 0 frames/%05d.jpg
参数说明:
-err_detect ignore_err:忽略解码阶段的错误,让FFmpeg继续处理后续帧setpts=N/FRAME_RATE/TB:根据帧序号和视频帧率重新生成唯一递增的PTS,解决重复PTS问题
方案2:先修复视频元数据,再提取关键帧
如果方案1无效,先将视频重新封装,修复异常的时间戳元数据,再执行提取命令:
- 生成修复后的临时视频文件:
ffmpeg -i data/full_videos/pleasantville_1998.mp4 -c copy -map 0 -err_detect ignore_err temp_fixed.mp4
- 从修复后的视频提取关键帧:
ffmpeg -i temp_fixed.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames/%05d.jpg
补充说明
手动观看视频正常是因为播放器会自动兼容异常的时间戳,但FFmpeg的MJPEG编码器对PTS的唯一性要求严格,重复的PTS会触发编码中断。上述方案通过忽略错误或重置PTS,实现跳过异常片段继续提取有效帧的需求。
内容的提问来源于stack exchange,提问作者ludog
相关产品推荐
相关产品推荐

