通过 acmFormatChoose 函数调出来的编码格式选择对话框,
我使用的是 Windows Media Audio V2 ,即使用DivX WMA Audio Coder,通过acmFormatChoose 运行程序,一切正常。但我使用如下代码跳过对话框直接运行时就会出现问题(调用时没有错误提示,但在收到音频数据后,回放时没有任何声音),请问是哪里的问题。定义结构为   TDIVWMA=packed record
       wFormatTag: Word;       
       nChannels: Word;        
       nSamplesPerSec: DWORD;  
       nAvgBytesPerSec: DWORD;
       nBlockAlign: Word;     
       wBitsPerSample: Word;   
       cbSize: Word;           
  end;var
 DivWma:TDIVWMA;   
 AudioFormat:pointer;procedure TUDPMainForm.BTRecivClick(Sender: TObject);
begin
with DivWma do
   begin
       wFormatTag :=353;   
       nChannels := 1;     //mono
       nSamplesPerSec := 8000;
       nAvgBytesPerSec:= 1000; { for buffer estimation }
       nBlockAlign:=64;      { block size of data }
       wbitspersample := 16;
       cbSize:=10;
   end;  
   AudioFormat:=@DivWma;
   ACMWaveOut_1.Open(AudioFormat);
end;  

解决方案 »

  1.   

    自己设置ACMWaveFormat  WaveFormatEx.wFormatTag:=1;
      WaveFormatEx.nChannels:=1;
      WaveFormatEx.nSamplesPerSec:=8000;
      WaveFormatEx.nAvgBytesPerSec:=WaveFormatEx.nSamplesPerSec;
      WaveFormatEx.nBlockAlign:=1;
      WaveFormatEx.wBitsPerSample:=8;
      WaveFormatEx.cbSize:=0;
      ACMWaveFormat.Format:=WaveFormatEx
      

  2.   

    这样不行,虽然不报错,但是不能正常采集声音,采集后回放是没有任何声音
    上面那几个值是我根踪ACM得出的,但就是不行啊,GSM610可以
      

  3.   

    可以阿。我就时自己设置FORMAT
      

  4.   

    那我要请教了,在格式选择对话框中,如何自己设置选择最下面的那种
    Windows Media Audio 2
      

  5.   

    我下载的acm在delphi7上用不了,你们的acm 能在delphi7上用吗?如果可以能不能给我发一个?先谢谢了。[email protected]
      

  6.   

    我的是这样用的,试试看
    function  TForm1.InitACMFormat:pointer;// 获得ACM数据格式指针
     var FWaveFormat: pWaveFormatEx;
         FMaxFmtSize:integer;
    begin
       FMaxFmtSize:=8000; //8000、11025
       GetMem(FWaveFormat, FMaxFmtSize);
       if FWaveFormat = nil then begin
           showmessage('Error allocating local memory for WaveFormatEx structure.');
           Result:=nil;
           Exit;
       end;   // initialize the format to standard PCM...
       FillChar(FWaveFormat^, FMaxFmtSize, 0);
       FWaveFormat.wFormatTag      := WAVE_FORMAT_PCM;
       //FWaveFormat.wFormatTag      :=$31;//WAVE_FORMAT_GSM610; set default format to GSM6.10
       FWaveFormat.nChannels       := 1;
       FWaveFormat.nSamplesPerSec  := FMaxFmtSize;
       FWaveFormat.nAvgBytesPerSec := FMaxFmtSize;
       FWaveFormat.nBlockAlign     := 1;
       FWaveFormat.wBitsPerSample  := 8;
       FWaveFormat.cbSize          := 0;
       result:=FWaveFormat;
    end;
      

  7.   

    ASDC001(ASDC001) 这样确实可行,对于GSM610,我试过至少三种方法,完全成功
    但用于 Windows Media Audio V2 就不行
    我使用的格式如下      wFormatTag :=353;   
           nChannels := 1;     //mono
           nSamplesPerSec := 8000;
           nAvgBytesPerSec:= 1000; { for buffer estimation }
           nBlockAlign:=64;      { block size of data }
           wbitspersample := 16;
           cbSize:=10;大家看看是不是有错???
      

  8.   

    function  TForm1.InitACMFormat:pointer;// 获得ACM数据格式指针
     var FWaveFormat: pWaveFormatEx;
         FMaxFmtSize:integer;
    begin
       FMaxFmtSize:=8000; //8000、11025
       GetMem(FWaveFormat, FMaxFmtSize);
       if FWaveFormat = nil then begin
           showmessage('Error allocating local memory for WaveFormatEx structure.');
           Result:=nil;
           Exit;
       end;   // initialize the format to standard PCM...
       FillChar(FWaveFormat^, FMaxFmtSize, 0);
       FWaveFormat.wFormatTag      := WAVE_FORMAT_PCM;
       //FWaveFormat.wFormatTag      :=$31;//WAVE_FORMAT_GSM610; set default format to GSM6.10
       FWaveFormat.nChannels       := 1;
       FWaveFormat.nSamplesPerSec  := FMaxFmtSize;
       FWaveFormat.nAvgBytesPerSec := FMaxFmtSize;
       FWaveFormat.nBlockAlign     := 1;
       FWaveFormat.wBitsPerSample  := 8;
       FWaveFormat.cbSize          := 0;
       result:=FWaveFormat;
    end;
    FWaveFormat.wFormatTag      := WAVE_FORMAT_PCM;通过
       //FWaveFormat.wFormatTag      :=$31;//WAVE_FORMAT_GSM610; set default format to GSM6.10
       不行,为什么?
      

  9.   

    zangqi(回眸一笑) 可以,但是这是使用GSM610格式的
    我调用别的格式不行
      

  10.   

    在我的机器上PCM格式wFormatTag:=$1可以,GSM610 wFormatTag:=$31就不可以。好奇怪!
       FWaveFormat.wFormatTag      :=$31;
       FWaveFormat.nChannels       := 1;
       FWaveFormat.nSamplesPerSec  := 8000;
       FWaveFormat.nAvgBytesPerSec := 1625;
       FWaveFormat.nBlockAlign     := 65;
       FWaveFormat.wBitsPerSample  := 0;
       FWaveFormat.cbSize          := 2;
      

  11.   

    显示“ problem creating playing handle32”
    意即:系统试图以不被支持的波型格式打开设备用acmFormatChoose没问题!
      

  12.   

    楼上的说对了,用acmFormatChoose就没问题!
    不晓得如何解决这个问题,每次录音总要别人来选格式总是不好
      

  13.   

    请问这个问题解决了吗?有人给出好的解决方法吗?是否是windows的bug?我参考MMTools
    的demo的时候,遇到同样的问题,请高手出马!
      

  14.   

    呵呵,问题我已经解决了,想知道的就给我写信吧,完全是我们对acmFormatChoose的了解太片面造成的