ffmpeg: Присоединить различные кодеки к различным выходным потокам filtergraph — как?

ffmpeg: Присоединить различные кодеки к различным выходным потокам filtergraph — как?

У меня есть 2 аудиовыхода ffmpeg, отображенных из filtergraph, следующим образом:

-filter_complex "[0:1]..bla-bla-bla..[ac3];[0:2]..bla-bla-bla..[dts]" -map "[dts]" -map "[ac3]"

Далее мне нужно закодировать 2 аудиопотока. Должен же быть способ указать, какой кодек использовать для каждого потока, а? Что-то вроде этого:

-codec:[dts] dts -codec:[ac3] ac3

Нет. Это вызывает "Недопустимый спецификатор потока". И все примеры, которые я нашел, показывают только stream_specifier, который ссылается на входной поток, а не на поток filtergraph.

Что я пробовал:

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:dts dts -codec:ac3 ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:[dts] dts -codec:[ac3] ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:a:dts dts -codec:a:ac3 ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:a:[dts] dts -codec:a:[ac3] ac3

-filter_complex "[0:1]..[ac3];[0:2]..[dts]" -map "[dts]" -map "[ac3]" -codec:[a:dts] dts -codec:[a:ac3] ac3

Я также попробовал все варианты с кавычками (например, -codec:"[dts]")

Все они вызывают "Неверный спецификатор потока". Есть какие-нибудь идеи?

решение1

Вам необходимо использовать индекс потока отображенного потока среди выходных потоков.
Индекс определяется порядком карт.

В — это второе отображение -map "[dts]" -map "[ac3]" -codec:dts dts -codec:ac3 ac3,
[ac3]поэтому его кодек назначается с помощью -c:1 ac3или -c:a:1 ac3.

Если бы карты были -map 0:v:1 -map "[dts]" -map 0:s:0 -map "[ac3]",
то это было бы -c:3 ac3или-c:a:1 ac3

решение2

Достаточно надежный способ — установить кодеки по типу потока: -c:a CODECэто установит кодек для всех аудиопотоков.

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

-c:a:0 CODECустановит кодек дляпервый аудиотранслировать

-c:a:1 CODECустановит кодек длявторой аудиотранслировать

-c:a:2 CODECустановит кодек длятретий аудиопоток и тд.

-c:v:0будет работать аналогично для видеопотоков.

Связанный контент