我有一個原始音頻文件從格式u-law mono 8KHZ(沒有wav頭文件)從相機中捕獲。我遇到的問題是,當我嘗試播放文件時,我似乎聽到了糟糕的噪音。我已經通過名爲goldwave的程序插入了原始音頻,並且能夠完美地播放該文件。我相信我只是缺少一些簡單的東西。無法播放原始音頻文件
我一直在嘗試使用waveout功能,但沒有運氣。在嘗試通過waveout功能推送之前,是否需要首先解碼來自u-law的數據?
我有一個原始音頻文件從格式u-law mono 8KHZ(沒有wav頭文件)從相機中捕獲。我遇到的問題是,當我嘗試播放文件時,我似乎聽到了糟糕的噪音。我已經通過名爲goldwave的程序插入了原始音頻,並且能夠完美地播放該文件。我相信我只是缺少一些簡單的東西。無法播放原始音頻文件
我一直在嘗試使用waveout功能,但沒有運氣。在嘗試通過waveout功能推送之前,是否需要首先解碼來自u-law的數據?
如果你只是使用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;
設置wFormatTag
到WAVE_FORMAT_MULAW
,或0x0007。請確保以8000樣本/秒和8位/樣本爲1個通道正確填寫其他參數。
如果失敗,請將代碼發佈到打開音頻設備並播放文件的位置。或者,這裏有一個Delphi實現U型法解碼,以線性PCM(ulawDecode
),這樣你可以自己對其進行解碼:
http://www.koders.com/delphi/fidEAA58384F59968FEDD0670F6EABF09DF3A5C58A5.aspx?s=algorithm#L19
謝謝你指出。我終於明白了。主要問題是我被告知這是16位的u-law,但實際上它是8位的u-law。一旦我把它放在這裏,就像你在這裏提到的那樣,它運行良好。 – LomWoss 2010-08-27 12:53:36
是的。 waveout函數期望未壓縮的音頻,這不是你所擁有的。
但ulaw幾乎是PCM,這很容易解碼。快速搜索引導我使用該算法的C源代碼,因此它絕對可用,但我無法輕鬆找到pascal/delphi源代碼。 http://www.programmersheaven.com/download/3826/download.aspx是C版本。看起來好像翻譯起來很容易。
你用什麼文件擴展名?你如何播放你的文件?您可能會缺少編解碼器,或者無法爲Windows音頻層提供足夠的信息來選擇正確的編解碼器。 – 2010-08-26 15:03:41