2014-12-29 171 views
2

我通過websockets發送編碼的現場音頻流(mp3或ogg),我想用網絡音頻api播放它。 我閱讀並嘗試了幾件事,但目前爲止沒有任何工作...使用網絡音頻播放編碼的音頻流Api

我一直試圖用decodeAudioData方法來做到這一點。 但是這種方法不能處理連續的流。 所以我最後的辦法是這樣的:

ws.onmessage = function (evt) { 

     context.decodeAudioData(evt.data, function (decodedData) { 
      source = context.createBufferSource(); 
      source.buffer = decodedData; 
      source.start(startTime); 
      source.connect(context.destination); 

      startTime += decodedData.duration; 
     }, 
     function(e) { 
      var test = e; 
     } 
     ); 

    }; 

這個工程至少有MP3歌曲,但不是很好。在收到的塊之間有一個非常小的休息。所以流沒有流暢的播放。我不知道這是什麼原因......也許decodeData.duration屬性不夠精確,或者在任何地方都有某種延遲。

無論如何,它與ogg文件完全不兼容。我可以聽到第一個接收到的塊,但其餘的被忽略。也許這與丟失標題有關?

是否有任何其他方法在網絡音頻API播放編碼的直播流然後decodeAudioData?我找不到任何東西...

感謝您的幫助!

回答

1

不要通過網絡套接字來做到這一點,如果你可以幫助它。讓瀏覽器完成工作並通過HTTP進行播放。否則,你必須重新創造一切。

如果硬要出於某種原因重塑一切,你必須:

  • 緩衝輸入數據
  • 解碼數據
  • 緩衝解碼後的數據
  • 回放您的解碼PCM緩衝器與腳本節點
  • 處理緩衝區欠載/超限(可能通過播放靜音或丟棄PCM樣本)的時間

你如何做這些項目取決於你的具體需求和實施,所以我會建議分裂的問題,如果你卡住任何。