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

Sending a MediaStream to host Server with WebRTC after it is captured by getUserMedia

本文关键字:主机 服务器 主机服务 WebRTC 捕获 getUserMedia MediaStream 使用      更新时间:2023-09-26

我正在使用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,但这似乎只是为了对等通信——实际上,现在我正在更多地研究这一点,我认为这是一条路。这似乎是从客户端浏览器到主机Web服务器的通信方式,但我所尝试的一切都无法奏效。

我一直在阅读W3C文档(我觉得它太抽象了),我也一直在阅读这篇关于HTML5Rocks的文章(它提出的问题比答案多)。显然,我需要一种信令方法,有人能告诉我哪种信令方法最适合发送mediaStreams、XHR、XMPP、SIP、Socket.io或其他什么吗?

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

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

如有任何帮助,我们将不胜感激。

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

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

  1. 使用多种录音机之一录制音频流RecordRTC运行良好。等待流完成,然后上传文件
  2. 用定时器发送较小的chunck录制的音频,并在服务器端再次合并它们。这是一个例子
  3. 当音频数据包通过网络套接字出现时,请将其发送到服务器,以便在那里进行操作和合并。我的RecordRTC版本可以做到这一点
  4. 与服务器建立一个实际的对等连接,这样它就可以获取原始的rtp流,并且您可以使用一些较低级别的代码来记录流。这可以通过Janus网关轻松完成

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

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

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

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

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

流量为:

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

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

是的,可以将MediaStream发送到服务器,但唯一可以实现的方法是通过WebSocket,使客户端浏览器能够实时连接将数据发送到服务器。所以我建议您使用websocket