2014-08-27 64 views
31

我使用getUserMedia()捕获音频数据,并且我想将它发送到我的服务器,以便我可以将它作为Blob保存在MySQL字段中。通过getUserMedia捕获MediaStream到WebRTC主机服务器

这就是我想要做的。我已经做了几次尝试,使用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到服务器?

周围的Googling之后我一直都盼望到WebRTC但这似乎只是点对点通信 - 实际上,现在我期待这个多了,我觉得这是要走的路。它似乎是从客户端浏览器到主机网络服务器进行通信的方式,但我尝试的任何东西甚至都无法正常工作。

我一直在通过the W3C documentation(我发现方式太抽象了),我一直通过this article on HTML5 Rocks(这是提出更多的问题比答案)。显然我需要一种信令方法,任何人都可以建议哪种信令方法最适合发送mediaStreams,XHR,XMPP,SIP,Socket.io或其他东西?

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

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

任何帮助,将不胜感激。

+0

你只想存储录制的文件吗?如果是这样,您可以将blob上传到服务器并保存它。或者你想让你的服务器能够从客户端获得实时流,并让服务器处理录制? – 2014-09-02 19:06:00

+0

我只想将记录的文件存储在服务器上。 – Jimmery 2014-09-03 11:06:36

回答

29

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

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

  1. 使用众多录像机中的一个记录音频流RecordRTC工作得很好。等到流完成后再上传文件。
  2. 用定时器发送更小的录制音频块,并将它们再次合并到服务器端。 This is an example of this
  3. 将音频数据包通过websockets发送到您的服务器,以便您可以在那里操作和合并它们。 My version of RecordRTC does this
  4. 与您的服务器建立实际的对等连接,以便获取原始rtp流,并且可以使用一些较低级别的代码记录流。这可以通过Janus-Gateway轻松完成。

至于等待发送流与发送块,这一切都取决于你录制多长时间。如果时间较长,我会说发送数据块或者通过websockets主动发送音频数据包是一个更好的解决方案,因为从客户端上传和存储较大的音频文件对于客户端来说可能是艰巨的。

Firefox实际上有一个它的own solution for recording,但它在chrome中不受支持,因此它可能不适用于您的情况。

另外,所提及的信号传输方法是用于会话建立/销毁,而且与媒体本身无关。如果您正在使用上面显示的可能的解决方案编号4,那么您只会担心这一点。

3

对你而言,一个好的API应该是MediaRecorder API,但它比Web Audio API支持的更少,所以你可以使用ScriptNode或使用Recorder.js(或基于它来构建你自己的脚本节点)。