2014-12-30 8 views
6

채팅/라이브 스트림 응용 프로그램 (비디오 + 문자 채팅)을 구축하고자합니다. 나는 그 순간에 접근법에 정착하지 않았지만 나는 앞으로 나아갈 것입니다. 그리고 저는 붙어 있습니다.getUserMedia에서 Node.js 서버로 비디오를 보내는 방법은 무엇입니까?

getUserMedia를 사용하여 비디오 스트림을 가져 와서 Socket.io를 통해 Node.js 서버로 보내려고합니다.

지금까지 나는 얼룩 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); 
    }); 
}); 

클라이언트 : 당신은 그것을 보내는 스트림 및 WebSocket을 잡는 위해 MediaRecorder의 API를 사용할 수

<!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

여기

세부 사항의 비트입니다 Node.js를합니다 (링크는 내 블로그에 있습니다) : https://www.webrtcexample.com/blog/?go=all/tutorial-recording-video/

즉, MediaRecorder API는 프레임 팩을 콜백 함수에 넣은 다음 프레임을 WebSocket (또는 다른 이진 채널)을 통해 서버 (node.js)로 보냅니다.

Firefox와 완벽하게 작동합니다. Chrome은 지금까지 MediaRecorder API를 실험적으로 구현했습니다.

+0

굉장! 나는 더 많은 HTML5를 기다릴 수 없다 :) – Costa

관련 문제