Могу ли я передавать аудио с микрофона с клиента на клиент, используя nodejs?
Я пытаюсь создать голосовой чат в реальном времени. как только клиент удерживает кнопку и говорит, я хочу, чтобы звук передавался через сокет на серверную часть nodejs, затем я хочу передать эти данные другому клиенту.
вот код клиента отправителя:
socket.on('connect', function() {
var session = {
audio: true,
video: false
};
navigator.getUserMedia(session, function(stream){
var audioInput = context.createMediaStreamSource(stream);
var bufferSize = 2048;
recorder = context.createScriptProcessor(bufferSize, 1, 1);
recorder.onaudioprocess = onAudio;
audioInput.connect(recorder);
recorder.connect(context.destination);
},function(e){
});
function onAudio(e) {
if(!broadcast) return;
var mic = e.inputBuffer.getChannelData(0);
var converted = convertFloat32ToInt16(mic);
socket.emit('broadcast', converted);
}
});
Затем сервер получает этот буфер и передает его другому клиенту (в этом примере, тому же клиенту)
Код сервера
socket.on('broadcast', function(buffer) {
socket.emit('broadcast', new Int16Array(buffer));
});
И затем, чтобы воспроизвести звук на другой стороне (приемнике), код клиента выглядит так:
socket.on('broadcast', function(raw) {
var buffer = convertInt16ToFloat32(raw);
var src = context.createBufferSource();
var audioBuffer = context.createBuffer(1, buffer.byteLength, context.sampleRate);
audioBuffer.getChannelData(0).set(buffer);
src.buffer = audioBuffer;
src.connect(context.destination);
src.start(0);
});
Мой ожидаемый результат заключается в том, что звук от клиента A будет слышен на клиенте B, я вижу буфер на сервере, я могу видеть буфер обратно в клиенте, но ничего не слышу.
Я знаю, что socket.io 1.x поддерживает двоичные данные, но я не могу найти ни одного примера создания голосового чата, я пробовал также использовать BinaryJS, но результаты такие же, также я знаю, что с WebRTC это простая задача, но Я не хочу использовать WebRTC, кто-нибудь может указать мне хороший ресурс или сказать, что мне не хватает?
1 ответ
Я строю что-то подобное самостоятельно несколько недель назад. Проблемы, с которыми я столкнулся (вы будете в какой-то момент):
- Много данных без снижения битрейта и частоты дискретизации (через Интернет)
- плохое качество звука без интерполяции или лучшего сжатия звука
- Даже если он вам не показан, вы получите разные частоты дискретизации от звуковых карт разных компьютеров (мой компьютер = 48 кГц, мой ноутбук = 32 кГц), что означает, что вам нужно написать ресэмплер
- В WebRTC они уменьшают качество звука при обнаружении плохого интернет-соединения. Вы не можете сделать это, потому что это вещи низкого уровня!
- Вы должны реализовать это быстро, потому что JS заблокирует ваш интерфейс, если не использует веб-работников
- Аудиокодек, переведенный на JS, очень медленный, и вы получите неожиданные результаты (см. Один вопрос по аудиокодексу от меня: здесь). Я тоже пробовал Opus, но пока хороших результатов нет.
В данный момент я не работаю над этим проектом, но вы можете получить код по адресу: https://github.com/cracker0dks/nodeJsVoip
и рабочий пример: (ссылка удалена) для многопользовательского аудио VoIP. (Больше не работает! Websocketserver недоступен!) Если вы зайдете в настройки> аудио (на странице), вы можете выбрать более высокий бит и частоту дискретизации для лучшего качества звука.
РЕДАКТИРОВАТЬ: Можете ли вы сказать мне, почему вы не хотите использовать WebRTC?