程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ Builder操縱多媒體數據庫

C++ Builder操縱多媒體數據庫

編輯:關於C++

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

集成法

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

TTable *newTable = new TTable (this);

newTable->Active = false;

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

newTable- >TableName = “example1.db”;

newTable- >TableType = ttParadox;

//定義數據表類型

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 (“數字電影”,ftBlob,0,false);

newTable- >CreateTable(); //創建數據表

delete newTable;

由於要 編程實現往數據庫中添加記錄的功能,因此假定在數據庫程序設計階段數據表 example1

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

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

圖 1 操作界面

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

1. 組件設置

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

作者:來自:計算機世界網

注: 表中標記 “▲”的幾個屬性表示只有數據表example1.db已經存在,才能在設計 階段進行設置。

2. 創建字段變量

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

3. 代碼設計

“打開數據庫”按鈕的OnClick事件過程代碼如下: void __fastcall TForm1::Button1Click(TObject *Sender)

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

Table1->TableName = “example1.db”;

Table1- >Active = true; //打開數據表

}

在“增加 記錄”按鈕的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( ); //進入編輯狀態

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”);

}

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

按鈕“聽聽聲”的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組件實現AVI播放,當然也可以用MediaPlayer1組件進行播 放,此處只是提供了一種方法:利用軟件的OLE技術對一些特殊格式的多媒體數據 文件采用TOleContainer處理,例如DOC、PSD、DWG、SWF等,只要目標計算機安裝 了該軟件的服務程序(想知道計算機支持哪些格式媒體文件只要在Word軟件中查 看“插入——>對象……”菜單便知), 筆者利用此技術成功地實現了Flash動畫存儲和播放(已裝有Flash 5)。當然也 可使用第三方開發的組件或控件,C++ Builder也支持OCX控件,例如利用MP3Play 控件實現MP3的播放。

至此,一個小型的多媒體數據庫系統用“集成 法”創建完成。

分離法

這種方法就是將多媒體數據與數據庫 分開存放。在數據庫中相應的字符字段只存放該多媒體數據的文件名,它是數據 庫與數據之間的“接口”。這種情況下數據庫結構可以在運行中動態 創建,因此可在功能界面上(功能界面上的其他部分與圖1完全相同)再增加一個 按鈕“創建數據庫結構”並在其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;

}

由於允許動態 創建庫結構,組件Table1的DatabaseName屬性和DBEdit1、DBEdit2的DataField屬 性用代碼進行設置。因為“像片”字段存放的只是其文件名,所以組 件DBImage1用Image1組件代替。這時,只需將“打開數據庫”按鈕的 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”,“劉德友”,“ldy.bmp”, “ldy.wav”,“ldy.avi”)));

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

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

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

Table1->First();

// 記錄指針移到數據表首條記錄

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);

}

至 此,一個小型的多媒體數據庫系統用“分離法”創建完成。

小 結

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved