我有一个原始音频文件从格式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