我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端。
我已经为此进行了广泛的搜索,并且真的碰壁了,所以希望有人能帮忙。
我能够得到我的音频输入从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有更好的方法吗。创建ReadStream
,然后通过Axios发布endpoint?据我所知,这只适用于文件,而不是连续的实时流?
服务器
我有一个非常简单的套接字服务器运行在快递上面。目前,我监听流事件,然后发出相同的输入回:
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的唯一方法。从观点上看,这被认为是可行的,因为您希望事情“实时”,而不是每5秒发送一次http post请求。
你可以试试这个BaseAudioContext。解码音频数据以收听数据流,示例非常简单。
从你提供的代码片段中,我假设你想从头开始构建一些东西来学习事物是如何工作的。
在这种情况下,您可以尝试使用MediaStream录制API和websocket服务器,该服务器将数据块发送给X客户端,以便它们能够重现音频,等等。
将时间投入到WebRTC API中,学习如何从客户机流式传输到另一个客户机是有意义的。
还可以查看下面的链接以获取一些有用的信息。
1367[AWT-EventQueue-0]信息uk.co.caprica.vlcj.binding.libvlcfactory-libvlc:c:\program files\videolan\vlc\libvlc.dll 2061[AWT-EventQueue-0]错误uk.co.caprica.vlcj.player.DefaultMediaPlayer-未能为“SimpleMedia[mr
我有个问题。当我有其他实体时,我不知道如何创建API。我与邮递员工作,当我做一个请求,以看到所有项目从数据库,我想收到实体也。 例如,这是我的实体:
问题内容: 使用Jhipster和Postgresql,我创建了一个实体“ Customer”。当我使用Angular UI将数据添加到该实体或将其添加到API时,可以使用UI上的搜索表单来搜索此数据。 但是,当我直接在数据库中插入数据时,即使在应用程序重新启动后也无法搜索数据。搜索仍然(仅)对通过UI添加的数据有效。 我是Elasticsearch的新手,不知道在后端插入数据并将其提供给Elas
我正在使用Google的YouTube API Explorer(备用)来查找属于其他人的任意流媒体广播的信息。 无论我在字段中输入了什么,我都会返回 这似乎很荒谬,考虑到视频显然是流媒体。 我突然想到,我可能误解了字段的说明,所以我尝试了几种不同的可能性。这些包括。。。 频道ID() 用户ID() 视频ID() ...每个都无济于事。 我如何询问一个频道有关其直播流视频的信息?这个问题在过去可以
问题内容: 我有一个标题字符串和一个链接字符串。我不确定如何将两者放在一起以使用Javascript在页面上创建链接。任何帮助表示赞赏。 编辑1:向该问题添加更多详细信息。我试图找出原因的原因是因为我有一个RSS提要,并且有标题和URL的列表。我想将标题链接到URL以使页面有用。 EDIT2:我使用的是jQuery,但它是全新的,并且不知道它可以在这种情况下提供帮助。 问题答案:
问题内容: 查找音云轨道的持续时间。 我希望创建一个秒表功能,当您单击ID 时,该功能将开始计时毫秒,以便当该功能被“单击”一定时间后,if函数将执行某些操作。就我而言,替换图像。并且该函数将在再次单击时将其自身重置。 就像= - 我该如何设置 = ?这是毫秒吗? 问题答案: 您会看到演示代码只是一个开始/停止/重置毫秒计数器。如果您想按时进行奇特的格式化,那完全取决于您。这应该足以让您入门。 这