Я работаю на этом примере из вики ffmpeg

ffmpeg
    -i 1.avi -i 2.avi -i 3.avi -i 4.avi
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
        [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
        [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
        [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=320:y=240
    "
    -c:v libx264 output.mkv

Проблема в том, что он всегда берет звук из первого фильма. Как я могу, например, получить звук из второго фильма?

Добавление Channelmap в -filter_complex кажется правильным, но я не могу понять, как ссылаться на дорожки в фильмах.

Я попробовал варианты этого:

channelmap=map=0.0.0=1.0.0|0.0.1=1.0.1

Но это дает синтаксические ошибки.

1 ответ1

1

Вы можете использовать опцию -map. В противном случае вы будете ограничены поведением выбора потока по умолчанию, которое может не выбирать то, что вы хотите.

пример

Это отобразит аудио со второго входа (2.avi):

-map 1:a
  • Поскольку ffmpeg начинает отсчет с 0, первый входной идентификатор равен 0, второй - 1, третий - 2 и т.д.

  • Если второй вход имеет несколько аудиопотоков, это отобразит их все. Например, если вам нужен только четвертый аудиопоток со второго входа, вы можете использовать -map 1:a:3 .

С фильтрацией

Я склонен явно ffmpeg какой поток использовать, чтобы избежать двусмысленности, вместо того, чтобы полагаться на значения по умолчанию. Таким образом, ваша команда может выглядеть следующим образом:

ffmpeg
    -i 1.avi -i 2.avi -i 3.avi -i 4.avi
    -filter_complex "
        nullsrc=size=640x480 [base];
        [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft];
        [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
        [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
        [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
        [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
        [tmp3][lowerright] overlay=shortest=1:x=320:y=240[v]
    "
    -map "[v]" -map 1:a -c:v libx264 -shortest output.mkv
  • Обратите внимание на два экземпляра [v] и 1:a: они будут отображать видео из графа фильтра и аудио со второго входа (2.avi).

  • Я добавил -shortest чтобы убедиться, что вывод заканчивается, когда заканчивается самый короткий ввод (либо [v] либо 1:a).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .