You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FFmpeg按2秒间隔生成序列缩略图数量远低于预期的问题求助

FFmpeg按2秒间隔生成序列缩略图数量远低于预期的问题求助

哈喽,我来帮你分析下这个问题的原因,以及对应的解决办法:

问题根源拆解

你原本的思路是对的:15fps的视频,每2秒对应30帧,用select='not(mod(n,30))'来选帧。但实际生成数量不足,结合日志里的missing pictureno frame解码错误,核心问题出在输入视频本身存在帧丢失/编码损坏

  • nselect滤镜里指的是FFmpeg实际成功解码出来的帧序号,不是原始视频的理论帧序号。如果源视频有帧损坏,FFmpeg解码时会跳过这些无效帧,导致n的增长比理论值慢,mod(n,30)的筛选自然就会漏掉很多本该选中的时间点。
  • 你提到的Java执行时退出码69,在FFmpeg里对应EXIT_UNSUPPORTED,本质就是处理过程中遇到了不兼容或损坏的媒体数据,和日志里的报错完全对应。

针对性解决方案

既然依赖帧序号的筛选不可靠,我们换用基于时间戳的筛选逻辑,不管源视频有没有丢帧,都能严格按2秒间隔取帧,还能保证从0秒第一帧开始:

方案1:用时间戳替代帧序号做筛选

把原来的select='not(mod(n,30))'替换成基于时间戳t的筛选规则:

select='gte(t,0)*not(mod(t,2))'
  • gte(t,0):确保从0秒的第一帧开始选取
  • not(mod(t,2)):精准选中时间戳为2秒整数倍的帧(0s、2s、4s...)

修改后的完整命令如下:

ffmpeg -hwaccel cuvid -hwaccel_output_format cuda -i input_video.mp4 \
-vf "scale_npp=1024:576,hwdownload,format=nv12,setsar=1:1" -c:v h264_nvenc output_video.mp4 \
-vf "scale_cuda=160:90,hwdownload,format=nv12, select='gte(t,0)*not(mod(t,2))',setpts=N/FRAME_RATE/TB,setsar=1:1" output_thumbnails_%04d.jpg

方案2:修正fps=0.5的起始帧问题

你提到fps=0.5能得到正确数量,但起始帧不对,其实只需要加个start_time参数就能让它从0秒开始:

fps=0.5,start_time=0

这个滤镜会均匀采样,加上start_time=0后会优先抓取0秒的帧,之后每隔2秒取一帧,完全符合你的需求。修改后的滤镜部分:

-vf "scale_cuda=160:90,hwdownload,format=nv12, fps=0.5,start_time=0,setsar=1:1" output_thumbnails_%04d.jpg

额外建议:修复源视频(可选)

如果你的输入视频经常出现这类解码错误,建议先对源视频做一次修复编码,保证帧数据完整:

ffmpeg -hwaccel cuvid -i input_video.mp4 -c:v h264_nvenc -c:a copy repaired_input.mp4

用修复后的视频再执行缩略图生成命令,能从根源减少这类异常。

备注:内容来源于stack exchange,提问作者CtrlAltElite

火山引擎 最新活动