2010-08-26 193 views
1

我有一個原始音頻文件從格式u-law mono 8KHZ(沒有wav頭文件)從相機中捕獲。我遇到的問題是,當我嘗試播放文件時,我似乎聽到了糟糕的噪音。我已經通過名爲goldwave的程序插入了原始音頻,並且能夠完美地播放該文件。我相信我只是缺少一些簡單的東西。無法播放原始音頻文件

我一直在嘗試使用waveout功能,但沒有運氣。在嘗試通過waveout功能推送之前,是否需要首先解碼來自u-law的數據?

+0

你用什麼文件擴展名?你如何播放你的文件?您可能會缺少編解碼器,或者無法爲Windows音頻層提供足夠的信息來選擇正確的編解碼器。 – 2010-08-26 15:03:41

回答

0

如果你只是使用Windows API中的waveout的功能,waveOutOpen第三個參數是一個指向WAVEFORMATEX結構:

MMRESULT waveOutOpen(
    LPHWAVEOUT phwo, 
    UINT_PTR uDeviceID, 
    LPWAVEFORMATEX pwfx, 
    DWORD_PTR dwCallback, 
    DWORD_PTR dwCallbackInstance, 
    DWORD fdwOpen 
); 

一個WAVEFORMATEX結構允許您指定的格式,Windows應沒有你需要安裝任何東西,能夠做u-Law。

typedef struct { 
    WORD wFormatTag; 
    WORD nChannels; 
    DWORD nSamplesPerSec; 
    DWORD nAvgBytesPerSec; 
    WORD nBlockAlign; 
    WORD wBitsPerSample; 
    WORD cbSize; 
}WAVEFORMATEX; 

設置wFormatTagWAVE_FORMAT_MULAW,或0x0007。請確保以8000樣本/秒和8位/樣本爲1個通道正確填寫其他參數。

如果失敗,請將代碼發佈到打開音頻設備並播放文件的位置。或者,這裏有一個Delphi實現U型法解碼,以線性PCM(ulawDecode),這樣你可以自己對其進行解碼:

http://www.koders.com/delphi/fidEAA58384F59968FEDD0670F6EABF09DF3A5C58A5.aspx?s=algorithm#L19

+0

謝謝你指出。我終於明白了。主要問題是我被告知這是16位的u-law,但實際上它是8位的u-law。一旦我把它放在這裏,就像你在這裏提到的那樣,它運行良好。 – LomWoss 2010-08-27 12:53:36

0

是的。 waveout函數期望未壓縮的音頻,這不是你所擁有的。

但ulaw幾乎是PCM,這很容易解碼。快速搜索引導我使用該算法的C源代碼,因此它絕對可用,但我無法輕鬆找到pascal/delphi源代碼。 http://www.programmersheaven.com/download/3826/download.aspx是C版本。看起來好像翻譯起來很容易。