2014-02-13 86 views
1

我試圖使用WebRTC來記錄音頻,然後將其存儲在服務器端。我的服務器是使用NodeJS製作並表達的,我使用POST將數據從客戶端傳輸到服務器。WAV格式差異(JS/NodeJS)

在客戶端上,我將數據從wav BLOB轉換爲base64,然後在服務器端讀取它,將其翻譯爲二進制文件,然後將其寫入文件。應該沒問題吧?

只有一個問題:我在從客戶端下載的內容和發送到服務器的內容之間出現一些非常不好的不一致之處。有時它會添加字節,有時候它只是被刪除的數據塊。如果只是添加了字節,那就意味着charset問題(從一個到另一個,然後是另一個等),但是在某些時候,我添加了280個字節。

我這裏補充一個十六進制差異的照片: http://i.stack.imgur.com/psqf4.png(對不起,我沒有足夠的聲譽,到目前爲止,直接張貼圖片)

此外,運行這些文件給我的下面: (uuid.wav是服務器之一,而(1)輸出的.wav是客戶端的一個)

9F2B75D3-4C34-4C8F-935E-FC7637D7A054.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 4 bit, stereo 11321924 Hz

output (1).wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz

。 ..很顯然這裏出了問題。此外,試圖修復標題,或轉換WAV給我一個錯誤沿線:無法找到數據塊/數據塊大小爲0.

任何想法可能是什麼原因造成這種情況?

+0

你是怎麼寫WAV文件的?你在用圖書館嗎?還是你手動編寫文件?另外,你使用什麼庫來進行Base64編碼/解碼? –

+0

在第二段中,你說你從客戶端的bin-> base64和客戶端的base64-> bin。那第二部分應該是'服務器'嗎? –

+0

是的,它應該是'服務器',對不起。我有一個預感,並試圖做base64 - > bin沒有庫(atob),它的工作。我沒有看過庫,但只是傳遞一個原始緩衝區來寫入,而不是字節數組似乎產生了正確的結果。 – Sabin

回答

1

這看起來像一層代碼試圖將二進制數據轉換爲Unicode。 0x44 0xAC(在little endian中是0xAC44,即44100,表示44.1 kHz採樣率)正在變爲0x44 0xC2 0xAC。這得到字節交換到0x00ACC244,這是11321924赫茲,與您在損壞的文件中看到的一致。

這些0xC2添加肯定看起來像Unicode(UTF-8)工件。我不知道你正在使用哪些數據類型和函數,但你需要審覈這些步驟,以確保它們都不會嘗試執行隱式Unicode轉換。

+0

我最終發現了這個問題。感謝您的幫助! – Sabin