副标题#e#
跟着计较机软、硬件技能的日益成长,对多媒体信息的处理惩罚本领不绝加强,利 用快速开拓东西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并显示原有记录的相应信息。点击“增加记录”按钮将追 加新的记录,通过数据导航按钮举办记录的移动、修改等操纵,在每一时刻,点 击“听听声”按钮可以听到当前记录所对应的声音,点击“看看 影”按钮可以看到当前记录对应的勾当影像。这个应用已具备一个多媒体数 据库应用系统的根基成果,以下是主要设计步调:
#p#副标题#e#
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”);
}
#p#分页标题#e#
用雷同的语句可以添加多笔记录。显然,若需要其他格 式的多媒体数据文件也可用此法,作为二进制文件将其存入数据库。假如操作 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事件进程修改为:
#p#分页标题#e#
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等,这时可以 回收“集成法”将数据直接存入数据库; 若多媒体数据的尺寸较大, 如音频、视频等,可将数据与数据库分隔存储,在数据库中只保存多媒体数据的 文件名,是一种“链接”的方法,这样做有必然的机动性,好比想修 改某笔记录的信息,只需直接修改数据文件,而不必打开数据库。