Ffmpeg python: бесконечный цикл одного первого кадра со звуком

Я пытаюсь сделать видео из изображения и аудио с пакетом ffmpeg python, изображение будет зацикливаться до тех пор, пока звук не закончится, я попробовал цикл = 1 и самый короткий аргумент, но не работает, ffmpeg может работать бесконечно. Это мой код:

audio = ffmpeg.input("test/audios/1.mp3",)
image = ffmpeg.input("test/images/1.jpg", loop = "1")
video = ffmpeg.concat(image, audio, v=1, a=1).output("test/test.mp4", shortest=None,  vcodec = "mjpeg", acodec = "mp3")
ffmpeg.run(video)

информация из get_args()

['-loop', '1', '-i', 'test/images/1.jpg', '-i', 'test/audios/1.mp3', '-filter_complex', '[0][1]concat=a=1:n=1:v=1[s0]', '-map', '[s0]', '-acodec', 'mp3', '-shortest', '-vcodec', 'mjpeg', 'test/test.mp4']
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема заключается в использовании ffmpeg.concat для слияния видео и аудио.

ffmpeg.concat применяет concat filer.
Можно использовать concat-фильтр для слияния видео- и аудиопотоков, но фильтр предназначен для конкатенации («сцепления») нескольких видео- (и/или аудио) потоков.

Аргумент shortest не влияет на фильтр concat, поэтому ffmpeg работает бесконечно.

Вместо использования фильтра concat используйте видео- и аудиовходы в качестве первых аргументов для ffmpeg.output (до "test/test.mp4").


Другие вопросы:

  • Существует проблема совместимости для кодека MJPEG и файлового контейнера MP4.
    VLC Player успешно воспроизводит файл MP4, но другие проигрыватели могут его не поддерживать.
    Мы можем создать файл MOV вместо MP4 (MOV и MP4 почти идентичны).
    (Мы также можем рассмотреть возможность выбора другого видеокодера, например libx264).
    При использовании кодека MJPEG рекомендуется установить pix_fmt='yuvj420p' (для лучшей совместимости).
  • Частота кадров по умолчанию для цикла изображения составляет 25 кадров в секунду (и это кажется слишком большим для статического изображения).
    Мы можем установить частоту кадров с помощью framerate=fps.

Пример кода:

import ffmpeg

fps = 10  # Use 10 fps (the default is 25fps).
audio = ffmpeg.input("test/audios/1.mp3").audio
image = ffmpeg.input("test/images/1.jpg", loop = "1", framerate=fps).video

ffmpeg_command = ffmpeg.output(image, audio, "test/test.mov", shortest=None, vcodec = "mjpeg", pix_fmt='yuvj420p', acodec = "mp3")
ffmpeg_command.overwrite_output().run()

Для лучшего качества и скорости мы можем избежать повторного кодирования с использованием аргумента codec = "copy":

ffmpeg_command = ffmpeg.output(image, audio, "test/test.mov", shortest=None, codec = "copy")

Большое спасибо. Я пытался использовать fluent-ffmpeg, без комплекса фильтров по умолчанию.

Nguyen Nguyen 02.06.2023 14:21

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