Потоковое аудио через веб-сокет с низкой задержкой и без прерываний - PullRequest
1 голос
/ 03 мая 2019

Я работаю над проектом, который требует возможности потоковой передачи аудио с веб-страницы другим клиентам.Я уже использую websocket и хотел бы направить туда данные.

В моем текущем подходе используется Media Recorder, но существует проблема с выборкой, которая вызывает прерывания.Он регистрирует звук 1s и затем отправляет его на сервер, который передает его другим клиентам.Есть ли способ захватить непрерывный аудиопоток и преобразовать его в base64?

Может быть, если - это способ создать аудио base64 из MediaStream без задержки, это решит проблему.Как вы думаете?

Я хотел бы продолжать использовать веб-сокеты, я знаю, что есть webrtc.Вы когда-нибудь делали что-то подобное, это выполнимо?

Спасибо

                                                                --> Device 1
 MediaStream -> MediaRecorder -> base64 -> WebSocket -> Server --> Device ..
                                                                --> Device 18

Вот демонстрация текущего подхода ... вы можете попробовать это здесь: https://jsfiddle.net/8qhvrcbz/

var sendAudio = function(b64) {
  var message = 'var audio = document.createElement(\'audio\');';
  message += 'audio.src = "' + b64 + '";';
  message += 'audio.play().catch(console.error);';
  eval(message);
  console.log(b64);
}

 navigator.mediaDevices.getUserMedia({
      audio: true
 }).then(function(stream) {
        setInterval(function() {
            var chunks = [];
            var recorder = new MediaRecorder(stream);
            recorder.ondataavailable = function(e) {
                chunks.push(e.data);
            };
            recorder.onstop = function(e) {
                var audioBlob = new Blob(chunks);
                var reader = new FileReader();
                reader.readAsDataURL(audioBlob);
                reader.onloadend = function() {
                    var b64 = reader.result
                    b64 = b64.replace('application/octet-stream', 'audio/mpeg');
                    sendAudio(b64);
                }
            }
            recorder.start();
            setTimeout(function() {
                recorder.stop();
            }, 1050);
        }, 1000);
    });

1 Ответ

0 голосов
/ 04 мая 2019

Вебсокет не самый лучший. Я решил использовать WebRTC вместо websocket. Решение с веб-сокетом было получено во время записи 1050 мс вместо 1000, оно вызывает некоторое наложение, но все же лучше, чем отсутствие слуха.

...