调用文件://project1.dpr
program Project1;uses
  Forms,
  Unit2 in 'Unit2.pas' {Form2},
  MyRecord in 'MyRecord.pas';{$R *.RES}begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.//unit2.pas
unit Unit2;interface//{$WARN SYMBOL_PLATFORM OFF}
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, MyRecord, MMSystem, MPlayer, ComCtrls, Wave;type
  TForm2 = class(TForm)
    Button9: TButton;
    Button10: TButton;
    GroupBox1: TGroupBox;
    Button1: TButton;
    Button3: TButton;
    Button4: TButton;
    GroupBox2: TGroupBox;
    Button2: TButton;
    Button6: TButton;
    Button7: TButton;
    Button5: TButton;
    Button8: TButton;
    Button11: TButton;
    Button12: TButton;
    Edit1: TEdit;
    Button13: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button13Click(Sender: TObject);
  private
    FFileName: string;
    FWaveIn: TACMWaveIn;
    FWaveOut: TACMWaveOut;
    FWaveStream: TFileStream;
    procedure WriteWaveData(Data: Pointer; Count: Integer);
    { Private declarations }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public declarations }
  end;var
  Form2: TForm2;implementation
{$R *.DFM}procedure TForm2.Button1Click(Sender: TObject);
begin
  FWaveIn.Active := True;
end;const
  OpenType: array [Boolean] of Integer = (fmCreate, fmOpenReadWrite or fmShareDenyWrite);constructor TForm2.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FFileName := ExtractFilePath(ParamStr(0)) + 'Temp.wav';
  FWaveIn := TACMWaveIn.Create(Self);
  FWaveIn.OnData := WriteWaveData;
  FWaveOut := TACMWaveOut.Create(Self);
  FWaveStream := TFileStream.Create(FFileName, OpenType[FileExists(FFileName)]);
end;destructor TForm2.Destroy;
begin
  FWaveStream.Free;
  inherited Destroy;
end;procedure TForm2.WriteWaveData(Data: Pointer; Count: Integer);
begin
  FWaveStream.Position := FWaveStream.Size;
  if FWaveStream.Write(Data^, Count) <> Count then
    ShowMessage('不能写入文件流中');
end;procedure TForm2.Button2Click(Sender: TObject);
var
  Buffer: Pointer;
  RetVal: Integer;
begin
  with TFileStream.Create(FFileName, fmShareDenyNone) do
  try
    FWaveOut.Active := True;
    Position := 0;
    GetMem(Buffer, Size);
    RetVal := Read(Buffer^, Size);
    FWaveOut.PlayBack(Buffer, RetVal);
    FreeMem(Buffer);
  finally
    Free
  end;
end;procedure TForm2.Button3Click(Sender: TObject);
begin
  FWaveStream.Free;
  FWaveStream := TFileStream.Create(FFileName, OpenType[FileExists(FFileName)]);
end;procedure TForm2.Button4Click(Sender: TObject);
begin
  FWaveIn.Close;  
end;procedure TForm2.Button5Click(Sender: TObject);
begin
  FWaveOut.Close;
end;procedure TForm2.Button6Click(Sender: TObject);
begin
  FWaveOut.Pause;
end;procedure TForm2.Button7Click(Sender: TObject);
begin
  FWaveOut.ReStart;
end;function Step: DWORD;
begin
  Step := MakeLong(1000, 1000);
end;procedure TForm2.Button9Click(Sender: TObject);
begin
  FWaveOut.Volume := FWaveOut.Volume - Step;
end;procedure TForm2.Button10Click(Sender: TObject);
begin
  FWaveOut.Volume := FWaveOut.Volume + Step;
end;procedure TForm2.Button8Click(Sender: TObject);
begin
  FWaveIn.Stop;
end;procedure TForm2.Button11Click(Sender: TObject);
begin
  FWaveIn.Start;
end;procedure TForm2.Button12Click(Sender: TObject);
begin
  SaveStreamToWaveFile(Edit1.Text, FWaveIn.Format, FWaveStream);
end;procedure TForm2.Button13Click(Sender: TObject);
var
  FileStream: TMemoryStream;
  Temp, Format: TWaveFormatEx;
begin
  Temp := FWaveOut.Format;
  FileStream := TMemoryStream.Create;
  try
    OpenWaveFileToStream(Edit1.Text, Format, FileStream);
    if FileStream.Size = 0 then Exit;
    FWaveOut.Format := Format;
    FWaveOut.Open;
    FWaveOut.PlayBack(FileStream.Memory, FileStream.Size);
  finally
    FWaveOut.Format := Temp;
    FileStream.Free;
  end;
end;end.
//unit2.dfm
object Form2: TForm2
  Left = 192
  Top = 106
  Width = 515
  Height = 264
  Caption = 'Form2'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Button9: TButton
    Left = 16
    Top = 144
    Width = 75
    Height = 25
    Caption = 'Volume  -'
    TabOrder = 0
    OnClick = Button9Click
  end
  object Button10: TButton
    Left = 96
    Top = 144
    Width = 75
    Height = 25
    Caption = 'Volume +'
    TabOrder = 1
    OnClick = Button10Click
  end
  object GroupBox1: TGroupBox
    Left = 0
    Top = 0
    Width = 507
    Height = 57
    Align = alTop
    Caption = 'WaveIn'
    TabOrder = 2
    object Button1: TButton
      Left = 16
      Top = 24
      Width = 65
      Height = 25
      Caption = 'Record'
      TabOrder = 0
      OnClick = Button1Click
    end
    object Button3: TButton
      Left = 368
      Top = 24
      Width = 121
      Height = 25
      Caption = 'RecordStream Save file'
      TabOrder = 1
      OnClick = Button3Click
    end
    object Button4: TButton
      Left = 96
      Top = 24
      Width = 65
      Height = 25
      Caption = 'Close'
      TabOrder = 2
      OnClick = Button4Click
    end
    object Button8: TButton
      Left = 176
      Top = 24
      Width = 75
      Height = 25
      Caption = 'Stop'
      TabOrder = 3
      OnClick = Button8Click
    end
    object Button11: TButton
      Left = 272
      Top = 24
      Width = 75
      Height = 25
      Caption = 'Restart'
      TabOrder = 4
      OnClick = Button11Click
    end
  end
  object GroupBox2: TGroupBox
    Left = 0
    Top = 57
    Width = 507
    Height = 64
    Align = alTop
    Caption = 'WaveOut'
    TabOrder = 3
    object Button2: TButton
      Left = 8
      Top = 23
      Width = 73
      Height = 25
      Caption = 'Open'
      TabOrder = 0
      OnClick = Button2Click
    end
    object Button6: TButton
      Left = 192
      Top = 23
      Width = 75
      Height = 25
      Caption = 'Pause'
      TabOrder = 1
      OnClick = Button6Click
    end
    object Button7: TButton
      Left = 288
      Top = 23
      Width = 75
      Height = 25
      Caption = 'Restart'
      TabOrder = 2
      OnClick = Button7Click
    end
    object Button5: TButton
      Left = 96
      Top = 23
      Width = 81
      Height = 25
      Caption = 'Close'
      TabOrder = 3
      OnClick = Button5Click
    end
  end
  object Button12: TButton
    Left = 232
    Top = 128
    Width = 193
    Height = 25
    Caption = 'SaveStreamToWaveFile'
    TabOrder = 4
    OnClick = Button12Click
  end
  object Edit1: TEdit
    Left = 232
    Top = 160
    Width = 249
    Height = 21
    TabOrder = 5
    Text = 'c:\temp\temp.wav'
  end
  object Button13: TButton
    Left = 232
    Top = 192
    Width = 193
    Height = 25
    Caption = 'Button13'
    TabOrder = 6
    OnClick = Button13Click
  end
end
那开发文档上传不了,各位copy过去看吧。呵呵。

解决方案 »

  1.   

    发觉我真很不喜欢写注释,如有不懂再说吧。呵呵。
    参考资料:陈经韬(Lovejingtao.126.com) 和Delphi DirectX控件http://www.csdn.net/filebbs/read_topic.asp?id=487
    Delphi DirectX控件上传不了
      

  2.   

    哦,哈哈我忘了说它的作用了
    TACMwaveIn 录音用的(wav),在Exe会产生一个temp.wav文件。用来录音的数据
    TACMWaveOut是放TACMWaveIn录入的声音的。TACMwavein有一人OnData事件,是录音时产生,如果你将它做成网络程序的话,就在这个程序中将这个Data: pointer,发送出去,这就是什么什么网络语音的功能了。
    另外一端接收到后,用TACMWaveout.PlayBack这个就可放出声音来了。SaveStreamToWaveFile这函数可以将它转成正经八百的wave格式的文件,而另一个OpenWaveFileToStream是将wave转成它可以播放的格式流(用TACMWavein转成的wave,其它东东还不行。没做好)
      

  3.   

    新的在:
    http://www.csdn.net/expert/topic/499/499112.shtm
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls;type  TPCMWaveHeader = record    rID : array[0..3] of char; // 'RIFF' 标志    rLen : longint;            // 文件长度    wID : array[0..3] of char; // 'WAVE' 标志    fId : array[0..3] of char; // 'fmt '标志   以空格结束(fID[3]:=Chr($20);)    fLen : longint;            // 过度字节(不定)    wFormatTag : word;         // 格式字节(过度字节为PCM形式的声音数据)    nChannels : word;          // 通道数 单声道=1, 双声道=2 }    nSamplesPerSec : longint;  // 采样频率 (每秒样本数),表示每个通道的播放速度    nAvgBytesPerSec : longint; // 波形音频数据传送速度(值:通道数X每秒数据位数X每
                                   //    样本的数据位数/8。播放软件利用根据此值估计缓
                                   //    冲区的大小)    nBlockAlign : word;        // 数据块的调整数(按字节计算),值为通道数*没样本的数据位值/8。
                                   //    播放软件需要一次处理多个该值大小的字节数据,以便
                                   //    将其值用于缓冲区的调整。    nBitsPerSample : word;     // 每样本数据位数,表示每个声道中各个样本的数据位
                                   //    数。如果有多个声道,对每个声道而言,样本大
                                   //    小都一样 8 or 16    dId : array[0..3]of char;  // 'data' 标志    dLen : longint;            // 语音数据长度  end;  TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Button2: TButton;
        Button3: TButton;
        Image1: TImage;
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        filename:string;
        pcm:TPCMWaveHeader;
        Data:TByteArray;
        procedure PrintPcm;
        procedure PrintData;
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      
    implementation
    {$R *.DFM}procedure TForm1.PrintPcm;
    begin
      memo1.lines.add('FileName:'+Filename);
      memo1.lines.add('RIFF:'+pcm.rID);
      memo1.lines.add('RLEN:'+inttostr(pcm.rLen));
      memo1.lines.add('WAVE:'+pcm.wID);
      memo1.lines.add('fmt:'+pcm.fId);
      memo1.lines.add('Fixed:'+inttostr(pcm.fLen));
      memo1.lines.add('wFormatTag:'+inttostr(pcm.wFormatTag));
      memo1.lines.add('nChannels:'+inttostr(pcm.nChannels));
      memo1.lines.add('nSamplesPerSec:'+inttostr(pcm.nSamplesPerSec));
      memo1.lines.add('nAvgBytesPerSec:'+inttostr(pcm.nAvgBytesPerSec));
      memo1.lines.add('nBlockAlign:'+inttostr(pcm.nBlockAlign));
      memo1.lines.add('nBitsPerSample:'+inttostr(pcm.nBitsPerSample));
      memo1.lines.add('dLen:'+inttostr(pcm.dLen));
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      iFileHandle: Integer;
      iFileLength: Integer;
      iBytesRead: Integer;
      Buffer: PChar;
      i, Size: Integer;
    begin
      iFileHandle := FileOpen(filename, fmOpenRead);
      iFileLength := FileSeek(iFileHandle, 0, 2) - FileSeek(iFileHandle, 0, 0);
      Buffer := PChar(AllocMem(iFileLength + 1));
      iBytesRead := FileRead(iFileHandle, Buffer^, iFileLength); //把文件读到buffer
      FileClose(iFileHandle);
      Move((Buffer)^, pcm, sizeof(pcm));
      Move((Buffer+sizeof(pcm))^, Data, pcm.dLen);
      printpcm; //显示头信息
      printData; //画波形图
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      filename:='c:SOUND108.WAV';
    end;procedure TForm1.PrintData;
    var
      i:Integer;
    begin
      for i:=0 to pcm.dLen -1 do begin
        //memo1.lines.add(inttostr(Data[i]));
        Canvas.LineTo(i,Data[i])
      end;
    end;end. Liren zhao 2002-06-14 beijingEmail:[email protected]大家帮我看看,有的文件就能显示波形,有的不幸