Используйте ffmpeg для последовательного добавления нескольких звуковых дорожек и закрепления определенной дорожки до конца. - PullRequest
0 голосов
/ 03 января 2019

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

Основной случай может выглядеть примерно так:

|-----------VIDEO-----------VIDEO-------------VIDEO-----------VIDEO-----------|  
|---FULL AUDIO TRACK 1---|---FULL AUDIO TRACK 2---|---PARTIAL AUDIO TRACK 3---|

Вот моя попытка достичь этого:

ffmpeg -i video.mov -i audio1.mp3 -i audio2.mp3 -i audio3.mp3 -map 0:0 -map 1:0 -map 2:0 -map 3:0 out.mp4

Конечно, это не дало желаемого результата.Он использует только первый музыкальный клип в out.mp4, и никакие другие звуковые дорожки не запускаются, когда он заканчивается.

Вопрос 1
Чего мне не хватает, чтобы добавить несколько аудиотреки последовательно?Я предполагаю, что это указывает начальную и конечную точки аудиоклипов, но я не могу найти синтаксис.

...

Кроме того, я ищу способ гарантировать, что видео заканчивается полной продолжительностью AUDIO TRACK 3, как показано ниже:

|-----------VIDEO-----------VIDEO-------------VIDEO-----------VIDEO-----------|  
|---FULL AUDIO TRACK 1---|---PARTIAL AUDIO TRACK 2---|---FULL AUDIO TRACK 3---|

В этом случае AUDIO TRACK 2 обрезается таким образом, что полный AUDIO TRACK 3 закрепляется до конца.

Вопрос 2
Можно ли выполнить этот тип закрепления звукав FFmpeg, или мне сначала придется обрезать AUDIO TRACK 2 другой программой?

1 Ответ

0 голосов
/ 03 января 2019

Используйте фильтры atrim, asetpts и concat:

ffmpeg -i video.mov -i audio1.mp3 -i audio2.mp3 -i audio3.mp3
  -filter_complex "[2:a]atrim=duration=5,asetpts=PTS-STARTPTS[a2];[1:a][a2][3:a]concat=n=3:a=1:v=0[a]"
  -map 0:v -map "[a]" -c copy -c:a aac -shortest output.mp4
  • atrim обрезает звук. Вы также можете использовать опции start и / или end, если предпочитаете их duration.
  • asetpts сбрасывает метки времени (требуется concat).
  • concat объединяет каждый аудиосегмент.

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

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4

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

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