Web Audio Api Потоковая передача в реальном времени PCM ADPCM
У меня есть сервер, который передает данные клиента PCM или ADPCM.
Сначала я решил использовать PCM, потому что не хотел иметь дело с кодированием и декодированием.
Я заставил PCM работать, однако между каждым фрагментом аудио я слышал глюки (вроде как отсечение)
Поэтому я подумал, что, возможно, причина в задержке / высоком качестве звука и тому подобном.
Поэтому я решил использовать ADPCM, чтобы уменьшить объем данных. Я написал ADPCM для PCM декодера в JavaScript. Это было хлопотно. Я надеялся, что, поскольку количество данных уменьшилось, возможно, это остановило бы глюки (данные догонят то, что воспроизводится)
Но я был неправ. Я все еще получаю глюки.
Можно ли это сделать даже с помощью TCP? Или это безнадежное дело. У меня нет UDP через веб-сокеты.
Нужно ли реализовывать алгоритм буферизации? Я не хочу делать это, потому что это аудио в реальном времени, и я просто хочу обработать его так быстро, как могу.
Ребята, вы знаете хорошую ссылку для чтения аудио в реальном времени через Интернет?
Я могу привести пример кода, но это вопрос высокого уровня.
PS: я пытался использовать вкладки, но у нас возникает проблема с буферизацией, и мы не можем ее контролировать. Я также не получаю никакого контроля потока с сервера. Это не говорит о том, что аудио стартер или аудио остановили нашу паузу. Это протокол push, и все, что я получаю, это данные ADPCM и PCM
1 ответ
Да, конечно, вы можете использовать TCP. UDP часто используется в приложениях телефонии, поскольку более низкие издержки ускоряют работу, и для этого приложения не имеет значения, отбрасываются ли пакеты или поступают в неправильном порядке. Но поскольку UDP не вариант, вы можете использовать TCP.
Как вы и подозревали, мне кажется, что ваша проблема - переполнение буфера. Либо ваше подключение к серверу недостаточно быстрое (или, по крайней мере, достаточно быстрое), либо вы не предоставляете данные из кодировщика с достаточно высокой скоростью. Это может произойти, если вы записываете данные в реальном времени и пытаетесь воспроизвести их в реальном времени.
Решение состоит в том, чтобы буферизовать данные на стороне сервера перед отправкой их клиенту. Имейте настолько большой буфер, насколько позволяют ваши требования к задержке. Для целей интернет-радио я обычно выбираю 30-секундный буфер, поскольку задержка не имеет значения. Для ваших целей вам, вероятно, понадобится буфер размером не менее 64 КБ. Это максимальный размер, допустимый в пакете TCP. Этот пакет будет фрагментирован по пути, но это нормально.
Вы также можете посмотреть, как ваш сервер отправляет данные. Поэкспериментируйте с отключением алгоритма Nagle, чтобы ваш сервер не ждал ACK, прежде чем отправлять больше данных.