Подтвердить что ты не робот

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

Я пытаюсь объединить аудиофайл с видеофайлом. У меня есть два варианта:

  • Имейте очень маленький видеофайл (например, 10 секунд), который повторяется, пока аудиофайл не закончен.

  • У меня есть очень длинный видеофайл (длиннее любого моего аудио файла), к которому я могу прикрепить аудио файл. Я хотел бы сократить видео, когда аудио закончено.

Я использую последний с опцией -t ffmpeg. Это означает, что я должен получить продолжительность аудио файла, чтобы передать его в ffmpeg. Можно ли избежать этого шага?

Любой указатель для первого решения?

4b9b3361

Ответ 2

Если вы хотите объединить новое аудио с видео повторяющимся видео до тех пор, пока аудио не закончится, вы можете попробовать это:

ffmpeg  -stream_loop -1 -i input.mp4 -i input.mp3 -shortest -map 0:v:0 -map 1:a:0 -y out.mp4

Использование -stream_loop -1 означает бесконечный цикл input.mp4, -shortest означает завершение кодирования, когда заканчивается самый короткий входной поток. Здесь самым коротким входным потоком будет input.mp3.

И если вы хотите объединить новый звук с видео повторять аудио до конца видео, вы можете попробовать это:

ffmpeg  -i input.mp4 -stream_loop -1 -i input.mp3 -shortest -map 0:v:0 -map 1:a:0 -y out.mp4

опция -y перезапишет выходные файлы без запроса.

Ответ 3

Для первого пункта пули я не вижу прямой команды. Я предлагаю использовать ffprobe для вычисления продолжительности обоих файлов и вычисления количества циклов видео, которые должны воспроизводиться в течение всего времени звучания.

Ниже приведена продолжительность ввода.

ffprobe -i input_media -show_entries format=duration -v quiet -of csv="p=0"

Затем вы можете зацикливать видео вручную, пока не удовлетворите вычисленное значение экземпляров видео.

ffmpeg -i input_audio -f concat -i <(for i in {1..n}; do printf "file '%s'\n" input_video; done) -c:v copy -c:a copy -shortest output_video

1..n означает количество циклов, в течение которых видео нужно зацикливать. Вместо -shortest вы можете использовать -t, поскольку вы уже рассчитали продолжительность звука.

Ниже приведена соответствующая оболочка script.

#!/bin/bash
audio_duration=$(ffprobe -i ${1} -show_entries format=duration -v quiet -of csv="p=0")
video_duration=$(ffprobe -i ${2} -show_entries format=duration -v quiet -of csv="p=0")
n_loops=$(echo "(${audio_duration} / ${video_duration}) + 1"|bc)
ffmpeg -i ${1} -f concat -i <(for i in {1..${n_loops}}; do printf "file '%s'\n" ${2}; done) -c:v copy -c:a copy -shortest ${3}

Для окон вы можете преобразовать эту оболочку script в пакетную версию script.

Дополнительная информация:

Надеюсь, это поможет!

Ответ 4

для первого, попробуйте ffmpeg -i yourmovie.mp4 -loop 10 запрограммировать вход 10 раз