大家好:我现在在学习录音方面的知识,请教一个问题,怎样才能实现用一个简单的控件表示录音的时候话筒的音量?若有这方面的知识或代码请给点我帮助,非常感谢。

解决方案 »

  1.   

    用TtrackBar都可以啊。不过你要找相关的API实现读音量和设置音量
      

  2.   

    给你个类http://hi.baidu.com/chinacharis/blog/item/76197c2826a12af999250a07.html
    自己学习吧
      

  3.   


    unit SoundCap; interface 
    uses 
        Windows, Messages, MMSystem, Classes, SysUtils, Math, Forms,Dialogs, Controls,ExtCtrls; 
    type 
      TData8 = array [0..127] of byte; 
      PData8 = ^TData8; 
      TData16 = array [0..127] of smallint; 
      PData16 = ^TData16; 
      
      TSoundCap = Class(TCustomControl) 
      private 
      protected 
      public 
        FilterValve : Integer; //音频过滤的阀值 
        isCapture : boolean ; 
        MaxValue :integer; 
        constructor Create(handle : THandle); //overload; 
        destructor Destroy; override; 
        procedure OpenCapture(handle : THandle); 
        procedure CloseCapture; 
        procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;  //录音缓冲区满后,进行数据处理,将数据送到播放缓冲区 
        procedure StartCap; 
        procedure StopCap; 
      end; implementation 
    var 
      WaveIn: hWaveIn; 
      hBuf: THandle; 
      BufHead: TWaveHdr; 
      bufsize: integer; 
      Bits16: boolean; 
      stop: boolean = false; 
      StartTime : DWORD ; 
      Count : integer = 0; 
      header: TWaveFormatEx; 
    { TSoundCap } 
    //关闭音频捕捉 procedure TSoundCap.CloseCapture; 
    begin 
      if stop = false then 
        Exit; 
      stop := false; 
      while not stop do 
      Application.ProcessMessages; 
      stop := false; 
      WaveInReset(WaveIn);  // 停止声音输入设备工作 
      WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead)); 
      WaveInClose(WaveIn);  //停止声音输入 
      GlobalUnlock(hBuf); 
      GlobalFree(hBuf); 
    end; constructor TSoundCap.Create(handle: THandle); 
    begin 
      Inherited Create(nil); 
      ParentWindow := handle; 
      isCapture := false; 
      FilterValve := 3; 
    end; destructor TSoundCap.Destroy; 
    begin 
      inherited; 
      CloseCapture; 
    end; 
    //处理Wave数据采集 procedure TSoundCap.OnWaveIn(var Msg: TMessage);  //缓冲区数据已满则处理消息 
    var 
      data8 : PData8; 
      i, x, y : integer; 
      StartPos, EndPos, SCount : integer; 
      tmp : Integer; 
    begin 
      MaxValue := 0; 
      Data8 := PData8(PWaveHdr(Msg.lParam)^.lpData); 
      for i := 0 to BufSize - 1 do 
      Begin 
        x := i; 
        y := Round(abs(data8^[i] - 128) * 100 / 128); //data8^[i] 为 128 - 256 之间 
        tmp := Round(abs(data8^[i] - 128) * 100 / 128); 
        if tmp > MaxValue Then 
          MaxValue := tmp; 
      End; 
      if MaxValue = 1 then 
        MaxValue := 0; 
      Data8 := nil; 
      if stop then 
        WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam),SizeOf(TWaveHdr)) 
      else 
        stop := true; 
    end; 
    //打开音频捕捉 procedure TSoundCap.OpenCapture(handle: THandle); 
    var 
      BufLen: word; 
      buf: pointer; 
    begin 
      BufSize := 3 * 500 + 100; 
      Bits16 := false; 
      with header do 
      begin 
        wFormatTag := WAVE_FORMAT_PCM; 
        nChannels := 1; 
        nSamplesPerSec :=44100;// 22050; 
        wBitsPerSample := integer(Bits16) * 8 + 8; 
        nBlockAlign := nChannels * (wBitsPerSample div 8 ); 
        nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; 
        cbSize := 0; 
      end; 
      WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),self.Handle , 0, CALLBACK_WINDOW); 
      BufLen := header.nBlockAlign * BufSize; 
      hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen); //从全局内存堆中分配一块内存(该内存可移动并且可供应用程序共享),并返回该内存块的句柄 
      Buf := GlobalLock(hBuf);                    //锁定全局内存并返回指向该内存块的指针 
      with BufHead do 
      begin 
        lpData := Buf; 
        dwBufferLength := BufLen; 
        dwFlags := WHDR_BEGINLOOP; 
      end; 
      WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead)); //预备声音输入缓冲区 
      WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));    //向声音输入设备发送缓冲区 
      stop := true;                                                // 停止声音输入设备工作 
      WaveInStart(WaveIn); 
    end; 
    //开始监视捕捉 procedure TSoundCap.StartCap; 
    begin 
      isCapture := true; 
      StartTime := GetTickCount; 
    end; 
    //停止监视音频捕捉 procedure TSoundCap.StopCap; 
    begin 
      isCapture := false; 
    end; end. 
      

  4.   

    这是我一年前写的。调用很简单就
    var FSoundCap  : TSoundCap ;
    FSoundCap := TSoundCap.Create(handle);
    FSoundCap.Start;
    然后在一个定时器里取
    FSoundCap.MaxValue ;
    这个类写得不怎么好,没作修改,当时比较急用,所以也没怎么作优化
      

  5.   

    var FSoundCap  : TSoundCap ; 
    FSoundCap := TSoundCap.Create(handle); 
    FSoundCap.StartCap;
    FSoundCap.OpenCapture(Handle);
    加个progressbar 然后在定时器里写上
    progressbar.position := FSoundCap.MaxValue ;
    停止:
    SoundCap.CloseCapture;
    另外,还需要将录音设备的输入源选择相应的才可以,比如有 CD 唱机 麦克风,线路输入,单声道输出,波形输出混音,立体声混合等等,各种声卡的都不一样,只有你选择了相应的输入源时才能使用相应的设备