无法播放原始音频文件

时间:2010-08-26 12:28:08

标签: delphi audio

我有一个从相机捕获的原始音频文件,格式为u-law mono 8KHZ(没有wav标头)。我遇到的问题是,当我尝试播放文件时,我似乎得到了很差的噪音。我已通过名为goldwave的程序插入原始音频,并且能够完美播放文件。我确信我只是遗漏了一些简单的东西。

我一直在尝试使用waveout功能,但没有运气。在尝试推送波形函数之前,我是否需要首先解码u-law中的数据?

2 个答案:

答案 0 :(得分:0)

是。 waveout函数期望未压缩的音频,而不是你拥有的。

但是ulaw几乎是PCM,而且很容易解码。快速搜索引导我使用算法的C源代码,因此它绝对可用,但我无法轻松找到pascal / delphi源代码。 http://www.programmersheaven.com/download/3826/download.aspx是C版本。看起来好像很容易进行翻译。

答案 1 :(得分: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;

wFormatTag设置为WAVE_FORMAT_MULAW或0x0007。确保为8000个样本/秒和8位/样本的1个通道正确填写其他参数。

如果失败,请在打开音频设备的地方发布代码并播放该文件。或者这里是对线性PCM(ulawDecode)的u-Law解码的delphi实现,所以你可以自己解码:

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