如何使用Javascript创建实时媒体流
我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端 我已经广泛地搜索过了,真的遇到了麻烦,希望有人能帮上忙 我可以从如何使用Javascript创建实时媒体流,javascript,node.js,web-audio-api,Javascript,Node.js,Web Audio Api,我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端 我已经广泛地搜索过了,真的遇到了麻烦,希望有人能帮上忙 我可以从window.navigator.getUserMediaAPI获取音频输入 getAudioInput(){ const constraints = { video: false, audio: {deviceId: this.state.deviceId ? {exact: this.state.deviceId} :
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)
});
});
不确定这是如何扩展,但如果你有更好的建议,我非常愿意接受
客户端
这就是我真正被困的地方:
在我的客户端上,我正在侦听流
事件,并希望在浏览器中以音频输出的形式侦听流。我有一个接收事件的函数,但我无法确定如何使用返回的arrayBuffer对象
retrieveAudioStream = () => {
this.socket.on('stream', (buffer) => {
// ... how can I listen to the buffer as audio
})
}
根据您提供的代码片段,我假设您希望从头开始构建一些东西,以了解如何工作 在这种情况下,您可以尝试使用websocket服务器,该服务器将块发送到X客户机,以便他们可以复制音频,等等 这将是有意义的投资时间,学习如何流从客户端到另一个客户端 还可以查看下面的链接以获取一些有用的信息
BaseAudioContext。decodeAudioData
是我需要的,以便能够监听传入的音频流。我已经尝试过好几次让它与我的arrayBuffer块的传入流一起工作,但是不断地在要求使用音频缓冲区时出错。您知道如何获取BaseAudioContext.decodeAudioData
以使用我的设置,还是需要更改上传音频流的方式?MDN给出的示例非常简单,介绍了如何收听,录制需要媒体录制器API,但由于处于实验状态,您可以使用库,如MediaStreamRecorder
,您可以将音频和流缓冲区捕获到服务器,然后服务器只向客户端发送缓冲区,而无需其他操作。