Потоковое аудио из avconv через NodeJs WebSockets в Chrome с AudioContext

у нас возникли проблемы с воспроизведением потокового аудио в браузере (используя Chrome).

У нас есть процесс, который передает аудио (например, интернет-радио) по udp на какой-то порт. Это avconv (avconv -y -i SOMEURL -f alaw udp://localhost:PORT). У нас есть сервер NodeJs, который получает этот аудиопоток и перенаправляет его нескольким клиентам, подключенным через веб-сокеты. Аудиопоток, который получает NodeJs, помещается в буфер, который представляет собой массив с числами от 0 до 255. Данные отправляются в браузер без каких-либо проблем, а затем мы используем AudioContext для воспроизведения аудиопотока в браузере (наш код основан на AudioStreamer — https://github.com/agektmr/AudioStreamer).

Поначалу все, что мы получили на данный момент, было статичным. Изучив код AudioStreamer, мы поняли, что данные аудиопотока должны находиться в диапазоне от -1 до 1. Зная это, мы попытались изменить каждое значение в буфере с помощью этой формулы x = (x/128) - 1. Мы сделали это просто для того, чтобы посмотреть, что произойдет, и на удивление помехи стали немного менее ужасными — вы могли даже разобрать мелодии песен или слов, если звук был речью. Но это все еще очень-очень плохо, много статики, так что это, очевидно, не решение, но оно показывает, что мы действительно получаем аудиопоток через веб-сокеты, а не просто какие-то случайные данные.

Так вот вопрос - что мы делаем не так? Есть ли кодек/формат, который мы должны использовать? Конечно, весь код (avconv, NodeJs и клиентская часть) может быть изменен по желанию. Мы также могли бы использовать другой браузер, если это необходимо, хотя я предполагаю, что здесь проблема не в этом. Единственное, что мы знаем, это то, что нам действительно нужно это для работы через веб-сокеты.

ОС, на которой работают avconv и NodeJs, — Ubuntu (различные версии 10-13).

Любые идеи? Вся помощь будет оценена.

Спасибо! Томас


person Community    schedule 27.11.2013    source источник


Ответы (1)


Преобразование целочисленных выборок в выборки с плавающей запятой некорректно. Вы должны учитывать:

  • Количество каналов
  • Количество битов на выборку
  • Подписано/не подписано
  • Endianess

Предположим, у вас есть типичный WAV-файл с 16-битным стереозвуком, подписанным и прямым порядком байтов. Вы на правильном пути со своей формулой, но попробуйте следующее:

x = (x/32768) - 1
person Brad    schedule 27.11.2013