HTML5 и API веб-аудио: потоковая передача данных с микрофона из браузера на сервер. Идеальный транспорт и сжатие данных

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

Я попробовал два способа, оба из которых дали безуспешные результаты:

WebRTC

  • Потоковое аудио напрямую между браузерами работает нормально, но качество звука, похоже, не настраивается, что я видел. (Я видел, что он использует аудиокодек Opus, но, похоже, не предоставляет никаких элементов управления).
  • Кто-нибудь знает, как повысить качество звука в потоках WebRTC?

Веб-сокеты

  • Проблема заключается в передаче от браузера к серверу. Аудиоданные PCM, которые я могу получить с помощью описанного ниже метода, оказались слишком большими для многократной потоковой передачи на сервер через веб-сокеты. Поток отлично работает в среде с высокоскоростным Интернетом, но на более медленном Wi-Fi его нельзя использовать.

    var context = new webkitAudioContext()
    navigator.webkitGetUserMedia({audio:true}, gotStream)
    
    function gotStream (stream)
    {
        var source = context.createMediaStreamSource(stream)
        var proc = context.createScriptProcessor(2048, 2, 2)
    
        source.connect(proc)
        proc.connect(context.destination)
        proc.onaudioprocess = function(event)
        {
            var audio_data = event.inputBuffer.getChannelData(0)|| new Float32Array(2048)
            console.log(audio_data)
            // send audio_data to server
        }
    }
    

Итак, главный вопрос: есть ли способ сжать данные PCM, чтобы упростить потоковую передачу на сервер? Или, может быть, есть более простой способ сделать это?


person IyadAssaf    schedule 23.12.2013    source источник
comment
lyadAssaf: у тебя есть пример кода потокового аудио через веб-сокет? Если да, можете ли вы, пожалуйста, предоставить sample.thnx.   -  person Pradeep    schedule 02.04.2014
comment
Теперь вы можете ответить на этот вопрос: stackoverflow.com/questions/56308420/ Мне действительно нужна помощь с этим   -  person George Pligoropoulos    schedule 26.05.2019


Ответы (3)


Конечно, есть много способов сжать данные PCM, но на самом деле лучше всего заставить WebRTC работать должным образом. WebRTC предназначен для этого - адаптивной потоковой передачи мультимедиа - хотя вы не определяете, что вы подразумеваете под «несколькими» слушателями (существует огромная разница между 3 слушателями и 300 000 одновременных слушателей).

person cwilso    schedule 23.12.2013
comment
Я надеюсь, что у меня будет значительное количество (возможно, до 300 000) слушателей, поэтому я как бы склонялся к веб-сокетам, но если вы думаете, что WebRTC возможен, есть ли способ контролировать качество звука? Я понимаю, что эта технология в значительной степени предназначена для передачи голоса, но из-за NetEQ и компенсатора эха / шума в классе VoiceEngine (ссылка), я полагаю, нет никакого способа изменить это? Я предполагаю, что в более поздней версии проекта WebRTC может быть высокоуровневый доступ к таким классам. - person IyadAssaf; 24.12.2013
comment
Ваша проблема будет в масштабировании. Большинство систем не собираются напрямую поддерживать 3000 одновременных подключений к сокетам, перекачивая аудиопоток ... Это просто большой объем данных. - person cwilso; 24.12.2013

Есть несколько возможных способов передискретизации и / или сжатия ваших данных, но ни один из них не является родным. Я пересчитал данные в 8Khz Mono (ваш пробег может отличаться) с помощью библиотеки xaudio.js из среды speex.js . Вы также можете сжать поток с помощью speex, хотя обычно он используется только для звука. В вашем случае я бы, вероятно, отправил поток на сервер, сжал его там и транслировал вашей аудитории. Я действительно не верю, что простой браузер достаточно хорош для обслуживания данных огромной аудитории.

person Michaela.Merz    schedule 26.12.2013

WebRTC, кажется, по умолчанию использует один моноканал около 42 кбит / с, кажется, он в первую очередь предназначен для передачи голоса.

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

navigator.mediaDevices.getUserMedia ({audio: {autoGainControl: false, channelCount: 2, echoCancellation: false, latency: 0, noiseSuppression: false, sampleRate: 48000, sampleSize: 16, volume: 1.0}});

Затем вы также должны установить параметры stereo и maxaveragebitrate в SDP:

let answer = await peer.conn.createAnswer(offerOptions);
answer.sdp = answer.sdp.replace('useinbandfec=1', 'useinbandfec=1; stereo=1; maxaveragebitrate=510000');
await peer.conn.setLocalDescription(answer);

Это должно вывести строку, которая выглядит так:

a=fmtp:111 minptime=10;useinbandfec=1; stereo=1; maxaveragebitrate=510000

Это может увеличить битрейт до 520 кбит / с для стерео, что составляет 260 кбит / с на канал. Фактический битрейт зависит от скорости вашей сети и мощности вашего сигнала.

person Kim T    schedule 17.11.2019