我有大约 10k 个 PNG 文件,想要将其转换为视频。
从环顾互联网我遇到了 ffmpeg 并选择运行以下命令:
ffmpeg -f image2 -r 25 -i img/* -vcodec libx264 -crf 22 video.mp4
首先,运行此命令会产生提示File 'img/00001.png' already exists. Overwrite ? [y/N]
,这对我来说似乎有点奇怪,因为据我所知,该命令不应该修改图像本身,而只是创建一个新video.mp4
文件?
无论如何,我不想按y
10k 次,所以我备份了我的图像并修改了命令:
ffmpeg -f image2 -r 25 -i img/* -vcodec libx264 -crf 22 -y video.mp4
现在,程序似乎可以很好地处理 254 张图像,但随后会抛出错误:
[png @ 0x7facf0503800] ff_frame_thread_encoder_init failed
Error initializing output stream 255:0 -- Error while opening encoder for output stream #255:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!
如果它有用,我添加了完整日志文件在这里.另外,以下是图片中的一个例子我想皈依。另外,这是臭名昭著的 255 帧,导致程序崩溃。
答案1
ffmpeg 要求每个输入文件都有自己的-i
参数,因此当你运行 时-i img/*
,你的 shell 会将通配符扩展为一系列图像,而 ffmpeg 则会将其读取为一输入图像,但输出图像为 10k(减一)。换句话说,ffmpeg 将看到:
ffmpeg … -i img/00000.png img/00001.png …
告诉它将其用作00000.png
输入和00001.png
输出。事实上,您将 用 的内容00001.png
覆盖所有文件。所以我希望您备份了这些文件。00254.png
00000.png
恢复原始输入文件后,请再次检查命令。您没有使用通配符%d
来指定图像编号(链接的答案中显示了这一点)。因此,请使用:
ffmpeg -f image2 -framerate 25 -i img/%05d.png -vcodec libx264 -crf 22 video.mp4
欲了解更多信息,请查看幻灯片放映指南。您还可以在此处找到用于指定输入文件列表的不同选项(例如通过 glob 模式,类似于您尝试执行的操作)。
答案2
你能也可以使用星号通配符,但文件列表需要用引号引起来,以防止根据答案进行扩展@slhck,并且您需要一个额外的选项pattern_type
来告诉它使用通配符。
ffmpeg -f image2 -r 25 -pattern_type glob -i 'img/*.png' -vcodec libx264 -crf 22 video.mp4