2011-06-16 25 views
3

我使用nodejs創建了一個小應用程序,用於將multipart/x-mixed-replace數據傳輸到瀏覽器。對於使用node.js創建的mjpeg流,如何以其他格式對其進行編碼然後進行流式處理?

此數據是使用圖像數據創建的,但圖像數據可能隨時間而改變,因此在瀏覽器中它看起來像一個視頻。圖像數據是從網絡攝像頭創建的,因此在瀏覽器中它看起來像直播。

但是表現不是很好。

我嘗試了一些其他方法: - 第一:使用socket.io將圖像推送到瀏覽器,在這裏我使用圖像中的base64數據(推送此數據)並在瀏覽器中重新創建圖像(jpeg ):效果很好,但只有一個或兩個客戶。 _第二:使用從瀏覽器到nodejs服務器的輪詢..這不喜歡我。

所以這是代碼:我用快遞,使HTTP服務器(我的NodeJS服務器的代碼的某些部分):

app.get('/videoStream',function(req,response){ 
    response.writeHead(200,{ 
     'Content-Type': 'multipart/x-mixed-replace;boundary="' + boundary + '"', 
     'Connection': 'keep-alive', 
     'Expires': 'Fri, 01 Jan 1990 00:00:00 GMT', 
     'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', 
     'Pragma': 'no-cache' 
    }); 
    response.write('--'+boundary+'\n'); 

    events.addListener('imagen_recibida',function(){ 
     fs.readFile(__dirname + '/image.jpeg',function(err,data){ 
      if(err) return send404(response); 
      response.write('Content-Type: image/jpeg\n Content-Length: '+data.length+'\n\n'); 
      response.write(data); 
      response.write('\n--'+boundary+'\n'); 
      }); 
    }); 

當事件「imagen_recibida」興起,它讀取圖像磁盤並將數據寫入瀏覽器。

所以這兩個問題:

有沒有什麼辦法來改善這方面的表現? (將圖像寫入磁盤,然後讀取發送到瀏覽器看起來不是一個很好的把戲)

是否有一種方法可以將其編碼爲另一種格式以提高性能?

非常感謝。

PD:圖像被寫入磁盤,然後讀取發送給瀏覽器,因爲我通過RPC調用從另一個函數的另一個進程接收圖像數據。

回答

3

您可以嘗試使用socket.io來推送生成的文件的URL,然後在客戶端上使用Javascript來替換顯示該幀的img標籤的「src」屬性。在這種情況下,您可以使用常規Web服務器爲服務器提供靜態文件或使用連接模塊來提供靜態文件。這可能比推送base64編碼數據更有效。

如果你打算使用上面的方法,至少不要使用fs.readFile ...這將整個文件每次都帶入內存。使用util.pump()或手動使用帶有'drain'事件的ReadStream/WriteStream來最大限度地減少內存使用量。當有多個客戶端連接時,您的性能問題可能是垃圾回收所致。

另一種方法可能是建立一個後臺進程,將圖像提供給ffmpeg以編碼適當的視頻流,然後通過ffserver將其流式傳輸到視頻播放器。

+1

readstream/writestream聽起來像贏家,你能詳細說明一下嗎?我很想好好了解我自己。 – jcolebrand 2011-06-16 15:09:49

+0

查看util.pump()的示例如何使用流的實現:https://github.com/joyent/node/blob/master/lib/util.js#L359 – BCG 2011-06-16 15:14:56

+0

感謝@bgould這個想法。 。任何知識點abuot圖像ffmpeg?我想用這個來編碼視頻流顯示到視頻標籤..或者只是你評論..謝謝! – matiasfh 2011-06-16 15:41:14

相關問題