筆者日前參與開發(fā)了一套高速公路收費系統(tǒng),主要功能是記錄通過收費站的所有車輛的信息,包括時間、車型、金額、車輛圖片資料等,其中涉及到多媒體數(shù)據(jù)的處理。下面筆者將主要依靠Delphi中的流數(shù)據(jù)類型來為大家做講解。 一、選擇數(shù)據(jù)庫
1.問題
常用的桌面型數(shù)據(jù)庫,如Access、Visual FoxPro等,使用比較簡單,也可以管理多媒體信息。但由于數(shù)據(jù)庫引擎不夠強大,在管理少量多媒體數(shù)據(jù)時尚能正常運行,當數(shù)據(jù)量增大到一定程度后,數(shù)據(jù)庫的反應就會變得異常緩慢,其性能也大幅下降。在達到某個臨界點時,甚至還會出現(xiàn)數(shù)據(jù)庫處理能力和待處理數(shù)據(jù)量的嚴重失衡,而導致假死狀況的出現(xiàn)。筆者有過這樣的經(jīng)驗,用Visual Fox Pro來管理1萬名學生的照片檔案和學籍信息,這時要進行查詢必須經(jīng)過長時間等待,最后不得不放棄。
2.治“標”
用一些技巧可以加快系統(tǒng)的運行,比如“化整為零”法。即將超大數(shù)據(jù)分散到眾多數(shù)據(jù)表中,雖然可以有效地提高數(shù)據(jù)庫的運行速度,但層次過多使查詢、統(tǒng)計等變得十分不便,而且編程的復雜度和工作量也會隨之大幅增加。
另外一個常用方法是將多媒體數(shù)據(jù)保存為獨立的文件,在數(shù)據(jù)庫中只存儲這些文件的路徑和文件名,從而避免了將海量數(shù)據(jù)直接存入數(shù)據(jù)庫。這種為數(shù)據(jù)庫減負瘦身的方法可用于任何數(shù)據(jù)庫,通用性好,而且對性能的提升也是可觀的,是一種已經(jīng)得到廣泛應用的治“標”方法。然而這種方法也有明顯的缺點:結(jié)構(gòu)復雜、不便維護、安全性差,更體現(xiàn)不出數(shù)據(jù)庫的優(yōu)點。還是以學籍管理為例,采用這種方法管理1萬甚至更多學生的照片數(shù)據(jù),程序非常復雜,維護也十分困難,依然不是治“本”之策。
3.治“本”
其實,要處理海量的多媒體數(shù)據(jù),再先進的桌面型數(shù)據(jù)庫都會捉襟見肘,筆者最后采用了企業(yè)級數(shù)據(jù)庫。以SQL Server、Sybase、Oracle等為代表的企業(yè)級數(shù)據(jù)庫具有更強大的性能、更完善的數(shù)據(jù)管理、更可靠的安全特性和更出色的網(wǎng)絡(luò)功能,能夠勝任非常復雜和龐大的數(shù)據(jù)管理任務,同時它們還提供了豐富的數(shù)據(jù)類型,以及針對多媒體管理特別優(yōu)化的引擎?紤]綜合性能、價格等各方面的因素,我們最終選擇SQL Server 2000標準版作為系統(tǒng)的后臺數(shù)據(jù)庫。 二、怎樣處理多媒體數(shù)據(jù)
1.多媒體數(shù)據(jù)的存儲
多媒體信息包括圖像、聲音和視頻等,它們都是以二進制數(shù)據(jù)集合的形式存在的,在本系統(tǒng)中處理的對象是圖像。SQL Server提供了Image數(shù)據(jù)類型來存儲可變長度二進制數(shù)據(jù)(大小范圍為0~2GB)。但Image字段并不能將多媒體數(shù)據(jù)直接裝入,必須經(jīng)過一些中間步璨拍芙荽娼ァO旅嬉醞枷袷蕕拇媧⑽,给大坚t(yī)檣茉躚贒elphi中實現(xiàn)這些中間步驟。
Delphi中的TStream數(shù)據(jù)類型以流的形式對字符或非字符數(shù)據(jù)進行存儲,就像在內(nèi)存中開辟了一個大小可變的臨時緩存區(qū)。它不僅能方便地對外部文件進行讀寫,而且還可以將流中的全部數(shù)據(jù)直接轉(zhuǎn)入數(shù)據(jù)庫,所以用它作橋梁來完成數(shù)據(jù)存入工作是非常合適的。
下面的SavetoImage函數(shù)的功能是將TStream數(shù)據(jù)存入數(shù)據(jù)表的Image字段中。
function SavetoImage(const Stream:TStream;const AField:TField):boolean; var FieldStr:string; PFieldStr:PChar; begin Result:=false; if (Assigned(AField)) and (Assigned(Stream)) then begin try Stream.Seek(0,0); SetLength(FieldStr,Stream.Size); PFieldStr:=PChar(FieldStr); Stream.Read(PFieldStr^,Stream.Size); AField.Value:=FieldStr; Result:=true; except end; end; end; |
下面是調(diào)用SavetoImage函數(shù)完成圖像數(shù)據(jù)存儲的程序片段。
Var FS:TFileStream; begin FS:=TFileStream.Create('C:\Car001.jpg',fmOpenRead); SavetoImage(FS,Adodataset1.FieldBy Name('st_img')); FS.Free; end; |
其中,Adodataset1是與數(shù)據(jù)庫進行連接的ADO數(shù)據(jù)集控件,st_img為Image字段。
2.多媒體數(shù)據(jù)的轉(zhuǎn)移
利用SQL Server所帶的BCP實用工具,可以很方便地將數(shù)據(jù)庫部分或全部數(shù)據(jù)復制出來,包括二進制數(shù)據(jù)。對復制出的多媒體數(shù)據(jù)可以通過網(wǎng)絡(luò)或移動存儲設(shè)備將它們轉(zhuǎn)移到遠端的監(jiān)控電腦上,再利用BCP將它們復制到監(jiān)控數(shù)據(jù)庫中,以便對多媒體數(shù)據(jù)進行回放或做其它處理。下面是簡化了的將數(shù)據(jù)從數(shù)據(jù)庫復制到外部文件和從外部文件復制入數(shù)據(jù)庫的程序片段。
var s1:string; begin s1:='bcp "select * from st2002..st2002_sf where st_flag=1" queryout c:\Media_data.dat -N -P -S sunnynt\hy2002'; winexec(PChar(s1),sw_show); end; |
其中“select * from st2002..st2002_sf where st_flag=1”表示從st2002數(shù)據(jù)庫的st2002_sf表中提取數(shù)據(jù),“c:\Media_data.dat”為輸出數(shù)據(jù)文件,參數(shù)queryout表示從查詢中復制數(shù)據(jù)到外部文件,-N表示進行大容量數(shù)據(jù)復制操作,-P表示使用默認密碼,-S提定進行數(shù)據(jù)復制操作的數(shù)據(jù)庫服務器或?qū)嵗?br>
var s1:string; begin s1:= 'bcp ST2002..ST2002_SF in c:\Media_data.dat -n -E -P -S sunnynt \hy2002'; winexec(PChar(s1),sw_show); end; |
其中參數(shù)in表示將數(shù)據(jù)從外部文件復制到數(shù)據(jù)表中。
3.多媒體數(shù)據(jù)的回放
同存儲的方法類似,多媒體數(shù)據(jù)的回放也要借助TStream數(shù)據(jù)類型作橋梁,而且它基本上是存儲的逆過程。
LoadfromImage函數(shù)的功能是將數(shù)據(jù)表的Image字段數(shù)據(jù)裝入TStream中。
function LoadfromImage(const AField:TField;const Stream:TStream):boolean; var ResultStr:string; PResultStr:PChar; begin Result:=false; if (Assigned(AField)) and (Assigned(Stream)) then begin try ResultStr:=AField.Value; PResultStr:=PChar(ResultStr); Stream.Write(PResultStr^,length(Result Str)); Stream.Seek(0,0); Result:=True; except end; end; end; |
下面是調(diào)用LoadfromImage函數(shù)將數(shù)據(jù)表Image字段中的圖像數(shù)據(jù)轉(zhuǎn)出到外部文件中并利用圖像顯示控件回放圖像的程序片段。
var FS:TFileStream; begin FS:=TFileStream.Create('c:\Car001.jpg',fmCreate); LoadfromImage(adodataset1.fieldby name('st_img'),FS); FS.Free; image1.picture.LoadFromFile('c:\Car001.jpg'); end; |
三、小結(jié)
其它多媒體數(shù)據(jù)類型如聲音、視頻等的轉(zhuǎn)出過程與圖像的轉(zhuǎn)出完全相同,只是回放部分應針對不同媒體類型采用不同的媒體播放控件。
上面所述的原型程序在Delphi 5/6/7+SQL Server 2000標準版中調(diào)試通過,經(jīng)過適當?shù)臄U充和修改后,這些程序在筆者開發(fā)的高速公路收費系統(tǒng)中得到了驗證。同樣,這些程序也可使用在如學籍管理、檔案管理、人事管理、商品交易等涉及到多媒體數(shù)據(jù)的應用系統(tǒng)中。
如今已經(jīng)是數(shù)碼時代,DC、DV、MP3等數(shù)碼設(shè)備正逐漸深入到我們生活和工作中,它們產(chǎn)生的圖像、視頻、聲音等多媒體信息呈爆炸式增長,如何有效管理這些多媒體信息成為擺在我們面前的課題。本文簡單討論了利用SQL Server數(shù)據(jù)庫對多媒體信息進行管理的幾個基本問題,其原理同樣適合Sybase、Oracle等數(shù)據(jù)庫和Powerbuilder、VB等前端開發(fā)工具。
|