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

ffmpeg -i INPUT -map 0 -c copy -map 0:a:0 -c:a:0 copy -map -0:a:0? -c:a libfdk_aac -ac 1 OUTPUT

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

ffmpeg -i INPUT -map 0 -c copy -map -0:a:0? -c:a libfdk_aac -ac 1 -map 0:a:0 -c:a:0 copy OUTPUT

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

1 ответ1

3

использование

ffmpeg -i INPUT -map 0 -c copy -c:a libfdk_aac -c:a:0 copy -ac 1 OUTPUT

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


Вот общая логика, которая применяется к опциям, которые принимают спецификаторы потока, например -b:v, -c:a -map 0:s:1 ..etc

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

(stream)    -c copy     -c:a:0 aac      -c:a libfdk_aac     -c:4 mp3
0:v:0       copy        copy            copy                copy
0:v:1       copy        copy            copy                copy
0:v:2       copy        copy            copy                copy
0:a:0       copy        aac             libfdk_aac          libfdk_aac
0:a:1       copy        copy            libfdk_aac          mp3
0:a:2       copy        copy            libfdk_aac          libfdk_aac

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