2014-12-30 74 views
6

我期待构建聊天/实时流应用程序(视频+文字聊天)。目前我还没有解决方法,但我正在向前迈进,而且我陷入了困境。如何将视频(从getUserMedia)发送到Node.js服务器?

我试图抓住使用getUserMedia的视频流,并通过Socket.io发送给我的Node.js服务器。

到目前为止,我已经得到了blob url:"mediastream:http://192.168.1.20:3000/1c267861-a2da-41df-9a83-ae69fdfd883b",但我不确定如何从它中获取数据以通过socket.io发送。

任何帮助将摇滚。

服务器:

// server.js 

var http = require('http'); 
var socketio = require('socket.io') 
var fs = require('fs'); 

var server = http.createServer(function (req, res) { 
    if (req.url ==='/') { 
    fs.readFile('index.html', function (err, html) { 
     res.writeHeader(200, {"Content-Type": "text/html"}); 
     res.write(html); 
     return res.end(); 
    }); 
    } else { 
    res.end('hi!'); 
    } 
}); 

var io = socketio(server); 

server.listen(8000, function() { 
    console.log('Jumping on port 8000!'); 
}); 

io.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
    socket.on('video', function (video) { 
    console.log(video); 
    }); 
}); 

客户:

<!doctype html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Video Café</title> 
    <meta name="description" content="A place online where we can get together and chat..."> 
    <meta name="viewport" content="width=device-width"> 
    <style type="text/css"> 
     *, *::before, *::after {box-sizing: border-box} 
     body {padding: 1em;} 
     h1, div {text-align: center; margin: 1em auto;} 
     #localVideo { 
     width: calc(50% - 2em); 
     margin: 1em auto; 
     } 
    </style> 
    <script src="/socket.io/socket.io.js"></script> 
    <script> 
     ;(function() { 
     "use strict"; 
     window.addEventListener('load', function (event) { 
      var socket = io('http://localhost'); 
      socket.on('news', function (data) { 
      console.log(data); 
      socket.emit('my other event', { my: 'data' }); 
      }); 

      // Shims 
      var PeerConnection = window.mozRTCPeerConnection || window.webkitRTCPeerConnection; 
      var IceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate; 
      var SessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription; 
      navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia; 

      document.getElementById('startButton').addEventListener('click', function (event) { 
      console.log('working...'); 
      navigator.getUserMedia({ 
       video: true, 
       audio: true 
      }, function (localMediaStream) { 
       var blob = window.URL.createObjectURL(localMediaStream); 
       window.stream = localMediaStream; // stream available to console 
       var video = document.getElementById('localVideo'); 
       video.src = blob; 
       video.play(); 
       // Send localstream to node 
       console.log(blob); 
       socket.emit('video', { my: blob }); 
      }, function (error){ 
       console.log("navigator.getUserMedia error: ", error); 
      }); 
      }, false); 

      // var pc = new RTCPeerConnection(null); 
      // pc.onaddstream = gotRemoteStream; 
      // pc.addStream(localStream); 
      // pc.createOffer(gotOffer); 

      // function gotOffer(desc) { 
      // pc.setLocalDescription(desc); 
      // sendOffer(desc); 
      // } 

      // function gotAnswer(desc) { 
      // pc.setRemoteDescription(desc); 
      // } 

      // function gotRemoteStream(e) { 
      // attachMediaStream(remoteVideo, e.stream); 
      // } 


     }, false); 
     }()); 
    </script> 
    </head> 
    <body> 
    <h1>Video Café</h1> 
    <video id="localVideo" muted autoplay></video> 
    <video id="remoteVideo" autoplay></video> 
    <div> 
     <button id="startButton">Start</button> 
     <button id="callButton">Call</button> 
     <button id="hangupButton">Hang Up</button> 
    </div> 
    </body> 
</html> 
+0

https://github.com/Hironate/PeerChat – laggingreflex

+0

不起作用。我收到一个警告框,显示以下错误:无法创建RTCPeerConnection对象。 – Costa

回答

2

你可以使用MediaRecorder API为抓住流的WebSockets发送它的Node.js

这里有点细节(链接到我自己的博客):https://www.webrtcexample.com/blog/?go=all/tutorial-recording-video/

总之, MediaRecorder API将帧数组放入您的回调函数中,然后通过WebSockets(或任何其他二进制通道)将帧发送到服务器(node.js)。

它适用于Firefox。到目前为止Chrome已经实现了MediaRecorder API的实现。

+0

太棒了!我不能等待更多的HTML5:) – Costa

相关问题