請問如何寫錄音程式? |
尚未結案
|
kimochi
一般會員 ![]() ![]() 發表:6 回覆:6 積分:2 註冊:2002-11-02 發送簡訊給我 |
|
japhenchen
高階會員 ![]() ![]() ![]() ![]() 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
你可以上google查詢關鍵字[mci command 錄音 delphi],會得到一堆答案,這是比較廣泛被應用的方法,當然,你也可以直接用directshow的方法來撰寫,一樣可以達到,directshow的優點,就是可以將錄下來的聲音或captuure卡上抓下來的動態影像,錄成mp3或mpeg1/4的電影格式,不需要經過mci錄成wav再轉壓成mp3或ogg格式,可大幅節省空間時間 有空的話,可以點我左邊的名字,看我的舊歷史討論,蠻多東西你可以參考的 這陣子我一有空就實現這個錄音作品放在共享區,如果你還肯等的話,我蠻混的
|
linmon416
一般會員 ![]() ![]() 發表:11 回覆:44 積分:11 註冊:2003-12-19 發送簡訊給我 |
kimochi你好:
下面有個程式試試看(Delphi),是在k.top找的,而我的做法是打開一個flash,並執行此程式去錄flash的聲音,但在錄之前必須做一些設定,必須先執行縮在右下角的音量控制,選擇選項中的內容,選擇音量調整用於錄音,顯示下列音量控制,選擇你要的控制(會因音效卡的不同而有不同的選項),按確定,之後出現錄音控制畫面,此時我是把聲波輸出混音器選取,並調整其大小聲即可. 程序中,我們定義了一個Wav文件的文件與格式,錄音時先建立一個只有文件夾的Wav文件,然後將Mediaplayer1錄制下來的聲音寫入文件。其中CreateWav過程的幾個參數意義如下:第一個channels代表聲道,取1時代表單聲,取2時代表立體聲。resolution也只有兩個值可以選擇,取8時代表8位聲音,取16時代表16位聲音,rate則代表聲音頻率,如11025,22050, 44100。值越大則聲音越清晰,當然,所錄制的文件也越大。最後一個參數則代表對應的文件名稱。所以CreateWav可以有以下形式: CreateWav(1,8,11025,'C:\abc.wav');//在C根目錄下建立一個8位單聲頻率為11025的名稱abc.wav的Wav文件
CreateWav(2,16,44100,'C:\abc.wav');//在C根目錄下建立一個16位立體聲頻率為44100的名稱abc.wav的Wav文件
unit Unit1; 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; TForm1 = class(TForm) MediaPlayer1: 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 Form1: TForm1; implementation {$R *.DFM} procedure TForm1.CreateWav( channels : word; { 1(單聲)或2(立體聲) } resolution : word; { 8或16,代表8位或16位聲音 } rate : longint; { 聲音頻率,如11025,22050, 44100} fn : string { 對應的文件名稱 } ); var wf : file of TWavHeader; wh : TWavHeader; begin wh.rId := $46464952; wh.rLen := 36; wh.wId := $45564157; wh.fId := $20746d66; wh.fLen := 16; wh.wFormatTag := 1; wh.nChannels := channels; wh.nSamplesPerSec := rate; wh.nAvgBytesPerSec := channels*rate*(resolution div 8); wh.nBlockAlign := channels*(resolution div 8); wh.wBitsPerSample := resolution; wh.dId := $61746164; wh.wSampleLength := 0; assignfile(wf,fn); {打開對應文件} rewrite(wf); {移動指標到文件夾} write(wf,wh); {寫入文件夾} closefile(wf); {關閉文件} end; procedure TForm1.BtStartClick(Sender: TObject); begin try //在程序當前目錄下建立一個Wav文件Temp.wav CreateWav(1, 8, 11025, (ExtractFilePath(Application.ExeName) 'Temp.wav')); MediaPlayer1.DeviceType := dtAutoSelect; MediaPlayer1.FileName := (ExtractFilePath(Application.ExeName) 'Temp.wav'); MediaPlayer1.Open; MediaPlayer1.StartRecording; BtStart.Enabled:=false; BtStop.Enabled:=true; except BtStart.Enabled:=True; BtStop.Enabled:=false; Application.MessageBox('媒体設備初始化失敗!','錯誤',MB_ICONERROR MB_OK); end; end; procedure TForm1.BtStopClick(Sender: TObject); begin try MediaPlayer1.Stop; MediaPlayer1.Save; MediaPlayer1.Close; Application.MessageBox('聲音錄制完畢!','成功',MB_ICONINFORMATION MB_OK); BtStart.Enabled:=True; BtStop.Enabled:=false; except Application.MessageBox('保存聲音文件出錯!','錯誤',MB_ICONERROR MB_OK); BtStart.Enabled:=True; BtStop.Enabled:=false; end; end; end.補充:1、錄制的文件播放時可能要把音頻屬性的Wav調大。 2、如果系統安裝了其它一些音頻驅動程式,則可能錄制的Wav文件大小為零,但會同時生成一個TMP結尾的文件,將其更名為Wav就是錄制的聲音檔。但這種情況很少發生。(機會幾乎為0) |
linmon416
一般會員 ![]() ![]() 發表:11 回覆:44 積分:11 註冊:2003-12-19 發送簡訊給我 |
|
dg822
一般會員 ![]() ![]() 發表:14 回覆:38 積分:10 註冊:2004-12-16 發送簡訊給我 |
|
dacshiu
一般會員 ![]() ![]() 發表:3 回覆:5 積分:1 註冊:2007-05-09 發送簡訊給我 |
這是修改成BCB版本
[code cpp] struct TWavHeader{ long int rld; long int rLen; //rLen : longint; long int wId; //wId : longint; long int fId; //fId : longint; long int fLen; //fLen : longint; Word wFormatTag; //wFormatTag : word; Word nChannels; //nChannels : word; long int nSamplesPerSec; //nSamplesPerSec : longint; long int nAvgBytesPerSec; //nAvgBytesPerSec : longint; Word nBlockAlign ; //nBlockAlign : word; Word wBitsPerSample; //wBitsPerSample : word; long int dId; //dId : longint; long int wSampleLength; //wSampleLength : longint; }; void CreateWave(Word channels, Word resolution, long int rate, String fn){ FILE *wf; TWavHeader wh; wh.rld = 0x46464952; //wh.rId := $46464952; wh.rLen = 36; wh.wId = 0x45564157; wh.fId = 0x20746d66; wh.fLen = 16; wh.wFormatTag = 1; wh.nChannels = channels; wh.nSamplesPerSec = rate; wh.nAvgBytesPerSec = channels * rate * (resolution / 8); wh.nBlockAlign = channels*(resolution / 8); wh.wBitsPerSample = resolution; wh.dId = 0x61746164; wh.wSampleLength = 0; wf = fopen(fn.c_str(), "wb"); if(wf != NULL) fwrite(reinterpret_cast else ShowMessage("Can't Open File"); fclose(wf); [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |