我目前正在使用 socket.io 用 HTML 和 JS 创建聊天应用程序。我能够在两台计算机之间轻松通信并发送书面消息。我的问题是我无法弄清楚如何将一台计算机中录制的实时语音发送到另一台计算机。我正在使用“navigator.getUserMedia”从麦克风录制音频,效果很好,但我无法通过 Socket.io 将其发送到另一台计算机。
我知道我可以开始录制,然后停止,最后发送结果,但这不是我需要的,我需要的是实时流。
这是服务器的代码:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var path = require('path');
var users = [];
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function(socket){
socket.on('add user', function(user_id){
users.push(user_id);
});
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
socket.on('voice sent', function(msg){
io.emit('voice received', msg);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
这是客户端 js:
$(function () {
var socket = io();
var user_id = Math.random();
socket.emit('add user', user_id);
$('form').submit(function(){
socket.emit('chat message', {"message": $('#m').val(), "user": user_id});
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
if(msg.user == user_id){
$('#messages').append($('<li class="mine">').text(msg.message));
}
else{
$('#messages').append($('<li>').text(msg.message));
}
});
socket.on('voice received', function(msg){
var audio = document.querySelector('audio');
audio.src = window.URL.createObjectURL(stream);
});
navigator.getUserMedia = navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia;
if (navigator.getUserMedia) {
console.log('getUserMedia supported.');
navigator.getUserMedia ({audio: true}, successCallback, errorCallback);
} else {
console.log('getUserMedia not supported on your browser!');
}
function successCallback(stream){
socket.emit('voice sent', stream);
}
function errorCallback(error) {
console.error('An error occurred: [CODE ' + error.code + ']');
}
});
我希望有人能帮助我。谢谢
最佳答案
我尝试这样做,过了一会儿我这样做了:
export default {
data() {
return {
audioCtx: new AudioContext(), // for get stream from mic and send via socket
audioC: new AudioContext(), // for receive data from socket and translate and play
}
},
created() {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia
if (navigator.getUserMedia) {
console.log('getUserMedia supported.')
navigator.getUserMedia(
{ audio: true },
stream => {
const source = this.audioCtx.createMediaStreamSource(stream)
const processor = this.audioCtx.createScriptProcessor(2048, 1, 1)
source.connect(processor)
processor.connect(this.audioCtx.destination)
processor.onaudioprocess = e => {
this.$store.state.mic.Emit('Voice', e.inputBuffer.getChannelData(0))
}
this.$store.state.mic.On('Voice', msg => {
const fbu = new Float32Array(Object.values(JSON.parse(msg)))
const audioBuffer = this.audioC.createBuffer(1, 2048, this.audioC.sampleRate)
audioBuffer.getChannelData(0).set(fbu)
const sourceNode = new AudioBufferSourceNode(this.audioC, { buffer: audioBuffer })
sourceNode.connect(this.audioC.destination)
sourceNode.start(0)
})
this.audioC.resume()
},
err => console.error(err)
)
}
}
}
服务器只将它得到的所有内容发送给除发送者客户端之外的所有内容 但还是有问题,由于AudioBufferSourceNode不同,调用质量不好,被分离和砍掉了。
关于javascript - 如何使用 Socket.io 实时传输音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44851678/