2017-07-30 7 views
0

socket.ioを使用してストリームblobをノードjsサーバーに送信できます。しかし、ビデオプレーヤーでBLOBデータを更新している間に点滅しています。私はそれが滑らかに実行したい。どのように私はビデオプレーヤーの点滅なしでデータを送信することができます。ここで私は500デフォルトにMediaStreamRecorder APIの変更のタイムスライス値を持っている私のサーバーコードがgetusermediaで記録されたストリームをサーバーnodejsにリアルタイムで送信する方法

var express = require("express"); 
var app = express(); 
var http = require("http").Server(app); 
var io = require("socket.io")(http); 
var fs = require("fs") 

app.use(express.static('public')) 
app.get("/", function(req, res){ 
res.sendFile(__dirname+ "/public/index.html"); 
}); 


io.on("connection", function(socket) { 
    console.log("A user is connected"); 
    socket.on("send", function(data){ 
    console.log(data); 
    socket.emit("data", data); 
    }); 
    socket.on("disconnect", function() { 
    console.log("A user is disconnected"); 
    }); 
}); 


http.listen(3000, function(){ 
    console.log("Server is started at port 3000\nTo close use Ctrl+C"); 
}); 

されており、ここで私のクライアント側のコードがあり、

<html> 
<head><title>Testing</title> 
<script src="socket.io/socket.io.js"></script> 
<script type="text/javascript" src="MediaStreamRecorder.js"></script> 
</head> 
<body> 
<video autoplay="true" id="video"></video> 
<script type="text/javascript"> 
var socket = io(); 
      window.URL.createObjectURL = window.URL.createObjectURL || window.URL.webkitCreateObjectURL || window.URL.mozCreateObjectURL || window.URL.msCreateObjectURL;    
      socket.on("data", function(data){ 
        var binaryData = []; 
        binaryData.push(data); 
        videoElement = document.getElementById('video'); 
        videoElement.src = window.URL.createObjectURL(new Blob(binaryData, {type: "video/webm"})); 
      }); 

       var mediaConstraints = { 
         video: true 
        }; 
       navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; 

        navigator.getUserMedia(mediaConstraints, onMediaSuccess, onMediaError); 

        function onMediaSuccess(stream) { 
         var arrayOfStreams = [stream]; 
         var medias = new MediaStreamRecorder(stream); 
         medias.ondataavailable = function(blob) { 
          socket.emit("send", blob); 
         }; 
         medias.start(); 
        } 

        function onMediaError(e) { 
         console.error('media error', e); 
        } 
</script> 
</body> 
</html> 

。したがって、500ミリ秒後にサーバーにデータを送信します。しかし、Webページで点滅しています。私はそれをリアルタイムにするためにこれを持っています。どんな助けもありがとう。

答えて

1

しかし、動画プレーヤーでBLOBデータを更新すると点滅しています。

<video>要素の.srcを変更しています。

URL.createObjectURL()およびMediaStreamRecorderは不要です。

の代わりに、一度MediaStreamオブジェクトを渡すと、渡されたMediaStream<video>要素.srcObjectを設定することができ.src<video>の要素を変更します。

videoElement = document.getElementById("video"); 

function onMediaSuccess(stream) { 
    if (videoElement.srcObject === null) { 
    videoElement.srcObject = stream 
    } 
} 

var videoElement = document.getElementById("video"); 
 

 
videoElement.oncanplay = function() { 
 
    videoElement.play(); 
 
} 
 

 
var media = document.createElement("video"); 
 

 
media.src = "https://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4"; 
 

 
media.oncanplay = function() { 
 
    media.play(); 
 
    var stream = media.captureStream(); 
 
    onMediaSuccess(stream); 
 
} 
 

 
function onMediaSuccess(stream) { 
 
    if (videoElement.srcObject === null) { 
 
    videoElement.srcObject = stream 
 
    } 
 
}
<video id="video"></video>

要件は、あなたが、MediaSourceを使用FileReaderfetch()を使用してArrayBufferBlobを変換し、SourceBufferArrayBufferを追加し、Unable to stream video over a websocket to Firefoxを見ることができBlobを送信する場合。

0

あなたはTCP接続を使用するsocket.ioを使用しています。アプリケーションをリアルタイムでSkypeのようにしたい場合は、UDP接続を使用する必要があります。

1つのフレームが遅れている場合、アプリケーションはこれを無視するべきですが、あなたの場合はTCP接続を使用しているため、常に順番に配信されます。ファイアウォールもTCP接続の問題です。あなたは、あなたのビデオが点滅しているリアルタイムアプリケーションには大きすぎる500msにタイムアウトを設定しようとしました。

もしあなたがTCP接続を断念したいのであれば、私はこれに対する小さな解決策を持っています。私はこれを試して、それは正常に動作しています。

https://www.youtube.com/watch?v=ieBtXwHvoNk

ただ、一つの問題は、簡単にWebSocketをで行うことができ、この場合には、あなたが直接、WAN上のパケットを送信することができないということです。 STUN/TURNなどをサーバーに実装する必要があります。

あなたはまだいくつかの疑問を持っている場合、このgithubの問題を参照し、すべての返信をお読みください。https://github.com/socketio/socket.io/issues/1175

私はこれが役立つだろう願っています。

関連する問題