使用WebRTC将通过getUserMedia捕获的MediaStream发送到主机服务器

60

我正在使用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 文档(我发现太抽象了),并且我已经阅读了HTML5 Rocks 上的文章(带来的问题比回答还多)。显然,我需要一种信令方法,有人可以建议哪种信令方法最适合发送媒体流,XHR、XMPP、SIP、Socket.io 还是其他什么?

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

此外,等到 mediaStream 录制完成后再将其发送到服务器是否最好,还是在录制过程中就发送 mediaStream?我想知道我是否正在正确处理这个。我已经使用 JavaScript 和 HTML5 编写了文件上传器,但是上传其中一个 mediaStreams 看起来比较复杂,我不确定是否正确的方法。

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


你只想存储录制的文件吗?如果是这样,您可以将Blob上传到服务器上进行保存。或者您希望服务器能够从客户端获得实时流并让服务器处理录制吗? - Benjamin Trent
我只想将录制的文件存储在服务器上。 - Jimmery
4个回答

69

在直播过程中无法上传直播流本身,因为这是实时直播。

因此,您只有几个选项:

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

至于等待发送流还是分段发送,这完全取决于您录制的时间长短。如果录制时间较长,则我建议按块发送录制的音频或者主动通过websockets发送音频数据包,因为从客户端上传和存储较大的音频文件可能会对客户端造成负担。

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

另外,提到的信令方法是用于会话建立/销毁,实际上与媒体本身无关。只有在使用上面所示的第4种方法时才需要考虑它。


5
一个好的API可以选择MediaRecorder API,但这个API的支持度较低。如果需要更高的兼容性,可以使用ScriptNode或者使用Recorder.js(或基于它构建自己的ScriptNode)实现相同的功能。请注意保留原有的html标签。

1

WebRTC被设计为点对点通信,但是“peer”可以是浏览器和服务器。因此,通过WebRTC将流推送到服务器,然后将流记录为文件是完全可能的。

流程如下:

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

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


(Chrome ----WebRTC---> Server ---record---> FLV/MP4)这个步骤中,Chrome浏览器通过WebRTC协议将音视频数据传输到服务器,服务器再将数据录制成FLV或MP4格式的文件。您需要详细说明这些步骤的示例吗? - persec10000
首先,请将WebRTC转换为RTMP(请参阅https://ossrs.io/lts/en-us/docs/v5/doc/webrtc#rtc-to-rtmp)。然后,启用RTMP DVR(请参阅https://ossrs.io/lts/en-us/docs/v5/doc/dvr)。实际上只需要一个配置文件。 - Winlin

0

是的,将MediaStream发送到您的服务器是可能的,但唯一的方法是通过WebSocket进行,这使得客户端浏览器能够在实时连接中向您的服务器发送数据。因此,我建议您使用WebSocket。


WebSocket绝对不是唯一的方法,但它是一种方法。使用WebSocket而不是WebRTC或其他替代方案是否有理由? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接