2012-12-13 32 views
0

我目前正在一個小型項目中,我想將一個mp3分成幀,通過websocket發送給客戶端(瀏覽器),然後使用WebAudio播放它們webkitAudioContext)。我的服務器正在運行nodejs並以二進制形式傳輸數據,我使用binaryJS。我正在測試的瀏覽器是在Ubuntu 12.04上運行的Chrome 25.0.1354.0 dev。DOM異常12當試圖通過websocket流式傳輸MP3

我已經得到儘可能成功地將MP3分成幀,或者至少,根據我的測試,它似乎工作。如果我將幀寫回到文件中,mplayer在播放文件時沒有問題,並且也能正確解析標題。每個幀存儲在正確大小的nodejs緩衝區中,並且緩衝區的最後一個字節始終是下一個同步字符之前的第一個字節。

作爲初步測試,我只發送第一個MP3幀。客戶端成功接收幀(存儲在ArrayBuffer中),並且緩衝區包含正確的數據。然而,當我打電話解碼,我得到以下信息:

Uncaught Error: SyntaxError: DOM Exception 12 

我的功能,在這裏我呼籲decodeAudio,看起來是這樣的:

streamDone = -> 
    bArray = new Uint8Array(arr[0].byteLength) 
    console.log "Stream is done, bytes", bArray.length 
    context.decodeAudioData bArray, playAudio, err 

,我想deocde最初的框架,可以被發現here

爲了解決這個問題,我一直在牆上敲了幾下頭。有沒有人設法解決這個和成功解碼的MP3幀,看看我做錯了什麼?我在StackOverflow上發現了兩個相關的問題,但答案並沒有幫助我解決問題。但是,根據接受的答案here,我的幀應該被視爲有效的MP3塊,並因此被解碼。

在此先感謝您的幫助!

+0

我做了一些更小的文件測試,沒有ID3標籤。將幀寫入磁盤時,新文件與原始文件具有相同的md5散列值。當我將所有幀發送到服務器時,它們都適合一個binaryJS塊,並且ArrayBuffer的內容與該文件相匹配。我仍然得到DOM異常。 –

回答

0

原來,休息和一些新鮮的眼睛可以創造奇蹟,一般的代碼清理解決了這個問題。如果有人對代碼感興趣,我發佈了here

+0

你能更具體嗎?你有沒有追溯到你的代碼中的特定問題? – Vince

+0

不,不是。但是,我的理論是,我在存儲二進制數據方面做了一些與客戶端有關的事情。 –

相關問題