说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB用MCI指令进行多媒体编程

HTML文档下载 WORD文档下载 PDF文档下载
VB用MCI指令进行多媒体编程



   我们有时会希望为自己的程序增加音效,例如警告声等,这就需要播放WAV文件。较简单的做法,我们可以使用多媒体控件(VB和Delphi都提供了MCI控件)来完成,但这样做无疑会增加系统负担和使程序体积增大(使用OCX的话尤其明显)。如果我们的程序并非一个多媒体程序而仅仅是用来播放音效的话,就更不划算了。有没有更理想的方法呢?答案是肯定的,Windows已经为我们提供了一个关于多媒体处理的动态连接库WINMM.DLL(旧版本为MMSYSTEM.DLL),通过调用它所提供的API函数,我们就可以使用MCI指令进行多媒体方面的操作了。
  让我们先来了解一下什么是MCI指令,MCI的全称是Media Control Interface(媒体控制接口)。实际上MCI是一个高级的函数调用接口,我们可以把它看作是一个解释器,通过它,我们就可以直接和外部音频或视频设备打交道了。
  接下来,就需要了解一下需要用到的API和MCI指令。有三个与MCI有关的API,它们是:mciSendString(),mciExecute()和mciGetErrorString()。mciSendString函数的功能是传送指令字符串给MCI,mciExecute的功能和mciSendString一样,不同的是当发生错误时mciExecute会弹出对话框显示错误信息。mciGetErrorString的功能是将MCI错误代码转换为字符串。现在假设我们的编程环境是VB或Delphi,下面就在这两种环境的情况中介绍其使用方法。
  在VB中,调用API函数必须先进行声明,它们的格式分别为:
  Declare Function mciExecute Lib “winmm.dll" Alias “mciExecute" (ByVal lpstrCommand As String) As Long
  Declare Function mciSendString Lib “winmm.dll“Alias“mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwnd Callback As Long) As Long
  Declare Function mciGet Error String Lib “winmm.dll" Alias “mciGetError String A" (ByVal dwError As Long, ByVal lpstrBuffer As String, ByVal uLength As Long) As Long
  在Delphi中相对较简单,由于Delphi已经将多媒体相关的API声明预编译在MMSYSTEM.DCU文件中,所以我们只需要在单元的Uses语句后加上 mmsystem即可在本单元中使用上述三个API函数了。
  接着再介绍一些常用的MCI指令。
   MCI指令一般格式为:MCI指令 设备名 [参数]
  打开多媒体设备:open,如:open CDAudio、open c:\windows\chimes.wav type waveaudio。
  播放多媒体设备:play,如:play CDAudio from 5000 to 20000(播放CD的第5秒到第20秒)、play c:\windows\chimes.wav。
  关闭多媒体设备:close,如:close all(关闭所有多媒体设备)。
  得到设备状态信息:status,如:status cdaudio number of track(得到CD的曲目总数)
  有了这些预备知识,就可以将MCI和API结合起来进行多媒体编程了。
  例如,要在程序中使用音效(播放WAV文件),要求如果WAV文件不存在的话要求忽略错误(即不弹出出错信息),则程序如下(以VB为例,Delphi中类似):
  Dim Result as Integer
  Dim ReturnStr As String * 1024 '注意,必须指定String的长度
  Result=mciSendString(“play c:\windows\chimes.wav",ReturnStr,1024,0) '其中ReturnStr为某些MCI指令执行后传送给程序的文字信息
  以上这段程序可以播放指定的WAV文件,如果成功执行,则Result的值为0,如果文件不存在或出现其他错误,错误代码会传送给Result,但程序不会中断。若要根据错误代码自行处理错误信息,可以使用mciGetErrorString函数处理:
  Dim ErrStr As String * 1024
  if Result=0 then
  msgbox “播放成功"
  Else
  i%=GetErrorString(ReturnStr,ErrStr,1024)
  msgbox ErrStr
  End If
  下面,我们举一个完整的程序作为例子(还是以VB为例),我们可以用API写一个CD播放器来代替使用多媒体控件。这样做的好处很明显,当你把程序编译成为EXE文件后复制给朋友的时候,你再也不必附加其他OCX文件(如果是Delphi的话,EXE文件体积也可以减小)。
  在VB中新建一个工程,在Form1中添加6个按钮和一个Timer控件,属性如下(效果如图):
  名称:Command1,Caption:弹出
  名称:Command2,Caption:播放
  名称:Command3,Caption:暂停
  名称:Command4,Caption:下一首
  名称:Command5,Caption:上一首
  名称:Command6,Caption:退出
  名称:Timer1,Interval:1000
  接着,我们就可以编写代码了,如下:
  '函数声明
  Private Declare Function mciExecute Lib “winmm.dll" (ByVal lpstrCommand As String) As Long
  Private Declare Function mciSendString Lib“winmm.dll" Alias “mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
  Dim Cur As Integer '保存当前正在播放的曲目号
  Dim Total As Integer '保存CD曲目总数
  '弹出CD-ROM
  Private Sub Command1_Click()
  i% = mciExecute(“set cdaudio door open")
  End Sub
  '播放
  Private Sub Command2_Click()
  i% = mciExecute("play cdaudio")
  End Sub
  '暂停
  Private Sub Command3_Click()
  i% = mciExecute(“pause cdaudio")
  End Sub
  '播放下一首
  Private Sub Command4_Click()
  Dim ReturnStr As String * 128
  i% = mciExecute(“set cdaudio time format tmsf") '设置from后的时间格式
  If Cur < Total Then i% = mciExecute(“play cdaudio from" + Str(Cur + 1))
  End Sub
  '播放上一首
  Private Sub Command5_Click()
  Dim ReturnStr As String * 128
  i% = mciExecute(“set cdaudio time format tmsf")
  If Cur > 1 Then i% = mciExecute(“play cdaudio from" + Str(Cur - 1))
  End Sub
  '中止CD的播放并退出
  Private Sub Command6_Click()
  i% = mciExecute(“stop cdaudio")
  i% = mciExecute(“close cdaudio")
  End
   End Sub
  '程序启动时打开CDAudio设备并得到曲目总数
  Private Sub Form_Load()
  Dim ReturnStr As String * 128
  i% = mciSendString(“open cdaudio", ReturnStr, 128, 0)
  i% = mciSendString(“status cdaudio number of tracks", ReturnStr, 128, 0)
   Total = Val(ReturnStr)
  End Sub
  '退出时中止CD的播放
  Private Sub Form_Unload(Cancel As Integer)
  i% = mciExecute(“stop cdaudio")
  i% = mciExecute(“close cdaudio")
  End Sub
  '每隔一秒监测当前播放的曲目号
  Private Sub Timer1_Timer()
  On Error Resume Next
  Dim ReturnStr As String * 128
  i% = mciSendString(“status cdaudio current track", ReturnStr, 128, 0)
  Cur = Val(ReturnStr)
  End Sub
  好了,现在这个CD播放器已经可以工作了,如果你再为它扩充一些有趣的功能的话,就是一个完整的小软件了。(上海 申 )


Windows Server 2012 VHDX格式揭秘 Rovio将赶超Zynga 成为全球最受欢迎游戏公司 Netflix基于AWS的大数据平台Hadoop架构解析 微软开始提供Windows Embedded测试版系统 Aaron Swartz自杀原因存疑 引发互联网连锁反应 重金吸引开发者 BlackBerry10应用36小时增1.5万 把数据中心搬入“空间站” Dell和Intel对OpenStack新兴公司Mirantis投资 快讯:马云自5月10日起不再担任CEO职务 Web工程师必备的43款可视化工具 中国电信天翼开放平台2012年度数据:API调用量破亿 iOS走向开放:UC浏览器iPhone版实现云下载 让Dreamweaver支持cshtml (MVC Razor环境) iOS付费榜首:日历应用Fantastical开发者专访 玩转AdMob移动广告:捕鱼达人的猎财之道 12306抢票插件拖垮GitHub 展望2013 jQuery核心团队成员谈其发展路线 Facebook社交视觉搜索分析:引入“竞价排名”? 移动广告现状5大问题解析 Google将于月底举行Google Glass开发者大赛 分享29个超赞的响应式Web设计 Facebook图谱搜索和谷歌搜索有何不同? Facebook向美国iPhone用户提供免费电话 VMware CTO Steve Herrod离职 加盟风险投资公司 维基百科基金会推出众包旅游项目Wikivoyage 最舒适程序员:工作外包给中国 自己却偷懒 Evernote正在与苹果联合开发硬件记忆工具,未来两年公司上市 Fusion-io发布ioScale 全闪存数据中心时代到来? Agent Dash游戏设计之美:如何用2D打造3D体验? 开源项目文档应规避的13处“硬伤” 李开复:Graph Search将可与谷歌搜索媲美 Suspicious pointer conversion 是什么警告啊? 有哪位高手知道微软提供的的简繁互转的组件是哪个,在线等待,高分送 紧急求助!!既可以选择还可以接受用户输入的下拉选框!!万分感谢!! 在jsp页面中如何实现显示一行文字消息后再更改该文字的内容?? 高分求Excel基本操作代码,如打开关闭文件、取单元格数据之类的 关于MSHFLexGrid与ADODC的几个问题 什么是内建数据库? 请问Delphi 6怎么样才能激活Invokable向导? 安装softice后,不能启动机器了!!!!!!!! 听听StringGrid 隐藏行的好建议,别讲RowHeight[i]=0阿 关于VB调用Excel打印报表的问题 哪有电脑知识问答题? 我有项目,有谁参加??? 请问哪儿能下载模块 ming? 这样的情况还能用StringGrid吗???如果不可以那用什么?DBgrid? 致JAVAMAIL配置不成功者--即编译通过但运行不了的朋友 请问asp.net 项目开发中,页面设计与代码编写如何分工 这个地方怎么回事?(代码) 不能上网??为什么?我想不明白?? ASP包含文件问题,给分50,在线等候ING。。。。 怎樣在applet中控制button的大小和具體位置? 从Microsoft操作系统的发展中,我们可以看到操作系统最终目标是OFS,它基于一种内建数据库技术,最终什么样的数据库,也就是何为内建数据 鼠标左键按下拖动是对应的windows消息是哪个?(像WM_LBUTTONDOWE) 与市场上通过网站的web发送短信相反,web能接受短信吗?如何完成? 与市场上通过网站的web发送短信相反,web能接受短信吗?如何完成? 我有项目,有谁参加??? 要用jdbc连接两个用户怎么办? 怎样取出字符串? 请问哪里有支持代理服务器的telnet客户端? 用vbscript将list框里的多选的值读出来,急!在线等待 想在北京找个JAVA或XML及相关技术开发方面的工作(大学毕业后工作三年,然后读了统招的研究生) 用VBscript 取当前页form 中项目的值。 请问在JBuilder7中,如何引入javax.xml.parsers.*;org.xml.sax.*;org.w3c.dom.*; 急需要原代码 如何在delphi 6中的 采单加入图片背景? tomcat 问题 请指教:Wrf文件用什么软件打开呢? 请大家帮忙,谢谢 这个问题如何解决!特来请教! 怎么样去掉工具栏呀(基于单文档的应用程序)? 字符串的连接 如何使得图片(TImage)半透明显示? 想让图片有朦胧的感觉 初学者的问题:SQL Server的两个小问题,希望高手指教,多谢了! win2000的脚本编辑器 关于VC的串口通信,在线等待,大家多帮忙啊! 运行http://localhost:7001/helloclient测试EJB,出现了以下错误 如何找到我的IBM笔记本的主板的型号? 字符串的连接 怎么比较数据? 系统的.OCX控件注册问题 请问 uint_fast32_t 和 uint32_t 有什么区别?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘