Используя только ffmpeg, возможно ли использовать исходное изображение GIF и выводить видео с установленной длиной> одного цикла через входной GIF?

Допустим, у меня есть 8-кадровый анимированный GIF, который длится 2 секунды. Я хотел бы создать видеофайл (кодек не имеет значения на данный момент), который имеет длину 30 секунд и состоит из исходного GIF, повторяющегося снова и снова.

Можно ли сделать это, используя только ffmpeg ? Ответы, которые используют convert или какая-либо другая утилита предварительной обработки не в счет [причина в том, что я хотел бы использовать это на PandaStream, у которого нет этой утилиты]. Предположим также, что о сценариях оболочки не может быть и речи, хотя это могут быть несколько команд ffmpeg.


Вещи, которые я пробовал, не работали (хотя, возможно, я сделал их неправильно, я не очень знаком с ffmpeg):

  1. С использованием -loop_input, -loop_output параметры присутствуют в документации ffmpeg. Используя оба ffmpeg 1.2 и 2.0, я получаю Unrecognized option 'loop_[input|output]' сообщение об ошибке. Я мог бы использовать это неправильно, хотя, так как ошибка о не распознавании опции, хотя в документах говорится, что она устарела.

  2. -loop вариант. Кажется, ничего не делает с GIF -> Видео. Я думаю, что этот флаг и вышеупомянутый флаг связаны с генерацией анимированных GIF-файлов в качестве вывода.

  3. Concat. Делать что-то вроде:

    ffmpeg -i "concat: image.gif | image.gif | image1.gif | image2.gif | image3.gif | image4.gif" image-long.gif

    В результате получается 16-кадровый GIF (то есть два GIF-файла объединяются), который является прогрессом, хотя выходной GIF имеет гораздо более низкое качество.


Я немного сошел с ума здесь (я пробовал много других комбинаций вышеупомянутых понятий), я сейчас нахожусь в точке "тыкаю это палкой", надеюсь, кто-то там сделал это!

1 ответ

Решение

Является ли это возможным? Да.

Посмотрев на Как объединить (объединить, объединить) медиа-файлы, мы можем взять gif и транскод в потоки mpeg (вы можете скопировать первый дважды):

ffmpeg -i image.gif -f mpegts image1.ts
ffmpeg -i image.gif -f mpegts image2.ts
ffmpeg -i image.gif -f mpegts image3.ts

затем объединить их, выводя в формате GIF

ffmpeg -i "concat:image1.ts|image2.ts|image3.ts" -pix_fmt rgb24 output.gif

Начиная с mp4 или аналогичного, кажется, дает лучшие результаты; заменить первый шаг на

ffmpeg -i image.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts image1.ts

и повторите для других копий.

Я создаю несколько копий одного и того же, потому что если я пытаюсь concat: один и тот же файл несколько раз (concat:image1.ts|image1.ts|image1.ts) это не работает.

наслаждаться

Другие вопросы по тегам