Могу ли я передавать звук микрофона от клиента к клиенту с помощью 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, я могу видеть буфер на сервере, я могу видеть буфер обратно в клиенте, но я ничего не слышу.
Я знаю сокет.Ио 1.x поддерживает двоичные данные, но я не могу найти ни одного примера создания голосового чата, я пытался также использовать BinaryJS, но результаты те же, кроме того, я знаю, что с WebRTC это простая задача, но я не хочу использовать WebRTC, может ли кто-нибудь указать мне хороший ресурс или сказать мне, что мне не хватает?
1 ответов
Я построил что-то подобное самостоятельно несколько недель назад. Проблемы, с которыми я столкнулся (вы в какой-то момент):
- много данных без уменьшения битрейта и выборки (через интернет)
- плохое качество звука без интерполяции или лучшего сжатия звука
- даже если он не показан вам, вы получите разные образцы с разных звуковых карт компьютеров (мой ПК = 48 кГц, мой ноутбук = 32 кГц), что означает, что вы должны написать resampler
- Websocket-это TCP: каждый аудиопакет достигнет своей цели, но если у вас плохие условия, вы получаете мультиблочные пакеты одновременно или в другом порядке. (U должен использовать прокси-сервер клиента UDP на каждом клиенте, если вы хотите UDP)
- в WebRTC они уменьшают качество звука, если обнаружено плохое подключение к интернету. Вы не можете этого сделать, потому что это низкоуровневый материал!
- вы должны реализовать это быстро, потому что JS заблокирует ваш фронтент, если нет > использовать webworkers
- аудио кодекс в переводе с JS очень медленно, и вы получите неожиданные результаты (см. вопрос audiocodex от меня: здесь) я пробовал Opus также, но пока нет хороших результатов.
Я не работаю над этим проектом на данный момент, но вы можете получить код по адресу:https://github.com/cracker0dks/nodeJsVoip
и рабочий пример: (ссылка удалена) для многопользовательского voip-аудио. (Не работать больше! Websocketserver вниз!) Если вы перейдете в настройки>аудио (на странице), вы можете выбрать более высокий бит и сэмплировать для лучшей аудиоквалльности.
EDIT: можете ли вы сказать мне, почему вы не хотите использовать WebRTC?