2016-09-16 69 views
0

我有一些困難與socket.io和節點流視頻文件。我的視頻文件位於我的服務器上,我正在使用fs模塊將其讀入一個readStream。我是他們將大塊數據傳遞給客戶端的媒體源,並將其輸入html 5視頻標籤。串流視頻與套接字io

儘管客戶端正在接收塊(我正在記錄它們),並且我正在將塊附加到媒體源的緩衝區,但沒有任何內容顯示在視頻標籤中。

任何人都知道如何解決這個問題?

這裏是我的代碼:

客戶端:

var mediaSource = new MediaSource(); 
    var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"'; 
    document.getElementById('video').src = window.URL.createObjectURL(mediaSource); 
    mediaSource.addEventListener('sourceopen', function(event) { 
     var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec); 
     console.log(sourceBuffer); 
     socket.on('chunk', function (data) { 
      if(!sourceBuffer.updating){ 
       sourceBuffer.appendBuffer(data); 
       console.log(data); 
      } 

     }); 
     socket.emit('go',{}) 
    }); 

服務器端: VAR流= fs.createReadStream(window.currentvidpath);

socket.on('go', function(){ 
    console.log('WENT'); 
    stream.addListener('data',function(data){ 
     console.log('VIDDATA',data); 
     socket.emit('chunk',data); 
    }) 
    }) 

非常感謝。

+0

您確定塊沒有以Base64的形式到達嗎?我假設,因爲socket.io使用JSON,所以任何二進制數據在被髮送之前都會被編碼......但是我可能會混淆東西。你應該檢查。 – Myst

+0

@Myst - 如果以這種方式設置,webSocket和socket.io具有二進制模式。 – jfriend00

+0

@ jfriend00,很高興知道。但是,我沒有看到在OP的服務器代碼中發佈了......如果服務器是這樣設置的,那可能會更好,因爲Base64會增加開銷(編碼,解碼和帶寬)。 – Myst

回答

0

的問題是,你只追加源緩衝區如果它沒有更新 if(!sourceBuffer.updating){ sourceBuffer.appendBuffer(data); console.log(data); }

繼承人我的控制檯我加了別的後並記錄時間也不會追加

SourceBuffer {mode: "segments", updating: false, buffered: TimeRanges, timestampOffset: 0, appendWindowStart: 0…} 
site.html:24 connect 
site.html:17 ArrayBuffer {} 
30 site.html:20 not appending 

因此,它附加了視頻的一部分,並被忽略30

您應該存儲未添加到數組中的那些。然後,只需設置一個循環Interval