当前位置: 首页 > 知识库问答 >
问题:

如何使用Javascript创建实时媒体流

笪波鸿
2023-03-14

我想创建一个从一个设备到一个节点服务器的实时音频流,然后可以将该实时提要广播到几个前端。

我已经为此进行了广泛的搜索,并且真的碰壁了,所以希望有人能帮忙。

我能够得到我的音频输入从window.navigator.getUserMediaAPI。

getAudioInput(){
  const constraints = { 
    video: false, 
    audio: {deviceId: this.state.deviceId ? {exact: this.state.deviceId} : undefined},
  };

  window.navigator.getUserMedia(
    constraints, 
    this.initializeRecorder, 
    this.handleError
  );
}

然后将流传递给initializeRecorder函数,该函数使用AudioContextAPI创建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
  })
}
  1. 我流音频的方式是我上传到节点服务器的最佳/唯一方式吗?
  2. 如何监听客户端返回的arrayBuffer对象?

共有1个答案

王叶五
2023-03-14
  1. 我上传音频的方式是上传到节点服务器的最佳/唯一方式吗

这并不是最好的,但我看到了更糟的情况,这不是使用WebSocket的唯一方法。从观点上看,这被认为是可行的,因为您希望事情“实时”,而不是每5秒发送一次http post请求

你可以试试这个BaseAudioContext。解码音频数据以收听数据流,示例非常简单。

从你提供的代码片段中,我假设你想从头开始构建一些东西来学习事物是如何工作的。

在这种情况下,您可以尝试使用MediaStream录制API和websocket服务器,该服务器将数据块发送给X客户端,以便它们能够重现音频,等等。

将时间投入到WebRTC API中,学习如何从客户机流式传输到另一个客户机是有意义的。

还可以查看下面的链接以获取一些有用的信息。

  • (stackoverflow)从NodeJS服务器向客户端获取实时流媒体音频
  • (github)视频会议webrtc
  • 抽搐。电视技术堆栈文章
  • rtc。木卫一
 类似资料:
  • 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函数将执行某些操作。就我而言,替换图像。并且该函数将在再次单击时将其自身重置。 就像= - 我该如何设置 = ?这是毫秒吗? 问题答案: 您会看到演示代码只是一个开始/停止/重置毫秒计数器。如果您想按时进行奇特的格式化,那完全取决于您。这应该足以让您入门。 这