現在計算機多媒體技術的發展,使影碟無需借助解壓卡就可以在電腦中播放,而且由於vcd2.0標准的普及,影碟已經完成了向數字文件化的過渡,完全可以輕松的將任何vcd拷貝到自己的硬盤上欣賞,而無須辛苦嬌嫩的光驅.這也為我們截取任何影碟的片斷提供了可能.但是目前普遍采用的壓縮成AVI文件的辦法不僅體積龐大、畫面停滯而且速度非常慢。筆者在總結編寫文件分割軟件的經驗基礎上,辟出了一條蹊徑,即采用雙通道技術直接截取影碟文件片斷,從根本上克服了上述弊端。
(一)編程原理;
一般來說VCD的實際影音文件放在光盤根目錄下“MPEGAV”子目錄下,文件名為music001.dat或者依次排序,通過對該文件的截取操作,使用戶可以保存任何精彩的影碟片斷,據作者測算,每十兆字節大約可以播放一分鐘,這樣,用戶可以使用該軟件截取任意時間段內的vcd,不過要使用“超級解霸”5.02以上版本播放。
由於影音文件體積非常大,普通vcd2.0格式60分鐘的影音文件長度在600兆以上,因此采用單通道定義二進制數組的辦法不僅可靠性差,而且截取較長片斷時勢必難以實現.筆者采用了雙通道技術,即通過定義較小的固定二進制數組,一個通道用來讀取,另一個通道用來寫入的方法來實現.這其中涉及了復雜的二進制定位技術。
(二)編程實例;
(第一步)啟動vb6中文版建立一個標准exe工程,將窗體命名為“form1",單擊“工程"菜單項目,選擇“部件",在部件對話框的“控件"欄目中選擇“MICROSOFTWINDOWSCOMMONCONTROLS6.0",確認在它前面的復選框中有一個黑色的對號,單擊“確認",添加對該控件的引用.添加6個標簽框,4個文本框(由上直下依次排列),3個按鈕,一個進度條命名為ba1,一個公用對話框控件命名為cog1,拖動控件到適當位置,界面設計完成後大致如圖1所示。其中,“影音文件名稱:"標簽對應text1,“影音文件長度:"標簽對應text2,“截取起始位置:”標簽對應text3,“截取長度:”標簽對應text4,“截取後文件保存路徑:”標簽對應text5.設置Label6的BorderStyle=1,“浏覽(*.dat)”按鈕對應Command1,“保存為(*.dat)"按鈕對應Command2,“開始截取"按鈕對應Command3。
雙擊窗體添加以下代碼:
PrivateSubCommand1_Click()注釋:浏覽選擇文件
Cog1.FileName=“"注釋:清空過期文件名稱
Cog1.Filter=“vcd影碟文件(*.dat)|*.dat"注釋:只保留影碟文件
Cog1.ShowOpen注釋:執行打開操作
IfCog1.FileName<>""Then注釋:如果放棄就忽略操作
Text1.Text=Cog1.FileName注釋:得到被截取文件名
Label6.Caption=CInt(FileLen(Text1.Text)/2^20)注釋:將文件長度轉化為兆字節
EndIf
EndSub
PrivateSubCommand2_Click()注釋:保存為
IfText1.Text=“"Then注釋:如果未選定影音文件就拒絕操作,顯示提示信息
MsgBox“請首先選擇一個被截取的文件!",vbOKOnly+vbExclamation
ExitSub注釋:中斷操作
EndIf
Cog1.FileName=“"
Cog1.ShowSave
IfCog1.FileName<>“"Then
Text4.Text=Cog1.FileName注釋:保存路徑名稱
EndIf
EndSub
PrivateSubCommand3_Click()注釋:開始截取操作
Dimerr_descrAsString
IfText1.Text=“"OrText2.Text=“"OrText3.Text=“"OrText4.Text=“"Then注釋:再次驗證參數正確性
MsgBox“請依次輸入正確的信息,不要有所遺漏!",vbOKOnly+vbExclamation
ExitSub注釋:如果參數不完整忽略操作
EndIf
IfNotjieQU(Text1.Text,Text2.Text,Text3.Text,Text4.Text)Then注釋:執行截取失敗
MsgBox“紅箭提示信息:"&err_descr,vbOKOnly+vbExclamation注釋:返回錯誤信息
Else注釋:執行截取成功
MsgBox“紅箭提示信息:文件截取操作已經圓滿完成!",vbOKOnly+vbExclamation
EndIf
EndSub
PrivateSubForm_Load()
Me.Caption=App.Title
Me.Left=(Screen.Width-Me.Width)/2
Me.Top=(Screen.Height-Me.Height)/2注釋:窗體居中
EndSub
PrivateSubForm_Unload(CancelAsInteger)
End注釋:結束工程
EndSub
(第二步)添加一個模塊,輸入以下代碼:
OptionExplicit注釋:變量檢查
TypeFileSection
Bytes()AsByte注釋:定義關鍵數組
EndType
TypeSectionedFile
Files()AsFileSection注釋:定義輔助數組
EndType
PublicFunctionjieQU(YnameAsString,KshiAsLong,CHangAsLong,BnameAsString)AsBoolean注釋:定義截取操作函數
Form1.MousePointer=11注釋:設置鼠標指針為漏斗型
jieQU=True注釋:函數成功標志
DimmlpAsInteger,iAsInteger,zhiAsLong,fnumAsInteger,fnum1AsInteger
DimshuZUAsLong,myfileAsSectionedFile
shuZU=2000000注釋:定義內存固定數組,長度為2兆
Kshi=Kshi*2^20
注釋:轉換文件指針單位為字節
CHang=CHang*2^20
注釋:轉換文件長度單位為字節
IfCHang<shuZUThen
注釋:如果截取長度太小
MsgBox“截取的文件長度不能小於2兆字節!",vbOKOnly+vbExclamation
jieQU=False
注釋:返回操作失敗標志,退出操作
ExitFunction
EndIf
IfCInt(CHang/shuZU)>=CHang/shuZUThen
mlp=CInt(CHang/shuZU)
Else
mlp=CInt(CHang/shuZU)+1
EndIf
注釋:計算需要進行操作的次數
fnum1=FreeFile注釋:返回第一個空閒文件通道
OpenBnameForBinaryAs#fnum1注釋:以二進制方式打開影音文件
ReDimmyfile.Files(1)注釋:重新分配內存輔助數組
WithForm1.Ba1
.Visible=True
.Value=0
.Max=mlp
.Min=0注釋:展示進度條,提示操作進度
Fori=1Tomlp注釋:讀取和寫入數據
zhi=Kshi+(-1+i)*shuZU注釋:計算第一個二進制通道指針
Ifi<mlpThen注釋:如果不是最後一次操作
ReDimmyfile.Files(1).Bytes(1ToshuZU)注釋:定義主要內存數組2兆字節
fnum=FreeFile注釋:打開第二個空閒文件通道
OpenYnameForBinaryAs#fnum注釋:以二進制方式打開被截取的影音文件
Seek#fnum,zhi注釋:指針定位
Get#fnum,,myfile.Files(1).Bytes注釋:獲取數據
Close#fnum
Else注釋:如果是最後一次操作
ReDimmyfile.Files(1).Bytes(1To(CHang-(mlp-1)*shuZU))注釋:分配主要內存數組大小為最後遺留數據大小
fnum=FreeFile
OpenYnameForBinaryAs#fnum
Seek#fnum,zhi注釋:定位指針
Get#fnum,,myfile.Files(1).Bytes
Close#fnum
EndIf
Put#fnum1,,myfile.Files(1).Bytes注釋:以二進制方式寫入保存文件
.Value=i注釋:進度條開始運行
Next注釋:循環直到操作次數全部執行
Close#fnum1注釋:關閉文件通道
.Visible=False注釋:隱藏進度條
EndWith
Form1.MousePointer=0注釋:還原鼠標指針指針
EndFunction
(第三步)運行調試工程,如圖2。
(第四步)編譯。
怎麼樣,現在一個精致的非常實用的先進的(不是誇口)vcd截取軟件已經制作成功了(如圖3),你現在可將那些什麼avi壓縮工具放進回收站了。心動不如行動,此程序在vb6.0中文企業版/windows98中調試通過,如果你用的是vb5.0那麼也不用擔心,你只用將第一步中對部件的引用改為“MICROSOFTWINDOWSCOMMONCONTROLS5.0"即可。->