Delphi是Inprise(前Borland)公司的优秀的可视化编程工具它自带的Mediaplayer控件是开发多媒体的利器用它几分钟就可以做出一个象解霸一样可以播放多媒体文件的程序来但可能很少人知道用它也可以做一个录音程序
运行Delphi在System页拖一个Mediaplayer控件到窗体上默认名为Mediaplayer由于我们的程序是采用自己的按钮所以将Mediaplayer的Visible属性设置为False其它属性保持默认值再放两个按钮Button和ButtonButton的属性Name改为BtStartCaption改为开始录音 Button的属性Name改为BtStopCaption改为停止录音Enabled属性改为False然后切换窗口到代码窗口开始书写代码
程序中我们定义了一个Wav文件的文件头格式录音时先创建一个只有文件头的Wav文件然后将Mediaplayer录制下来的声音写进文件其中CreateWav过程的几个参数意义如下第一个channels代表声道取时代表单声取时代表立体声resolution也只有两个值可以选择取时代表位声音取时代表位声音rate则代表声音频率如 值越大则声音越清晰当然所录制的文件也越大最后一个参数则代表对应的文件名称了所以CreateWav可以有以下形式
CreateWav(Cabcwav)//在C盘根目录下创建一个位单声道频率为的名为abcwav的Wav文件
CreateWav(Cabcwav)//在C盘根目录下创建一个位立体声道频率为的名为abcwav的Wav文件
外国一个很出名的用Delphi编写的远程控制软件Netbus有一个声音监听功能就是用本文的方法写的它先把对方的声音录制下来然后传送回来达到监听对方的目的当然前提是对方必须安装有话筒否则监听到的是对方播放的声音(如打开解霸或者Readplay播放运行本程序就可以把播放的声音录制下来了)
实际上现在的网络声音传播技术已经发展到一定阶段语音对讲和IP电话等也开始成熟不过它们采用的是VOX格式或者ACM格式具体代码可以在我的主页下载但如果对VOX或者ACM格式不熟悉的朋友也可以用本文的方法来制作自己的录音机至于如何调用系统自带的avifildll来进行网络视频播放在有机会时再跟大家交流吧
本程序在Pwin+Delphi下通过
unit Unit;
interface
uses
Windows Messages SysUtils Classes Graphics Controls Forms Dialogs
StdCtrls MPlayer;
type
TWavHeader = record //定义一个Wav文件头格式
rId : longint;
rLen : longint;
wId : longint;
fId : longint;
fLen : longint;
wFormatTag : word;
nChannels : word;
nSamplesPerSec : longint;
nAvgBytesPerSec : longint;
nBlockAlign : word;
wBitsPerSample : word;
dId : longint;
wSampleLength : longint;
end;
TForm = class(TForm)
MediaPlayer: TMediaPlayer;
BtStart: TButton;
BtStop: TButton;
procedure CreateWav(channels : word; resolution : word; rate : longint; fn : string);//自定义写一个Wav文件头过程
procedure BtStartClick(Sender: TObject);
procedure BtStopClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form: TForm;
implementation
{$R *DFM}
procedure TFormCreateWav( channels : word; { (单声)或者(立体声) }
resolution : word; { 或者代表位或位声音 }
rate : longint; { 声音频率如 }
fn : string { 对应的文件名称 } );
var
wf : file of TWavHeader;
wh : TWavHeader;
begin
whrId := $;
whrLen := ;
whwId := $;
whfId := $d;
whfLen := ;
whwFormatTag := ;
whnChannels := channels;
whnSamplesPerSec := rate;
whnAvgBytesPerSec := channels*rate*(resolution div );
whnBlockAlign := channels*(resolution div );
whwBitsPerSample := resolution;
whdId := $;
whwSampleLength := ;
assignfile(wffn); {打开对应文件 }
rewrite(wf); {移动指针到文件头}
write(wfwh); {写进文件头 }
closefile(wf); {关闭文件 }
end;
procedure TFormBtStartClick(Sender: TObject);
begin
try
//在程序当前目录下创建一个Wav文件Tempwav
CreateWav( (ExtractFilePath(ApplicationExeName)+ Tempwav));
MediaPlayerDeviceType := dtAutoSelect;
MediaPlayerFileName := (ExtractFilePath(ApplicationExeName)+ Tempwav);
MediaPlayerOpen;
MediaPlayerStartRecording;
BtStartEnabled:=false;
BtStopEnabled:=true;
except
BtStartEnabled:=True;
BtStopEnabled:=false;
ApplicationMessageBox(媒体设备初始化失败!错误MB_ICONERROR+MB_OK);
end;
end;
procedure TFormBtStopClick(Sender: TObject);
begin
try
MediaPlayerStop;
MediaPlayerSave;
MediaPlayerClose;
ApplicationMessageBox(声音录制完毕!信息MB_ICONINFORMATION+MB_OK);
BtStartEnabled:=True;
BtStopEnabled:=false;
except
ApplicationMessageBox(保存声音文件出错!错误MB_ICONERROR+MB_OK);
BtStartEnabled:=True;
BtStopEnabled:=false;
end;
end;
end
补充录制的文件播放时可能要把音频属性的Wav调大
如果系统安装了其它一些音频驱动程序则可能录制的Wav文件大小为零但会同时生成一个TMP结尾的文件将其扩展名改为Wav就是录制的声音文件但这种情况很少发生(机会几乎为零^^)
本程序在运行解霸和Replayer下录制声音通过