2012-10-26 65 views
3

我已經編寫了一個小型nodeJS服務器,它將Windows上使用DirectShow捕獲的ffmpeg的系統音頻作爲流媒體MP3文件輸出到瀏覽器。音頻需要儘可能的生動,最小/無緩衝,並且音頻中的「跳過」效果是完全可以接受的。Node.js Live Streaming:避免緩存

當我使用HTML5音頻標籤在Chrome中播放音頻時,低延時LAN連接延遲了大約8-10秒。我懷疑這是客戶端緩衝區,並在客戶端使用了Flash MP3播放器,從而延遲了2-3秒。

現在,緩衝似乎發生在服務器端。 NodeJS的response.write文件提到數據被寫入內核緩衝區。我該如何避免完全緩衝或至少繞過它,以便客戶端始終獲取最新的音頻數據?處理「流失」事件以始終推送實時數據的策略?

在請求對象上,我用setNoDelay(true)來避免使用Nagle的算法。以下是生成的ffmpeg進程發出數據時如何寫入數據的一段代碼。

var clients = []; //List of client connections currently being served 
ffmpeg.stdout.on('data', function(data) { 
    for(var i = 0; i < clients.length; i++){ 
     clients[i].res.write(data); 
    } 
}); 

回答

1

存在其中延遲/緩衝發生幾個地方:

  1. DirectShow的捕捉(〜100ms的左右)
  2. FFMPEG MPEG編碼緩衝液(1-10秒,取決於配置)
  3. 網絡寫入和傳輸(在您的設置中接近0)
  4. 客戶端緩衝(因客戶端而異,如您所見 - 大多數客戶端緩衝約2秒鐘解碼)

我懷疑你需要看的緩衝區是FFMPEG編碼的緩衝區。我已經能夠通過確保在執行FFMPEG時明確配置輸入格式來減少這種情況。另外,請確保刪除用於編碼的第一批數據,因爲前幾位無疑會被延遲超過以後。

一旦你這樣做了,你會發現你的延遲是一兩秒鐘。至少,這是我用類似的設置得到的。

+0

ffmpeg似乎不是我設置中的主要瓶頸。目前局域網的延遲時間約爲2-3秒,我試圖進一步降低。我會嘗試你放棄前幾位的建議。謝謝。 –