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下錄制聲音通過
From:http://tw.wingwit.com/Article/program/Delphi/201311/24663.html