全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4037
推到 Plurk!
推到 Facebook!

請問如何寫錄音程式?

尚未結案
kimochi
一般會員


發表:6
回覆:6
積分:2
註冊:2002-11-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-10 16:34:20 IP:211.23.xxx.xxx 未訂閱
請問各位前輩: 需求: 想要錄出音效卡『所有』的聲音。 EX:可能播放CD、MP3、或DVD,想要寫一個程式,可以抓取音效卡出來的聲音 並將之錄成WAV格式。 請問這樣的需求要如何達成?是否有文章或程式可以參考?搜尋了網站文章及M$的API,大多為BCB的,有無DELPHI的?此外,我覺得對音效相關的架構不太清楚?有無書或網站可以參考。謝謝。
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-17 09:23:46 IP:211.96.xxx.xxx 未訂閱
你可以上google查詢關鍵字[mci command 錄音 delphi],會得到一堆答案,這是比較廣泛被應用的方法,當然,你也可以直接用directshow的方法來撰寫,一樣可以達到,directshow的優點,就是可以將錄下來的聲音或captuure卡上抓下來的動態影像,錄成mp3或mpeg1/4的電影格式,不需要經過mci錄成wav再轉壓成mp3或ogg格式,可大幅節省空間時間    有空的話,可以點我左邊的名字,看我的舊歷史討論,蠻多東西你可以參考的    這陣子我一有空就實現這個錄音作品放在共享區,如果你還肯等的話,我蠻混的 藏私の禁止
linmon416
一般會員


發表:11
回覆:44
積分:11
註冊:2003-12-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-02 10:17:16 IP:211.75.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-08 09:41:39 IP:211.75.xxx.xxx 未訂閱
kimochi你好: 不知我提供的方法,你試了沒,真的可以錄喔。
dg822
一般會員


發表:14
回覆:38
積分:10
註冊:2004-12-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-21 10:56:21 IP:203.198.xxx.xxx 未訂閱
我想录到一记忆体里,而不是一文档,那该怎么办?
dacshiu
一般會員


發表:3
回覆:5
積分:1
註冊:2007-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-10-02 03:43:41 IP:182.234.xxx.xxx 訂閱
這是修改成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(&wh),sizeof(TWavHeader),1,wf);
else
ShowMessage("Can't Open File");

fclose(wf);
[/code]
系統時間:2024-03-29 22:16:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!