用VB6的雙通道技術獲得影碟片斷
發表于:2007-07-14來源:作者:點擊數:
標簽:
現在計算機多媒體技術的發展,使影碟無需借助解壓卡就可以在電腦中播放,而且由于vcd2.0標準的普及,影碟已經完成了向數字文件化的過渡,完全可以輕松的將任何vcd拷貝到自己的硬盤上欣賞,而無須辛苦嬌嫩的光驅.這也為我們截取任何影碟的片斷提供了可能.但是目前
現在計算機多媒體技術的發展,使影碟無需借助解壓卡就可以在電腦中播放,而且由于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
(第三步)運行調試工程,如圖2。
?。ǖ谒牟?編譯。
怎么樣,現在一個精致的非常實用的先進的(不是夸口)vcd截取軟件已經制作成功了(如圖3),你現在可將那些什么avi壓縮工具放進回收站了。心動不如行動,此程序在vb6.0中文企業版/
windows98中調試通過,如果你用的是vb5.0那么也不用擔心,你只用將第一步中對部件的引用改為“MICROSOFT WINDOWS COMMON CONTROLS 5.0"即可。
原文轉自:http://www.anti-gravitydesign.com