我有以下 ffmpeg 命令来创建 576p 视频,以及每 2 秒间隔的一系列缩略图。
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='not(mod(n,30))',setpts=N/FRAME_RATE/TB,setsar=1:1" output_thumbnails_%04d.jpg
输入视频的帧速率为15 帧每秒。根据我的理解,过滤器select='not(mod(n,30))',setpts=N/FRAME_RATE/TB
应该选择不能被 30 整除的帧(实际上每 30 帧提取一帧)。
假设视频时长为 500 秒,按照这个逻辑我应该得到约 250 个系列缩略图(每 2 秒一个),但创建的缩略图却少得多。
编辑:
该样本媒体为 7 分 32 秒(452 秒):样本媒体
只创建了 166 个系列缩略图,而应该创建 226 个。我在日志中看到以下警告:
[NULL @ 000001FE8468DE20] missing picture in access unit with size 23
[h264 @ 000001FE8744E830] no frame!
[NULL @ 000001FE8468DE20] missing picture in access unit with size 8
[h264 @ 000001FE8744EBF0] no frame!
Error while decoding stream #0:1: Invalid data found when processing input
Error while decoding stream #0:1: Invalid data found when processing input
当我在 Java 中运行类似的命令时ProcessBuilder
,我得到的进程退出值为69。我无法在 ffmpeg 的上下文中找到这实际上意味着什么。
附言:当我用 替换select='not(mod(n,30))',setpts=N/FRAME_RATE/TB
过滤器时fps=0.5
,我得到了正确数量的系列缩略图,但我无法使用,fps=0.5
因为它在大约 1 秒时间戳开始创建系列缩略图,而我想要从第一帧即第 0 秒开始的缩略图。