【发布时间】:2018-05-31 23:13:33
【问题描述】:
我想创建一个从一台设备到节点服务器的实时音频流,然后该节点服务器可以将该实时源广播到多个前端。
我已经对此进行了广泛的搜索,并且真的碰壁了,所以希望有人可以提供帮助。
我能够从window.navigator.getUserMedia API 获取我的音频输入。
getAudioInput(){
const constraints = {
video: false,
audio: {deviceId: this.state.deviceId ? {exact: this.state.deviceId} : undefined},
};
window.navigator.getUserMedia(
constraints,
this.initializeRecorder,
this.handleError
);
}
然后将流传递给initializeRecorder 函数,该函数利用AudioContext API 创建一个createMediaStreamSource`
initializeRecorder = (stream) => {
const audioContext = window.AudioContext;
const context = new audioContext();
const audioInput = context.createMediaStreamSource(stream);
const bufferSize = 2048;
// create a javascript node
const recorder = context.createScriptProcessor(bufferSize, 1, 1);
// specify the processing function
recorder.onaudioprocess = this.recorderProcess;
// connect stream to our recorder
audioInput.connect(recorder);
// connect our recorder to the previous destination
recorder.connect(context.destination);
}
在我的recorderProcess 函数中,我现在有一个可以流式传输的AudioProcessingEvent 对象。
目前,我通过套接字连接将音频事件作为流发送,如下所示:
recorderProcess = (e) => {
const left = e.inputBuffer.getChannelData(0);
this.socket.emit('stream', this.convertFloat32ToInt16(left))
}
这是最好的还是唯一的方法?有没有更好的方法通过使用fs.createReadStream 然后通过 Axios 发布端点?据我所知,这仅适用于文件而不是连续直播?
服务器
我有一个在 express 上运行的非常简单的套接字服务器。目前我监听流事件,然后发出相同的输入:
io.on('connection', (client) => {
client.on('stream', (stream) => {
client.emit('stream', stream)
});
});
不确定它的可扩展性如何,但如果您有更好的建议,我很乐意接受。
客户
现在这是我真正陷入困境的地方:
在我的客户端上,我正在监听stream 事件,并希望在我的浏览器中将流作为音频输出收听。我有一个接收事件的函数,但我不知道如何使用返回的 arrayBuffer 对象。
retrieveAudioStream = () => {
this.socket.on('stream', (buffer) => {
// ... how can I listen to the buffer as audio
})
}
- 流式传输音频的方式是我可以上传到节点服务器的最佳/唯一方式吗?
- 如何侦听客户端返回的 arrayBuffer 对象?
【问题讨论】:
标签: javascript node.js web-audio-api