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