用VB6的双通道技术获得影碟片断

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 8080 的 blog

用vb6的双通道技术获得影碟片断
8/23/2001 9:8:59· ·--··vbeden


  现在计算机多媒体技术的发展,使影碟无需借助解压卡就可以在电脑中播放,而且由于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"即可。

本文关键:用VB6的双通道技术获得影碟片断
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top