Разделите фильм так, чтобы каждый GIF был меньше определенного размера файла

Проблема

Я хочу превратить длинный фильм в сериал на анимированных GIF-файлах.

Размер каждого GIF должен быть ‹5 МБ.

Есть ли способ определить размер GIF во время его кодирования?

Прогресс на данный момент

Я могу разделить фильм на отдельные кадры:

ffmpeg -i movie.ogv -r 25 frameTemp.%05d.gif

Затем я могу использовать convert от ImageMagick для создания GIF-файлов. Однако я не могу найти способ определить вероятный размер файла до запуска команды.

Кроме того, я могу разделить фильм на куски:

ffmpeg -i movie.ogv -vcodec copy -ss 00:00:00 -t 00:20:00 output1.ogv

Но я не знаю, будет ли размер файла convert в формате GIF меньше 5 МБ.

10-секундная сцена с большим количеством действий может занимать более 5 МБ (плохо!), а статическая сцена может занимать менее 5 МБ (не проблема, но не очень эффективно).

Идеи

Я думаю, что я хочу преобразовать весь фильм в GIF, а затем найти способ разделить его по размеру файла.

Глядя на ImageMagick, я могу разбить GIF на кадры, но не вижу способа разбить его на анимированные GIF определенного размера/длины.

Итак, возможно ли это?


person Terence Eden    schedule 08.07.2014    source источник


Ответы (1)


Насколько мне известно, в настоящее время в avconv нет опции «Остановить на этом размере». Его, конечно, можно довольно быстро взломать, но в настоящее время проект libav не делает быстрых взломов, поэтому, скорее всего, он сначала появится в ffmpeg.

В дополнение к этому вы столкнулись с проблемой того, что анимированный gif является очень старым форматом и, следовательно, делает некоторые довольно странные вещи. Позвольте мне объяснить, как это обычно работает:

  1. Вы создаете серию кадров от первого до последнего и кладете их друг на друга.
  2. Вы делаете все «будущие» кадры невидимыми и настраиваете их появление в определенное время.
  3. Чтобы уменьшить размер файла, вы смотрите «под» новые кадры, и если предыдущий пиксель такой же, вы устанавливаете этот конкретный пиксель как непрозрачный.

Этот третий шаг — единственное временное сжатие, которое выполняется в анимированном gif, без него размер файла будет намного больше (поскольку каждый пиксель нужно сохранять снова и снова).

Однако, если вы не уверены, когда был последний разрыв, вы не можете определить, совпадает ли пиксель с предыдущими «кадрами». Ведь именно этот кадр может быть самым первым на изображении.

Если ограничение в 5 МБ достаточно мягкое, чтобы его можно было немного превысить, вы, вероятно, можете собрать что-то вместе, которое просто продолжает добавлять кадр за кадром и сразу вычисляет окончательный размер файла. Как только вы превысите лимит, просто остановитесь и используйте следующий кадр в качестве отправной точки для следующего файла.

person v010dya    schedule 09.11.2014