2010-09-29 102 views
2

我一直在使用環回捕捉模式捕捉音頻。捕獲的波形是一個32位波形。我努力將它轉換爲16位波形,因此像lame這樣的編碼器可以處理它(它表示不支持的數據格式:0x0003)。將32位波形轉換爲16位波形

我試過將波流中的位(不是我的強項)從32位移到16位,但結果仍然聽起來有失真。如果(sourceStream.WaveFormat.Encoding!= WaveFormatEncoding.IeeeFloat)拋出新的ApplicationException(「僅支持32位浮點支持」);否則返回false。

理想情況下,我想直接捕獲到16位,有沒有辦法設置捕獲位深度?如果沒有,有人可以幫助我轉換波流嗎?

捕獲波形的例子可以在這裏找到:http://dl.dropbox.com/u/454409/test.wav(10MB)

我也解決了一些方法來編碼這個與跛腳的MP3,我已經想盡參數排列我能想到的讓它接受wave文件。有趣的是Audacity(使用lame_enc編碼mp3)能夠從波形中創建一個mp3(但也許Audacity自動將它轉換爲16位,然後傳遞給它)。

回答

3

格式爲0x0003其實ieeeFloat,你不應該得到這個例外。更好地檢查它讀取的值。你不能用位移來轉換這些值,你必須從float轉換爲short。簡單的演員可以完成任務。

+0

這指出我在正確的方向,解決了我的問題。 – hreinn1000 2010-09-30 09:05:55

2

Sox可以爲你轉換這個。

http://sox.sourceforge.net/

合適COMMANDLINES:

http://sox.sourceforge.net/Docs/FAQ

硫化物任何文件-b 16 OUTFILE率-I 22050抖動-s

N.B.重新採樣和抖動 需要一些空間。如果SoX報告 在 處理期間發生了任何削波,則轉換應該 重新衰減一些,例如,

襪任何文件-b 16 OUTFILE增益-1 率44100抖動-s

+0

正確轉換爲16位有一點魔力。在音量播放時可以聽到舍入錯誤。Sox擁有相當聰明的噪音整形器,能夠通過將其隱藏在無聲的地方,從而使得圓整的錯誤聽不到。 – 2016-10-25 01:42:36

1

如果你的32位格式是浮點型,那麼很可能樣本值範圍從-1到1.要轉換爲16位(整型),需要乘以32767並轉換爲INT16。

如果32位浮點範圍大於-1..1,則需要查找最小值和最大值並計算得到INT16範圍內採樣的比例因子。

您可能需要添加一些抖動。