Объедините видео и аудио с помощью ffmpeg.Зацикливание видео, пока аудио не закончено - PullRequest
17 голосов
/ 16 февраля 2011

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

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

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

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

Есть ли указатель для первого решения?

Ответы [ 4 ]

1 голос
/ 25 апреля 2019

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

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

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

1 голос
/ 17 февраля 2011

Вторая точка маркера была легко решена с помощью опции -shortest в ffmpeg. Подробнее см. http://www.ffmpeg.org/ffmpeg-doc.html#SEC12.

0 голосов
/ 14 июля 2015

Для первой точки пули я не вижу прямой команды.Я предлагаю использовать 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, так как вы уже рассчитали продолжительность аудио.

Ниже приведен связанный скрипт оболочки.

#!/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}

Для окон вы можете конвертировать этоСценарий оболочки для пакетного сценария.

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

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

0 голосов
/ 01 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...