'打开        Dim mWaveInFmt As WAVEFORMATEX
        With mWaveInFmt
        
            .nChannels = 1
        ......
        End With
        
        ' Open Input Wave Device, Let WAVE_MAPPER Pick The Best Device...
        l = waveInOpen(hWaveIn, WAVE_MAPPER, mWaveInFmt, 0, 0, CALLBACK_NULL)
        If l Then Err.Raise 68, , "不能打开音频输出设备"
        
        l = mWaveInFmt.nAvgBytesPerSec / CAPTURE_RATE * 2
        InitWaveHDR mWaveInHDR, l
        
        l = waveInPrepareHeader(hWaveIn, mWaveInHDR, Len(mWaveInHDR)) ' Validate Return Code
读取:
    With WaveInHDR
        If (.dwFlags And WHDR_DONE) = WHDR_DONE Then
            
            Dim l As Long
            l = .dwBytesRecorded
            If l > 0 Then
                
                Dim bt() As Byte
                ReDim bt(l - 1)
                
                CopyMemory bt(0), ByVal .lpData, l
                
                Dim b As Boolean
                b = True
                
                'b = (Year(Date) < 2001)
            End If
            
            l = waveInAddBuffer(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
            If b Then
                RaiseEvent Frame(bt)

解决方案 »

  1.   

    不知道这个问题有没有解决?? 如果解决能不能告诉我??Email:[email protected]谢谢!!!!
      

  2.   

    哎呀,我们需要的是Delphi的解决办法啊?
      

  3.   

    哇.....这么深奥的问题。我听都没有听过,提问的大虾你的EMAIL是多少?
    我以后有问题问你算了。谢谢
      

  4.   

    下面是一个大虾的贴子:
    请原谅忘记作者是谁了。
    // 全局变量 
    var 
      BufferFinished : boolean; // indicates current record buffer is full 

      UserStopRecord: boolean; 
      Recording: boolean;   WaveInHandle: HWaveIn;   CurrentUsingBuffer: integer; 
      WaveInHeader1: TWaveHdr; 
      WaveInHeader2: TWaveHdr;   RecordBufferSize: integer; 
      TotalRecordedSize: DWORD; 
    //进行录音 
    procedure TDlgRecord.BtnStartClick(Sender: TObject); 
    var 
      TempInt, TempCode: integer; 
      TempFileName: string;   MMR: MMResult; 
      MyWaveFormat: TWaveFormatEx; begin 
      PrgsBarSpace.Position := 0; 
      Recording := false; 
      OldDiskFree := DiskFree (RecordDrive); 
      with RecordWaveFormat do 
        begin 
        if RdoBtnMono.Checked = true then 
          Channels := 1 
        else 
          Channels := 2; 
        if RdoBtn8Bit.Checked = true then 
          BitsPerSample := 8 
        else 
          BitsPerSample := 16; 
        Val (EditFrequency.Text, TempInt, TempCode); 
        if TempCode <> 0 then 
          begin 
          Application.MessageBox ('无效数值', '错误', MB_Ok); 
          exit; 
          end 
        else if TempInt > 48000 then 
          begin 
          Application.MessageBox('不能大于48000赫兹', '错误', MB_Ok); 
          exit; 
          end 
        else 
          begin 
          SamplesPerSecond := TempInt; 
          end; 
        BytesPerSecond := SamplesPerSecond * Channels * BitsPerSample div  
    8; 
        BlockAlign := BitsPerSample * Channels div 8 ; 
        end;   TempFileName := TempFileNameGenerator (Self.TempPath, 'WM_', 'TMP',  
    5);   AssignFile (RecordFile, TempFileName); 
      Rewrite (RecordFile, 1); 
      if IOResult <> 0 then 
        begin 
        Application.Messagebox ('无法创建暂时文件,请检查临时目录设定。',  
    '严重错误', MB_OK); 
        exit; 
        end;   RecordFileName := TempFileName; 
      RecordSuccess := false; // 由于文件名已经改变,所以在这里修改该变量。 
      // Preparation jobs here 
      SttTextElapsedTime.Caption := '00:00:00'; 
      ElapsedHours := 0; 
      ElapsedMinutes := 0; 
      ElapsedSeconds := 0; 
      CurrentUsingBuffer := 1; 
      TotalRecordedSize := 0; 
      BufferFinished := false; 
      UserStopRecord := false; 
      RecordBufferSize := RecordWaveFormat.BytesPerSecond * 2; // for 2 se 
    conds 
      Buffer1 := nil; 
      Buffer2 := nil;   try 
        GetMem (Buffer1, RecordBufferSize); 
      except 
        Application.MessageBox ('内存不足,分配第一缓冲区失败。', '错误',  
    MB_OK); 
      end;   try 
        GetMem (Buffer2, RecordBufferSize); 
      except 
        Application.MessageBox ('内存不足,分配第二缓冲区失败。', '错误',  
    MB_OK); 
      end;   if (Buffer1 = nil) or (Buffer2 = nil) then 
        begin 
        CloseFile (RecordFile); 
        exit; 
        end;   MyWaveFormat.wFormatTag := WAVE_FORMAT_PCM; 
      MyWaveFormat.nChannels := RecordWaveFormat.Channels; 
      MyWaveFormat.nSamplesPerSec := RecordWaveFormat.SamplesPerSecond; 
      MyWaveFormat.nAvgBytesPerSec := RecordWaveFormat.BytesPerSecond; 
      MyWaveFormat.nBlockAlign := RecordWaveFormat.BlockAlign; 
      MyWaveFormat.wBitsPerSample := RecordWaveFormat.BitsPerSample; 
      MyWaveFormat.cbSize := 0;   MMR := waveInOpen (Addr (waveInHandle), 
                         SelectedDevice, 
                         Addr (MyWaveFormat), 
                         DWORD (Addr (WaveInCallBack)), 
                         0, 
                         CALLBACK_FUNCTION); 
      if MMR <> MMSYSERR_NOERROR then 
        begin 
        FreeMem (Buffer1); FreeMem (Buffer2); 
        RecordBufferSize := 0; 
        CloseFile (RecordFile); 
        Application.MessageBox ('无法打开输入设备,请检查设定。', '错误',  
    MB_OK); 
        exit; 
        end;   waveInHeader1.lpData := Buffer1; 
      waveInHeader1.dwBufferLength := RecordBufferSize; 
      waveInHeader1.dwBytesRecorded := 0; 
      waveInHeader1.dwUser := 0; // 32 bits of user data 
      waveInHeader1.dwFlags := 0; 
      waveInHeader1.dwLoops := 0; 
      waveInHeader1.lpNext := nil; // reserved; must be zero 
      waveInHeader1.reserved := 0; // reserved; must be zero 
      MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader1), 
                                  sizeof (waveInHeader1)); 
      if MMR <> MMSYSERR_NOERROR then 
        begin 
        FreeMem (Buffer1); FreeMem (Buffer2); 
        RecordBufferSize := 0; 
        CloseFile (RecordFile); 
        Application.MessageBox ('第一录音缓冲区准备出错。', '错误', MB_OK) 

        exit; 
        end;   waveInHeader2.lpData := Buffer2; 
      waveInHeader2.dwBufferLength := RecordBufferSize; 
      waveInHeader2.dwBytesRecorded := 0; 
      waveInHeader2.dwUser := 0; // 32 bits of user data 
      waveInHeader2.dwFlags := 0; 
      waveInHeader2.dwLoops := 0; 
      waveInHeader2.lpNext := nil; // reserved; must be zero 
      waveInHeader2.reserved := 0; // reserved; must be zero   MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader2), 
                                  sizeof (waveInHeader2)); 
      if MMR <> MMSYSERR_NOERROR then 
        begin 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof( 
    waveInHeader1)); 
        FreeMem (Buffer1); FreeMem (Buffer2); 
        RecordBufferSize := 0; 
        CloseFile (RecordFile); 
        Application.MessageBox ('第二录音缓冲区准备出错。', '错误', MB_OK) 

        exit; 
        end;   MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader1), sizeof ( 
    waveInHeader1)); 
      if MMR <> MMSYSERR_NOERROR then 
        begin 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof( 
    waveInHeader1)); 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof( 
    waveInHeader2)); 
        FreeMem (Buffer1); FreeMem (Buffer2); 
        RecordBufferSize := 0; 
        CloseFile (RecordFile); 
        Application.MessageBox ('添加第一缓冲区出错。', '错误', MB_OK); 
        exit; 
        end;   MMR := waveInAddBuffer (WaveInHandle, Addr (waveInHeader2), sizeof ( 
    waveInHeader2)); 
      if MMR <> MMSYSERR_NOERROR then 
        begin 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof( 
    waveInHeader1)); 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof( 
    waveInHeader2)); 
        FreeMem (Buffer1); FreeMem (Buffer2); 
        RecordBufferSize := 0; 
        CloseFile (RecordFile); 
        Application.MessageBox ('添加第二缓冲区出错。', '错误', MB_OK); 
        exit; 
        end; 
      TimerRecording.Enabled := true; 
      // Record has begun. 
      Recording := true;   MMR := waveInStart (waveInHandle); 
      if MMR <> MMSYSERR_NOERROR then 
        begin 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader1), sizeof( 
    waveInHeader1)); 
        waveInUnprepareHeader (waveInHandle, Addr (waveInHeader2), sizeof( 
    waveInHeader2)); 
        FreeMem (Buffer1); FreeMem (Buffer2); 
        RecordBufferSize := 0; 
        CloseFile (RecordFile); 
        Recording := false; 
        TimerRecording.Enabled := false; 
        Application.MessageBox ('未能开始录音。', '错误', MB_OK); 
        exit; 
        end;   // 应该在这里开始创建线程. 
      // 需要传递参数: RecordFile, Buffer1, Buffer2, 
      with TMediaRecordThread.Create (Addr(RecordFile), Buffer1, Buffer2)  
    do 
        OnTerminate := ThreadRecordStop;   // disable/enable controls 
      BtnCancel.Enabled := false; 
      BtnStart.Enabled := false; 
      GrpBoxChannel.Enabled := false; 
      LBFrequency.Enabled := false; 
      EditFrequency.Enabled := false; 
      LstBoxFrequency.Enabled := false; 
      GrpBoxSample.Enabled := false;   BtnStop.Enabled := true; end;