在被 getUserMedia 捕获后,使用 WebRTC 将 MediaStream 发送到主机服务器

IT技术 javascript jquery audio webrtc getusermedia
2021-03-22 15:00:01

我正在使用捕获音频数据getUserMedia(),我想将它发送到我的服务器,以便我可以将它保存为 MySQL 字段中的 Blob。

这就是我正在努力做的。我已经多次尝试使用 WebRTC 来做到这一点,但目前我什至不知道这是否正确,甚至是最好的方法。

有人可以帮助我吗?

这是我用来从麦克风捕获音频的代码:

navigator.getUserMedia({
    video:false,
    audio:true,
},function(mediaStream){

    // output mediaStream to speakers:
    var mediaStreamSource=audioContext.createMediaStreamSource(mediaStream);
    mediaStreamSource.connect(audioContext.destintion);

    // send mediaStream to server:

    // WebRTC code? not sure about this...
    var RTCconfig={};
    var conn=new RTCPeerConnection(RTCconfig);

    // ???

},function(error){
    console.log('getUserMedia() fail.');
    console.log(error);
});

如何将其发送mediaStream到服务器?

在谷歌搜索之后我一直在研究WebRTC但这似乎只是点对点通信- 实际上,现在我正在研究更多,我认为这是要走的路。这似乎是从客户端的浏览器到主机网络服务器的通信方式,但我尝试的任何东西都无法接近工作。

我一直在浏览W3C 文档(我发现它太抽象了),并且我一直在浏览这篇关于 HTML5 Rocks 的文章(它提出的问题多于答案)。显然我需要一种信令方法,谁能建议哪种信令方法最适合发送媒体流、XHR、XMPP、SIP、Socket.io 或其他东西?

服务器上需要什么来支持WebRTC的接收?我的 Web 服务器正在运行一个基本的 LAMP 堆栈。

另外,最好等到mediaStream录制完成后再将其发送到服务器,还是最好将mediaStream其作为录制内容发送我想知道我是否要以正确的方式做这件事。我已经用 javascript 和 HTML5 编写了文件上传器,但是上传其中一个mediaStreams似乎非常复杂,我不确定我是否正确地接近它。

对此的任何帮助将不胜感激。

3个回答

您无法在运行时上传实时流本身。这是因为它是一个实时流。

所以,这给你留下了一些选择。

  1. 使用许多录音机之一录制音频流RecordRTC工作得相当好。等待流完成,然后上传文件。
  2. 使用计时器发送较小的录制音频块,然后在服务器端再次合并它们。这是一个例子
  3. 将通过 websockets 发生的音频数据包发送到您的服务器,以便您可以在那里操作和合并它们。我的 RecordRTC 版本就是这样做的
  4. 与您的服务器建立实际的对等连接,以便它可以获取原始 rtp 流,您可以使用一些较低级别的代码记录流。这可以通过Janus-Gateway轻松完成

至于等待发送流还是分块发送,这完全取决于您录制的时间。如果时间更长,我会说分块发送录音或通过 websockets 主动发送音频数据包是更好的解决方案,因为从客户端上传和存储更大的音频文件对客户端来说可能很困难。

Firefox 实际上有自己的录制解决方案,但 chrome 不支持它,因此它可能不适用于您的情况。

顺便说一句,提到的信令方法用于会话构建/销毁,实际上与媒体本身无关。如果您可能使用上面显示的解决方案 4,您只会真正担心这一点。

MediaRecorder API 对您来说是一个很好的 API,但它的支持不如 Web Audio API,因此您可以使用 ScriptNode 或使用Recorder.js(或基于它来构建您自己的脚本节点)。

WebRTC 设计为点对点,但peer可以是浏览器和服务器。因此,绝对可以通过 WebRTC 将流推送到服务器,然后将流记录为文件。

流是:

Chrome ----WebRTC--->   Server  ---record---> FLV/MP4

有很多服务器,比如janusmediasoupSRS来接受 WebRTC 流。请注意,您可能需要将 WebRTC(H.264+Opus) 转换为 MP4(H.264+AAC),或者仅选择支持此功能的SRS