用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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97