Я занимаюсь разработкой мультиплатформенного приложения для потоковой передачи аудио в реальном времени, написанного на JS. Цель состоит в том, чтобы получить метры / громкости на канал при захвате звука со звуковой карты. Это должно быть сделано в одной команде, так как я получаю ошибку device or resource busy
при запуске нескольких команд с одним и тем же вводом.
Захват звука работает нормально с помощью этой команды:
ffmpeg -y -f alsa -i hw:CARD=PCH,DEV=0 -ac 2 -b:a 192k -acodec libmp3lame -f mp3 -probesize 64 -rtbufsize 64 -reservoir 0 -fflags +nobuffer -hide_banner pipe:1
Получение громкости для правого канала работает с этой командой (левый канал является аналоговым, предоставляя 0.0.1 для -map_channel):
ffmpeg -f alsa -i hw:CARD=PCH,DEV=0 -map_channel 0.0.0 -af ebur128=metadata=1,ametadata=print:key=lavfi.r128.M -f null pipe:1
Вопрос заключается в том, как их объединить, обеспечивая способ правильно распределить выходные данные.
В качестве первого шага мой текущий подход заключается в использовании file
аргумент фильтра метаданных ( документация здесь ) и запись в сокет, открытый со следующим JS кодом
var net = require('net');
var server = net.createServer(function (stream) {
stream.on('data', function (c) { console.log('data:', c.toString()); });
});
server.listen('/tmp/test.sock');
как
ffmpeg -f alsa -i hw:CARD=PCH,DEV=0 -map_channel 0.0.1 -af ebur128=metadata=1,ametadata=mode=print:key=lavfi.r128.M:file=unix\:/tmp/test.sock:direct -f null -
, но сокет не получает данных и в ffmpeg нет ошибок.
Перенаправление вывода потоковой команды на сокет Howerver работает:
ffmpeg -y -f alsa -i hw:CARD=PCH,DEV=0 -ac 2 -b:a 192k -acodec libmp3lame -f mp3 -probesize 64 -rtbufsize 64 -reservoir 0 -fflags +nobuffer -hide_banner unix:/tmp/test.sock
Мне интересно, что мне не хватает и я на правильном пути в целом.