调用文件://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过去看吧。呵呵。
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过去看吧。呵呵。
参考资料:陈经韬(Lovejingtao.126.com) 和Delphi DirectX控件http://www.csdn.net/filebbs/read_topic.asp?id=487
Delphi DirectX控件上传不了
TACMwaveIn 录音用的(wav),在Exe会产生一个temp.wav文件。用来录音的数据
TACMWaveOut是放TACMWaveIn录入的声音的。TACMwavein有一人OnData事件,是录音时产生,如果你将它做成网络程序的话,就在这个程序中将这个Data: pointer,发送出去,这就是什么什么网络语音的功能了。
另外一端接收到后,用TACMWaveout.PlayBack这个就可放出声音来了。SaveStreamToWaveFile这函数可以将它转成正经八百的wave格式的文件,而另一个OpenWaveFileToStream是将wave转成它可以播放的格式流(用TACMWavein转成的wave,其它东东还不行。没做好)
http://www.csdn.net/expert/topic/499/499112.shtm
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]大家帮我看看,有的文件就能显示波形,有的不幸