我正在将相当大的 .png 文件转换为 gif (2000X1000)
我用了这篇文章http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html大约一年前,我编写了一个脚本,通过插值找到了代码简单性的最佳平衡点。今天我注意到这个小脚本现在出错了
...
Input #1, png_pipe, from 'palette.png':
Duration: N/A, bitrate: N/A
Stream #1:0: Video: png, rgba(pc), 16x16 [SAR 1:1 DAR 1:1], 25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 (png) -> paletteuse:default
Stream #1:0 (png) -> paletteuse:palette
paletteuse -> Stream #0:0 (gif)
Press [q] to stop, [?] for help
[image2 @ 000001cb06eae700] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
Output #0, gif, to 'out.gif':
Metadata:
encoder : Lavf58.45.100
Stream #0:0: Video: gif, pal8, 1234x1088, q=2-31, 200 kb/s, 2 fps, 100 tbn, 2 tbc (default)
Metadata:
encoder : Lavc58.91.100 gif
Error marking filters as finished
Conversion failed!
可能是因为图像变大了,我在 Windows10 上,但这并不太相关。
movie.bat 的内容(请注意,如果您单独运行此代码,则需要删除 %%)
del done.txt
REM creates a color palette file first
c:\tools\ffmpeg\bin\ffmpeg.exe -f image2 -i %%02d.png -vf palettegen -y palette.png
REM use the palette file to speed up conversion
c:\tools\ffmpeg\bin\ffmpeg -framerate 2 -loop 0 -i %%02d.png -i palette.png -lavfi paletteuse -y out.gif
dir > done.txt
现在,可以通过添加 -thread_queue_size 100 来消除“线程消息队列阻塞;”,其中 100 大于输入文件的数量,但“过滤器”错误消息对我来说毫无意义,因为这个脚本大约在一年前运行良好。这里的“过滤器”引入了调色板文件,因为如果没有它,脚本过去会产生可怕的黄色伪影(较暗的像素变成黄色),如果我只运行,就会发生这种情况:
c:\tools\ffmpeg\bin\ffmpeg -f image2 -framerate 2 -loop 0 -i %02d.png -vf "format=rgba" -y out.gif
我感觉像素格式不是问题,因为我猜测的几种格式对结果图像没有影响,因此我在我的小脚本中使用了调色板文件。不,我不想使用 imagemagic,我希望能够在某个时候将其移植到 macos、ubuntu 和 centos,因此我在这里选择了工具。
答案1
据我所知,这种情况发生在混合 png 类型输入中。也就是说,如果您的 PNG 文件使用隐式调色板存储(png8 格式),而其他文件则没有(png32 格式)。请确保内部使用的编码相同,并且没有使用调色板
答案2
Error marking filters as finished
使用调色板 ( ) 时,我遇到了同样的问题 ( ) paletteuse
。我通过强制所有 PNG 图像具有相同的大小解决了该问题。