Ffmpeg: как захватывать аудио и метаданные одновременно - PullRequest
0 голосов
/ 12 января 2020

Я занимаюсь разработкой мультиплатформенного приложения для потоковой передачи аудио в реальном времени, написанного на 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

Мне интересно, что мне не хватает и я на правильном пути в целом.

1 Ответ

0 голосов
/ 12 января 2020

Синтаксис

ffmpeg -y -f alsa -i hw:CARD=PCH,DEV=0 -filter_complex "asplit=2[out][stats];[stats]ebur128=metadata=1,ametadata=print:key=lavfi.r128.M:file=unix\:/tmp/test.sock:direct=1,anullsink" -map '[out]' -ac 2 -b:a 192k -acodec libmp3lame -f mp3 -reservoir 0 -hide_banner pipe:1

Примечания:

  • значение должно быть предоставлено для параметров фильтра, поэтому оно direct=1.

  • параметры -probesize -rtbufsize -fflags +nobuffer все параметры только для ввода и не влияют на выходные файлы.

  • I Полагаю, что фильтры ebur сканируют и распечатывают данные по всем каналам по умолчанию. Если вы хотите sh использовать только один канал, добавьте фильтр панорамирования непосредственно перед ebur128.

  • ваш unix прото-URL должен быть в порядке, но проверьте с помощью обычного файла или - чтобы исключить эту переменную.

...