2010-08-26 219 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版本。看起来好像翻译起来很容易。