我读取一个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);  

解决方案 »

  1.   

    WAVEFORMATEX.wBitsPerSample := 0;这个似乎有问题。要看你的wave文件是什么精度的了。如果从你的nSamplesPerSec和nAvgBytesPerSec来看,wBitsPerSample应该是等于8。实际上,这个wave格式数据应该从wave文件中读出。
      

  2.   

    WAVEFORMATEX结构直接从WAV文件路读出来具体位置在fmt#0之后
    建议直接用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));
    ...
    ...