程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 用VB6的雙通道技術獲得影碟片斷

用VB6的雙通道技術獲得影碟片斷

編輯:VB綜合教程
現在計算機多媒體技術的發展,使影碟無需借助解壓卡就可以在電腦中播放,而且由於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"即可。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved