Мне нужно конвертировать серию изображений в гифки.
Я нашел три широких способа сделать это. Один с участием ImageMagick, один с gifsicle, а другой с avconv.
Я не могу использовать Imagemagick, потому что он намного медленнее, чем любой другой метод. Я не могу использовать gifsicle, потому что он не может работать с файлами "png". Я мог бы преобразовать PNG в gif-файлы с помощью команды ImageMagick 'mogrify', а затем собрать их в один gif-файл с gifsicle, но это могло бы привести к замедлению работы с помощью mogrify, что в моем случае нарушает условия сделки.
Я узнал, как делать то, что мне нужно, с avconv, но по какой-то причине результирующий gif имеет двойную частоту кадров.
Это команда, которую я использую:
avconv -i frame%15d.png -s qvga -vf format=rgb8,format=rgb24 -pix_fmt rgb24 -r 10 output.gif
И вывод с этим:
avconv version 9.13-6:9.13-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
built on May 9 2014 13:34:03 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, image2, from 'frame%15d.png':
Duration: 00:00:12.04, start: 0.000000, bitrate: N/A
Stream #0.0: Video: png, rgb24, 320x240, 25 fps, 25 tbr, 25 tbn
File 'output.gif' already exists. Overwrite ? [y/N] y
Output #0, gif, to 'output.gif':
Metadata:
encoder : Lavf54.20.3
Stream #0.0: Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
Stream mapping:
Stream #0:0 -> #0:0 (png -> rawvideo)
Press ctrl-c to stop encoding
frame= 121 fps= 0 q=0.0 Lsize= 10406kB time=12.10 bitrate=7044.8kbits/s
video:27225kB audio:0kB global headers:0kB muxing overhead -61.779245%
Есть 301 изображение, рассчитанное на 30 секунд, поэтому я устанавливаю частоту кадров 10. Кажется, что игнорирует это, хотя.
Если я также заставлю входную частоту кадров с помощью «-r 10», результирующий gif будет длиться 60 секунд при половине моей желаемой частоты кадров.
Команда с FPS форсируется как на входе, так и на выходе:
avconv -r 10 -i frame%15d.png -s qvga -vf format=rgb8,format=rgb24 -pix_fmt rgb24 -r 10 output2.gif
И вывод:
avconv version 9.13-6:9.13-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
built on May 9 2014 13:34:03 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
Input #0, image2, from 'frame%15d.png':
Duration: 00:00:12.04, start: 0.000000, bitrate: N/A
Stream #0.0: Video: png, rgb24, 320x240, 25 fps, 25 tbr, 25 tbn
Output #0, gif, to 'output2.gif':
Metadata:
encoder : Lavf54.20.3
Stream #0.0: Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc
Stream mapping:
Stream #0:0 -> #0:0 (png -> rawvideo)
Press ctrl-c to stop encoding
frame= 301 fps=270 q=0.0 Lsize= 25884kB time=30.10 bitrate=7044.5kbits/s
video:67725kB audio:0kB global headers:0kB muxing overhead -61.780963%
Я понятия не имею, что я делаю неправильно, и был бы признателен за чей-то вклад.
В качестве альтернативы, если кто-то знает быстрый способ конвертировать серию PNG-файлов в отдельные изображения без использования ImageMagick, я могу затем объединить их с помощью gifsicle.