我读取一个WAV文件到内存里,用WaveOutWrite就是放不出来,请高手指教。代码如下: Fname := 'c:\11.wav';
f := TFileStream.Create(Fname,fmopenread);
f.ReadBuffer(Buf,BufferSize); WAVEFORMATEX.wFormatTag := WAVE_FORMAT_PCM;
WAVEFORMATEX.nChannels := 1;
WAVEFORMATEX.nSamplesPerSec := 8000;
WAVEFORMATEX.nAvgBytesPerSec := 8000;
WAVEFORMATEX.wBitsPerSample := 0;
WAVEFORMATEX.cbSize := 0; WaveOutOpen(@WaveOut,WAVE_MAPPER,@WAVEFORMATEX, 0, 0, CALLBACK_NULL );
WaveHead.lpData := @buf;
WaveHead.dwBufferLength := BufferSize;
WaveHead.dwBytesRecorded := 0;
WaveHead.dwFlags := WHDR_BEGINLOOP OR WHDR_ENDLOOP;
WaveHead.dwLoops := 0;
WaveHead.dwUser := 0;
WaveHead.lpNext := nil;
WaveHead.reserved := 0;
WaveOutPrepareHeader(WaveOut,@WaveHead,sizeof(WaveHead));
waveOutWrite(WaveOut,@WaveHead,sizeof(WaveHead));
WaveOutUnPrepareHeader(WaveOut,@WaveHead,sizeof(WaveHead));
WaveOutClose(WaveOut);
f := TFileStream.Create(Fname,fmopenread);
f.ReadBuffer(Buf,BufferSize); WAVEFORMATEX.wFormatTag := WAVE_FORMAT_PCM;
WAVEFORMATEX.nChannels := 1;
WAVEFORMATEX.nSamplesPerSec := 8000;
WAVEFORMATEX.nAvgBytesPerSec := 8000;
WAVEFORMATEX.wBitsPerSample := 0;
WAVEFORMATEX.cbSize := 0; WaveOutOpen(@WaveOut,WAVE_MAPPER,@WAVEFORMATEX, 0, 0, CALLBACK_NULL );
WaveHead.lpData := @buf;
WaveHead.dwBufferLength := BufferSize;
WaveHead.dwBytesRecorded := 0;
WaveHead.dwFlags := WHDR_BEGINLOOP OR WHDR_ENDLOOP;
WaveHead.dwLoops := 0;
WaveHead.dwUser := 0;
WaveHead.lpNext := nil;
WaveHead.reserved := 0;
WaveOutPrepareHeader(WaveOut,@WaveHead,sizeof(WaveHead));
waveOutWrite(WaveOut,@WaveHead,sizeof(WaveHead));
WaveOutUnPrepareHeader(WaveOut,@WaveHead,sizeof(WaveHead));
WaveOutClose(WaveOut);
建议直接用mmSystem单元里函数mmioOpen打开文件mmioDescend进行定位
读结构
var
parent :TMMCKInfo;
wfmtx :TWaveFormatEx;
begin
//打开文件
hWAV:=mmioOpen(PChar(WavFileName), nil, MMIO_READ or MMIO_ALLOCBUF);
//定位
parent.ckid:=MAKEFOURCC('f','m','t',#0);
mmioDescend(hWAV, @parent, nil, 0)
//读结构
mmioRead(hwav, @wfmtx, sizeof(TWaveFormatEx));
...
...