明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

C++ Builder操縱多媒體數(shù)據(jù)庫

[摘要]隨著計算機(jī)軟、硬件技術(shù)的日益發(fā)展,對多媒體信息的處理能力不斷增強(qiáng),利用快速開發(fā)工具C++ Builder所具有的強(qiáng)大數(shù)據(jù)庫開發(fā)功能,使得對多媒體數(shù)據(jù)(庫)的創(chuàng)建、存、取、顯示、播放等控制都非常容易實(shí)...
隨著計算機(jī)軟、硬件技術(shù)的日益發(fā)展,對多媒體信息的處理能力不斷增強(qiáng),利用快速開發(fā)工具C++ Builder所具有的強(qiáng)大數(shù)據(jù)庫開發(fā)功能,使得對多媒體數(shù)據(jù)(庫)的創(chuàng)建、存、取、顯示、播放等控制都非常容易實(shí)現(xiàn)。本文將以構(gòu)建具有5個字段“編號、姓名、像片、聲音、活動影像”的數(shù)據(jù)庫為例,根據(jù)多媒體數(shù)據(jù)與數(shù)據(jù)庫本身是否共同存儲,介紹兩種多媒體數(shù)據(jù)庫處理方法,在這里稱為集成法和分離法。

集成法

此方法是將多媒體數(shù)據(jù)直接存入數(shù)據(jù)庫中,“編號”和“姓名”字段都取ftString字段類型,“像片”字段采用ftGraphic字段類型用于存放BMP文件,“聲音”和“活動影像”字段均采用ftBlob字段類型(其他格式的多媒體文件均可以采用這種二進(jìn)制類型存儲),分別用于存放WAV和AVI文件,這樣的數(shù)據(jù)庫結(jié)構(gòu)既可以采用C++ Builder提供的“Database Desktop”創(chuàng)建,也可以用下面的代碼創(chuàng)建:

TTable *newTable = new TTable(this);

newTable->Active = false;

newTable->DatabaseName = “e:\\mydata”;

newTable->TableName = “example1.db”;

newTable->TableType = ttParadox;

//定義數(shù)據(jù)表類型

newTable->FieldDefs->Clear();

newTable->FieldDefs->Add(“編號”,ftString,8,false); //定義字段、類型、長度等

newTable->FieldDefs->Add(“姓名”,ftString,8,false);

newTable->FieldDefs->Add(“像片”,ftGraphic,0,false);

newTable->FieldDefs->Add(“聲音”,ftBlob,0,false);

newTable->FieldDefs->Add(“數(shù)字電影”,ftBlob,0,false);

newTable->CreateTable(); //創(chuàng)建數(shù)據(jù)表

delete newTable;

由于要編程實(shí)現(xiàn)往數(shù)據(jù)庫中添加記錄的功能,因此假定在數(shù)據(jù)庫程序設(shè)計階段數(shù)據(jù)表example1

.db已經(jīng)建好,同時假定所需要的多媒體文件均存放于e:\mydata\media路徑之下。

所要完成的程序的功能界面如圖1所示:  

圖 1 操作界面

點(diǎn)擊“打開數(shù)據(jù)庫”按鈕將打開庫文件example1.db并顯示原有記錄的相應(yīng)信息。點(diǎn)擊“增加記錄”按鈕將追加新的記錄,通過數(shù)據(jù)導(dǎo)航按鈕進(jìn)行記錄的移動、修改等操作,在每一時刻,點(diǎn)擊“聽聽聲”按鈕可以聽到當(dāng)前記錄所對應(yīng)的聲音,點(diǎn)擊“看看影”按鈕可以看到當(dāng)前記錄對應(yīng)的活動影像。這個應(yīng)用已具備一個多媒體數(shù)據(jù)庫應(yīng)用系統(tǒng)的基本功能,以下是主要設(shè)計步驟:

1. 組件設(shè)置

向窗體增加一個TTable組件Table1,一個TDataSource組件DataSource1,兩個TDBEdit組件DBEdit1和DBEdit2,一個TDBImage組件DBImage1,一個TDBNavigator組件DBNavigator1,一個TMediaPlayer組件MediaPlayer1,一個TOleContainer組件OleContainer1,四個TButton組件和三個TLable組件。這些組件需要設(shè)置的部分屬性如下表:

作者:
來自:計算機(jī)世界網(wǎng)

注: 表中標(biāo)記“▲”的幾個屬性表示只有數(shù)據(jù)表example1.db已經(jīng)存在,才能在設(shè)計階段進(jìn)行設(shè)置。

2. 創(chuàng)建字段變量

雙擊窗體的Table1組件,在彈出的 “Form1->Table1” 小窗口的空白處單擊鼠標(biāo)右鍵,選擇“Add Fields...”菜單命令,然后選中“像片、聲音、活動影像”三個字段,點(diǎn)擊OK按鈕;氐健癋orm1->Table1”小窗口,選中“圖片”,將其Name屬性修改為Table1BMPField。類似地將“聲音”和“活動影像”的Name屬性分別修改為Table1WAVField和Table1AVIField,這樣就創(chuàng)建了對應(yīng)的字段變量,利用它們就可以動態(tài)地向相應(yīng)字段中存入多媒體數(shù)據(jù)了(如果數(shù)據(jù)表example1.db不存在,應(yīng)該選擇“New Fields...”菜單命令創(chuàng)建,這樣做必須創(chuàng)建所有的字段,較為麻煩)。

3. 代碼設(shè)計

“打開數(shù)據(jù)庫”按鈕的OnClick事件過程代碼如下:

void __fastcall TForm1::Button1Click(TObject *Sender)

{ Table1->DatabaseName = “e:\\mydata”;

Table1->TableName = “example1.db”;

Table1->Active = true; //打開數(shù)據(jù)表

}

在“增加記錄”按鈕的OnClick的事件過程中輸入代碼:

void __fastcall TForm1::Button2Click(TObject *Sender)

{ Table1->DatabaseName = “e:\\mydata”;

Table1->TableName = “example1.db”;

Table1->Active = true;

Table1->AppendRecord(OPENARRAY(TVarRec,(“20010521”,“劉德友”)));

//增加一條記錄

Table1->Edit( ); //進(jìn)入編輯狀態(tài)

Table1BMPField->LoadFromFile(“\\media\\ldy.bmp”);

//將圖片文件載入像片字段

Table1WAVField->LoadFromFile(“\\media\\ldy.wav”);

//將聲音文件載入聲音字段

Table1AVIField->LoadFromFile(“\\media\\ldy.avi”);

//將電影文件載入活動影像字段

Table1->AppendRecord(OPENARRAY(TVarRec,(“20010522”,“王英”)));

//增加第二條記錄

Table1->Edit( );

Table1BMPField->LoadFromFile(“\\media\\wy.bmp”);

Table1WAVField->LoadFromFile(“\\media\\wy.wav”);

Table1AVIField->LoadFromFile(“\\media\\wy.avi”);

Table1->AppendRecord(OPENARRAY(TVarRec,(“20010523”,“張雪花”)));

//添加第三條記錄

Table1->Edit( );

Table1BMPField->LoadFromFile(“\\media\\zxh.bmp”);

Table1WAVField->LoadFromFile(“\\media\\zxh.wav”);

Table1AVIField->LoadFromFile(“\\media\\zxh.avi”);

}

用類似的語句可以添加多條記錄。顯然,若需要其他格式的多媒體數(shù)據(jù)文件也可用此法,作為二進(jìn)制文件將其存入數(shù)據(jù)庫。如果利用TOpenDialog組件則能夠在運(yùn)行過程中實(shí)現(xiàn)“動態(tài)”加載多媒體數(shù)據(jù)文件到相應(yīng)字段。

按鈕“聽聽聲”的OnClick事件過程的代碼如下:

void __fastcall TForm1::Button3Click(TObject *Sender)

{ AnsiString waveName = “temp.wav”;

Table1WAVField-> SaveToFile(waveName);

//存成臨時文件

Sleep(50); //作為緩沖,暫停50毫秒


MediaPlayer1->FileName = waveName;

MediaPlayer1->Open();

MediaPlayer1->Play();

}

按鈕“看看影”的OnClick事件過程的代碼如下:

void __fastcall TForm1::Button4Click(TObject *Sender)

{ AnsiString aviName = “temp.avi”;

Table1AVIField->SaveToFile(aviName);

Sleep(50);

OleContainer1->CreateLinkToFile(aviName,false);

OleContainer1->DoVerb(ovPrimary);

}

注意這里使用TOleContainer1組件實(shí)現(xiàn)AVI播放,當(dāng)然也可以用MediaPlayer1組件進(jìn)行播放,此處只是提供了一種方法:利用軟件的OLE技術(shù)對一些特殊格式的多媒體數(shù)據(jù)文件采用TOleContainer處理,例如DOC、PSD、DWG、SWF等,只要目標(biāo)計算機(jī)安裝了該軟件的服務(wù)程序(想知道計算機(jī)支持哪些格式媒體文件只要在Word軟件中查看“插入——>對象...”菜單便知),筆者利用此技術(shù)成功地實(shí)現(xiàn)了Flash動畫存儲和播放(已裝有Flash 5)。當(dāng)然也可使用第三方開發(fā)的組件或控件,C++ Builder也支持OCX控件,例如利用MP3Play控件實(shí)現(xiàn)MP3的播放。

至此,一個小型的多媒體數(shù)據(jù)庫系統(tǒng)用“集成法”創(chuàng)建完成。

分離法

這種方法就是將多媒體數(shù)據(jù)與數(shù)據(jù)庫分開存放。在數(shù)據(jù)庫中相應(yīng)的字符字段只存放該多媒體數(shù)據(jù)的文件名,它是數(shù)據(jù)庫與數(shù)據(jù)之間的“接口”。這種情況下數(shù)據(jù)庫結(jié)構(gòu)可以在運(yùn)行中動態(tài)創(chuàng)建,因此可在功能界面上(功能界面上的其他部分與圖1完全相同)再增加一個按鈕“創(chuàng)建數(shù)據(jù)庫結(jié)構(gòu)”并在其OnClick事件過程置入如下代碼:

void __fastcall TForm1::Button5Click(TObject *Sender)

{ TTable *newTable = new TTable(this);

newTable->Active = false;

newTable->DatabaseName =“e:\\mydata”;

newTable->TableName = “example2.db”;

newTable->TableType = ttParadox;

newTable->FieldDefs->Clear();

newTable->FieldDefs->Add(“編號”,ftString,8,false);

//字段均為字符型

newTable->FieldDefs->Add(“姓名”,ftString,8,false);

newTable->FieldDefs->Add(“像片”,ftString,12,false);

newTable->FieldDefs->Add(“聲音”,ftString,12,false);

newTable->FieldDefs->Add(“活動影像”,ftString,12,false);

newTable->CreateTable();

delete newTable;

}

由于允許動態(tài)創(chuàng)建庫結(jié)構(gòu),組件Table1的DatabaseName屬性和DBEdit1、DBEdit2的DataField屬性用代碼進(jìn)行設(shè)置。因?yàn)椤跋衿弊侄未娣诺闹皇瞧湮募,所以組件DBImage1用Image1組件代替。這時,只需將“打開數(shù)據(jù)庫”按鈕的OnClick事件過程修改為:

void __fastcall TForm1::Button1Click(TObject *Sender)

{ Table1->DatabaseName = “e:\\mydata”;

Table1->TableName = “example2.db”;

DBEdit1->DataField = “編號”;

DBEdit2->DataField = “姓名”;

Table1->Active = true;

Image1->Picture->LoadFromFile(Table1->DatabaseName + “\\media\\” + Table1->FieldByName(“像片”)->AsString);

}

將“增加記錄”按鈕的OnClick事件過程修改為:

void __fastcall TForm1::Button2Click(TObject *Sender)

{ Table1->Active = false;

Table1->DatabaseName = “e:\\mydata”;

Table1->TableName = “example2.db”;

Table1->Active = true;

Table1->AppendRecord(OPENARRAY(TVarRec,(“20010521”,“劉德友”,“l(fā)dy.bmp”,“l(fā)dy.wav”,“l(fā)dy.avi”)));

Table1->AppendRecord(OPENARRAY(TVarRec,(“20010522”,“王英”,“wy.bmp”,“wy

.wav”,“wy.avi”)));

Table1->AppendRecord(OPENARRAY(TVarRec,(“20010523”,“張學(xué)華”,“zxh.bmp”,“zxh.wav”,“zxh.avi”)));

Table1->First();

//記錄指針移到數(shù)據(jù)表首條記錄

Image1->Picture->LoadFromFile(Table1->DatabaseName + “\\media\\”+Table1->FieldByName(“像片”)->AsString);

}

將“聽聽聲”按鈕的OnClick事件過程修改為:

void __fastcall TForm1::Button3Click(TObject *Sender)

{ AnsiString wavName = Table1->DatabaseName + “\\media\\” + Table1->FieldByName(“聲音”)->AsString;

MediaPlayer1->FileName = wavName;

MediaPlayer1->Open();

MediaPlayer1->Play();

}

將“看看影”按鈕的OnClick事件過程修改為:

void __fastcall TForm1::Button4Click(TObject *Sender)

{ AnsiString aviName = Table1->DatabaseName + “\\media\\” + Table1->FieldByName(“活動影像”)->AsString;

OleContainer1->CreateLinkToFile(aviName,false);

OleContainer1->DoVerb(ovPrimary);

}

為了使操作界面上顯示的像片能隨記錄指針的移動而改變,可以添加組件DBNavigator1的OnClick事件,其過程代碼只有一條語句:

void __fastcall TForm1::DBNavigator1Click(TObject *Sender, TNavigateBtn Button)

{ Image1->Picture->LoadFromFile(Table1->DatabaseName + “\\media\\” + Table1->FieldByName(“像片”)->AsString);

}

至此,一個小型的多媒體數(shù)據(jù)庫系統(tǒng)用“分離法”創(chuàng)建完成。

小 結(jié)

以上介紹了多媒體數(shù)據(jù)從創(chuàng)建、存入,到讀取、顯示、播放等兩種不同的控制方法,這兩種處理方式各有優(yōu)劣。若多媒體數(shù)據(jù)與數(shù)據(jù)庫共同存儲,數(shù)據(jù)便于管理,整個數(shù)據(jù)庫系統(tǒng)只有一個數(shù)據(jù)庫文件,但它的缺點(diǎn)是數(shù)據(jù)庫文件會變得非常之大,使應(yīng)用系統(tǒng)讀取的運(yùn)行效率降低; 若多媒體數(shù)據(jù)與數(shù)據(jù)庫分開存儲,其缺點(diǎn)是文件數(shù)量較多,維護(hù)、管理不太方便,但它的優(yōu)點(diǎn)是數(shù)據(jù)庫文件較小,數(shù)據(jù)庫打開和應(yīng)用系統(tǒng)讀取的運(yùn)行效率大大提高。

一般的原則是,如果多媒體數(shù)據(jù)的尺寸較小并且又有專門的數(shù)據(jù)庫組件可與之關(guān)聯(lián),如職工的照片BMP文件可用組件TDBImage、格式化文檔RTF文件可用組件TDBRichEdit等,這時可以采用“集成法”將數(shù)據(jù)直接存入數(shù)據(jù)庫; 若多媒體數(shù)據(jù)的尺寸較大,如音頻、視頻等,可將數(shù)據(jù)與數(shù)據(jù)庫分開存儲,在數(shù)據(jù)庫中只保留多媒體數(shù)據(jù)的文件名,是一種“鏈接”的方式,這樣做有一定的靈活性,比如想修改某條記錄的信息,只需直接修改數(shù)據(jù)文件,而不必打開數(shù)據(jù)庫。