我正在使用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服务器的通信方式,但我尝试的任何方法都无法接近工作。
我一直在研究the W3C documentation(我发现它太抽象了),我一直在研究this article on HTML5 Rocks(它提出的问题比答案多)。显然,我需要一个信令方法,谁能告诉我哪种信令方法最适合发送媒体流、XHR、XMPP、SIP、www.example.com或其他东西?Socket.io or something else?
服务器上需要什么来支持WebRTC的接收?我的Web服务器正在运行一个基本的LAMP堆栈。
还有,是最好等到mediaStream
完成录制后再发送到服务器,还是在录制时发送mediaStream
更好?我想知道我是否正在以正确的方式进行此操作。我已经用JavaScript和HTML5编写了文件上传程序,但是上传这些mediaStreams
中的一个看起来要复杂得多,我不确定我是否正确地处理了它。
在这方面的任何帮助将不胜感激。
4条答案
按热度按时间ih99xse11#
您不能在直播流正在运行时上载直播流本身。这是因为它是直播流。
所以,这给你留下了一些选择。
1.使用RecordRTC的众多录音机之一录制音频流效果相当不错。等待流完成,然后上传文件。
1.使用计时器发送较小的录制音频块,并在服务器端再次合并它们。This is an example of this
1.当音频包通过websockets出现时,将其发送到服务器,以便您可以在那里操作和合并它们。My version of RecordRTC does this。
1.与你的服务器建立一个真正的对等连接,这样它就可以获取原始的rtp流,你可以使用一些低级代码来记录流,这在Janus-Gateway上很容易做到。
至于等待发送流还是分块发送,这完全取决于你录制了多长时间。如果时间较长,我会说分块发送录音或通过websockets主动发送音频包是一个更好的解决方案,因为从客户端上传和存储更大的音频文件对客户端来说可能很困难。
火狐实际上有一个它的own solution for recording,但它在Chrome中不受支持,所以它可能无法在您的情况下工作。
顺便说一句,提到的信令方法是用于会话建立/销毁的,实际上与媒体本身无关。只有在使用上面显示的解决方案4时,您才会真正担心这个问题。
djp7away2#
MediaRecorder API是一个很好的API,但它的支持不如Web音频API,因此您可以使用ScriptNode或Recorder.js(或基于它构建自己的scriptnode)来完成它。
pgpifvop3#
WebRTC的设计是点对点的,而
peer
可以是浏览器,也可以是服务器,所以完全可以通过WebRTC将流推送到服务器,然后将流记录为文件。河流流量为:
有很多服务器可以接受WebRTC流媒体,如SRS,janus或mediasoup。请注意,您可能需要将WebRTC(H.264+Opus)转换为MP4(H.264+AAC),或者选择支持此功能的SRS。
sdnqo3pr4#
是的,这是可能的发送MediaStream到您的服务器,但唯一的方法,你可以实现是通过WebSocket,使客户端浏览器发送数据到您的服务器在真实的连接.所以我建议您使用WebSocket