LINUX.ORG.RU

программное разбиение стерео и объединение с ещё одним аудиопотоком через ffmpeg

 


0

1

Есть две задачи с аудиопотоками.

Первая задача. Имеется два аудиопотока закодированных ac3, один стерео, другой моно (источники не так важны: файлы, rtsp, микрофоны). Требуется закодировать и записать эти потоки в файл таким образом, чтобы там было 3 аудиопотока: два моно-аудиопотока от стерео и один поток от моно.

Вторая задача. Имеется файл на диске с 3 моно-аудиопотоками (A,Б и В), закодированный ac3. Требуется проигрывать эти аудиопотоки таким образом чтобы получалось стерео (А + В, Б + В). Причём по командам извне какие-либо из потоков (А или Б или В) заменялись тишиной.

Хочу решить эти задачи написанием кода с использованием библиотек ffmpeg. Читать, декодировать, проигрывать, кодировать и записывать я, кажется, научился. Вот только не умею составлять фильтр-графы для решения проставленных задач. Подскажите пожалуйста, какие фильтр-графы подойдут для решения моих задач (за примеры вызовов из libavfilter отдельное спасибо).

Похоже я должен каким-то образом (с какими-то параметрами) соединить abuffer, abuffersink, amerge и channelsplit.

похоже, что тебе нужны channelsplit и channelmap (там же, чуть выше)

как это реализовать в коде я не знаю. можешь посмотреть исходник ffplay, он поддерживает фильтры.

anonymous ()
Ответ на: комментарий от anonymous

Проблема в том, что в исходниках ffplay.c нет примера использования именно channelsplit или channelmap. Там это происходит через парсинг команды извне (т.е. берётся команда из командной строки, парсится средствами ffmpeg, и из неё создаётся filter graph). А мне надо понять, как воспользоваться конкретными фильтрами (т.е. надо понять, как воссоздать работу команды в коде на С). Сеть полна примеров командных строк, но я не нашёл примеры исхдоников на С, где бы использовался channelsplit.

dmitryshm ()
Ответ на: комментарий от dmitryshm

как работать с фильтрами можно посмотреть примеры в документации ffmpeg, отличие для channelsplit только в том, что нужно создать несколько выходов с согласованными названиями

hizel ★★★★★ ()
Ответ на: комментарий от dmitryshm

В моём дитре (рач) есть файл /usr/share/ffmpeg/examples/filtering_audio.c, там всё по-человечески написано. То, что ты говоришь, что происходит парсинг команды, то, как я понял, именно так и работает libavfilter.

Как воспользоваться фильтрами - читай доку по фильтрам (man ffmpeg-filters), там ничего сложного нет. Поковыряй примеры.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.