Ответ 1
Вторая точка пули была легко решена с помощью опции -shortest ffmpeg. Подробнее см. http://www.ffmpeg.org/ffmpeg-doc.html#SEC12.
Я пытаюсь объединить аудиофайл с видеофайлом. У меня есть два варианта:
Имейте очень маленький видеофайл (например, 10 секунд), который повторяется, пока аудиофайл не закончен.
У меня есть очень длинный видеофайл (длиннее любого моего аудио файла), к которому я могу прикрепить аудио файл. Я хотел бы сократить видео, когда аудио закончено.
Я использую последний с опцией -t ffmpeg. Это означает, что я должен получить продолжительность аудио файла, чтобы передать его в ffmpeg. Можно ли избежать этого шага?
Любой указатель для первого решения?
Вторая точка пули была легко решена с помощью опции -shortest ffmpeg. Подробнее см. http://www.ffmpeg.org/ffmpeg-doc.html#SEC12.
Если вы хотите объединить новое аудио с видео повторяющимся видео до тех пор, пока аудио не закончится, вы можете попробовать это:
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 перезапишет выходные файлы без запроса.
Для первого пункта пули я не вижу прямой команды. Я предлагаю использовать 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.
Дополнительная информация:
Надеюсь, это поможет!
для первого, попробуйте ffmpeg -i yourmovie.mp4 -loop 10
запрограммировать вход 10 раз