Используя только ffmpeg, возможно ли использовать исходное изображение GIF и выводить видео с установленной длиной> одного цикла через входной GIF?
Допустим, у меня есть 8-кадровый анимированный GIF, который длится 2 секунды. Я хотел бы создать видеофайл (кодек не имеет значения на данный момент), который имеет длину 30 секунд и состоит из исходного GIF, повторяющегося снова и снова.
Можно ли сделать это, используя только ffmpeg
? Ответы, которые используют convert
или какая-либо другая утилита предварительной обработки не в счет [причина в том, что я хотел бы использовать это на PandaStream, у которого нет этой утилиты]. Предположим также, что о сценариях оболочки не может быть и речи, хотя это могут быть несколько команд ffmpeg.
Вещи, которые я пробовал, не работали (хотя, возможно, я сделал их неправильно, я не очень знаком с ffmpeg):
С использованием
-loop_input
,-loop_output
параметры присутствуют в документации ffmpeg. Используя оба ffmpeg 1.2 и 2.0, я получаюUnrecognized option 'loop_[input|output]'
сообщение об ошибке. Я мог бы использовать это неправильно, хотя, так как ошибка о не распознавании опции, хотя в документах говорится, что она устарела.-loop
вариант. Кажется, ничего не делает с GIF -> Видео. Я думаю, что этот флаг и вышеупомянутый флаг связаны с генерацией анимированных GIF-файлов в качестве вывода.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
) это не работает.
наслаждаться