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

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播放器已经可以工作了,如果你再为它扩充一些有趣的功能的话,就是一个完整的小软件了。(上海 申 )


传苹果公司将于9月9日召开新一代iPhone发布会 近百家微信开发商参与征集评选活动 TOP10正浮出水面 Java程序猿,手游引擎怎么选? MDCC 2014优秀移动团队免费展位火热申请中 【微信讲师面对面】你在企业服务号开发中遇到的坑和难点 五个解决方案让MongoDB拥有RDBMS的鲁棒性事务 浅谈Apache Spark的6个发光点 安卓 “假ID” 签名漏洞,竟然骗过了支付宝和360 从Social到Big Data,移动App蚂蜂窝转型推新品 《近匠》nice曹大鹏,从男装导购到潮人社区的心路历程 DevOps扼杀的不是开发者,而是开发生产力! 利用Docker构建开发环境 Netflix公布Cassandra新性能:基于AWS的百万次写入每秒 一周消息树:谷歌Android遭遇“颠覆”危机 微软发布新应用Snipp3t,iOS平台首发且无Windows Phone版 TOP10优秀微信开发商随后揭晓 2014微信开发者大会开幕在即 8月12日:PC鼻祖IBM 5150迎来33周年 平板创作3D展现:蒙特利尔大学发明Hyve-3D设计系统 Quick Charge技术解析:关于手机快速充电的那些事儿 性能分析十八招,你用哪一招? 流程在企业内的作用及成熟度 Gartner:至2017年Chromebook销量将增2倍 后稀缺时代思考:机器横行下的人类夹缝求生 TIOBE 2014年8月编程语言排行榜:Swift跌出Top 20 精华回顾!历届MDCC大会精彩演讲与议程汇总 《近匠》Fancy3D:亿级游戏背后的轻量级引擎 假如李小龙是程序员…… Docker已扎根新一代PaaS 三星或发布首款头戴式VR设备Project Moonlight 英特尔亚太研发总经理何京翔:数据化时代背后的智慧 云络网络科技CEO Steve Mushero:游戏行业的云运维 请高教~~建主页~~学校的 为什么我下载的j2ee.jar里没有EJBLocalHome和EJBLocalObject接口 如何让为windows 2000 sv 同时支持asp cgi php? 如何用QQ发送消息?高手帮忙! 關於算法的問題﹐ 大家來幫幫忙呀﹗ 用asp编程怎样验证用户登陆名和密码!怎样设置用户的使用权限!我用的是sqlserver2000数据库 安装dbgrideh 的问题。 我先杀你们,再杀自己,然后逃之夭夭---(无内容) 请高手帮忙:原本显示正常的图片现在不能显示了 button的大小可以自己控制吗? 怎么使用ViewState 好歌推荐 念来去 - 小柯 关于值传递的问题 谁能告诉我,通常Windows下,有几种日志文件? 大家用JSP后台一般用什么数据库,并说出为什么谢了! 一个奇怪的问题! *****如何判断Pointer是否为TObject***** 不使用MFC,不弹出打印对话框,如何得到指定名称的打印机的DC 毕业设计的问题,请各位高人指点! IP控件 请教!!! isapi 奇怪问题! 配置站点问题 那有统计程序写多少行的程序? combobox控件的问题 欲购pc,求助!!(进者有分啊) 高分求教!! 建立表得问题 求javascript得到vbs产生的数组 阿菜求教!一个已经建成的dbf数据库怎么修改其字段长度呢? 请问怎么样才能开发手机游戏? 那裡有用java寫的小游戲的原馬呀﹗﹗ 请问怎才可以让图象中有网格啊? 高手指教 配机!!求助!!(进者有分啊) 这样简单的程序怎么通不过! session值修改还是未解决。 一个问题? flashget怎么用? 怎么相应动态创建的控件的事件 关于多媒体播放器的问题 快结婚了,可男朋友依旧把前女友的照片当成宝贝,我该怎么办? 建议组织一个水园老五大联盟。有支持的请up ! jspsmartupload上传100M以上的文件报错怎么办? 高分求助! 在那里下载jsp服务器的软件? 大家帮个忙,急寻南京兼职,饿死了 在unix下如何编译自己写好的c语言程序? 有个问题请教 ? 保存电脑技巧的问题。 在linux下怎么使用SAMBA使用windows下面的东西? 菜鸟级问题 竹筏用什么竹子好,是不是竹子都能浮起,都有浮力 如果所有金属制品都是由模具制成的,那么世界上第一个金属模具是怎么做的? 什么是网络协议?它主要由哪些内容组成? 青岛哪里可以买到做竹筏的竹子?在青岛准备做一个竹筏的活动,竹子规格是长度5米左右直径20公分左右 如何看电压表测量那个电压?有没有规律或者原则? 大乐透二等奖和三等的中奖概率算法,要计算公式,最好有说明怎么算得~ 用竹子做成了竹筏.用英语的被动语态如何翻译? 电压表在电路中的使用和测量的原理? 什么是网络协议 它包括那些因素 列举自然语言中相对应的要素 帕森斯的主要社会思想是什么?围绕对他的这些思想的批判,形成哪些社会学理论流派? 启蒙思想 英语怎么说 大乐透特等奖的中奖概率是多少 为什么竹筏不用木板或铁板做,而用竹子做呢? 智力启蒙用英语怎么说 大乐透的中奖概率是多少, 怎样理解"磁感线是闭合曲线"这句话?还有就是通电螺线管的磁感线为何在内部是S到N? 广州哪里有卖高低温试验箱,高低温箱产品,型号和价格可以大概说一下吗? 这个燃气管道为什么管子俩端要加个塞子!而且那种镀锌钢管俩端的颜色一样,那个PE管的俩端的颜色还不一样 帕森斯是社会学( )学派的代表人物 现存活的世界上最大的动物是啥? 毛泽东在中共七大政治报告中,首次归纳提出了中国共产党在长期革命斗争中所形成的三大优良作风A、理论和实践相结合的作风 B、和人民群众紧密地联系在一起的作风 C、批评和自我批评的 详细介绍一下帕森斯社会学理论,最好有其著作的相关说明其中“适应性亚系统中的完整性亚系统、完整性亚系统中的目标导向亚系统. 几个密度问题1、—只空瓶最多可装0.5千克水,它一定 ___ 装得下0.5千克浓盐水(选填“能”或“不能”) 2、有块长方体金属块,质量是4.05千克,体积是3.5×10(-3次方)米3,这块金属的密 中国共产党在革命战争年代形成的三大优良作风是什么?在新的历史条件下如何继承和发扬这些优良作风? 帕森斯关于性别分工的主要理论. 关于密度的几个问题.0.0.1.一个澡盆大致是长方体,长、宽、高分别约为1.2M、0.5M、0.3M,最多能装多少千克的水?2.一个容积为2.5L的塑料瓶,用它装水,最多装多少千克?用它装汽油呢?谁能帮我解一 党在长期的斗争中,形成的三大作风是什么? 在静电场的描绘实验中,用电压表找等位点,电压表内阻对测量结果有什么影响? 怎么比较密度? 党在革命战争年代形成了那些优良传统作风在新的历史条件下如何继承和发扬这些传统和作风? 便携式交流电压表通常采用什么测量机构?直流电压表主要采用什么测量机构?急用! 图形与变换:荡秋千是什么现象? 网络协议的三要素是什么? 一个自然数,被13除余1,被5除余2,被7除余5,被9除余4,它最小是? 将一个带电荷的气球接触验电器,而让验电器带电,这个过程叫什么?四选一 :传导起电 传导起电 感应起电 接地起电第2个改成摩擦起电 荡秋千的小孩通过最低点.为什么属于超重现象? 理论力学 力系怎么简化出力螺旋的? 急.金属材料规定塑性延伸强度如何确定? 12398698有四张印有1、2、3、4、的数字卡片,一次摸两张两张卡片上数字的和是单数的本人赢,两张卡片上数...12398698有四张印有1、2、3、4、的数字卡片,一次摸两张两张卡片上数字的和是单数的 力学~理论力学里的力螺旋是什么意思?是在一点即有力也有力矩的意思吗? 苯二甲酸是否溶于水 荡秋千属于什么现象,滑滑梯属于什么现象 用某数去除3705余9,去除4759余13,去除5079少3.这个数最大是多少? 苯的同系物溶于水吗? 数学题:有两个长度相同的滑梯,左边滑梯的高度AC与右边滑梯水平方向的长度DF相等.有两个长度相同的滑梯,左边滑梯的高度AC与右边滑梯水平方向的长度DF相等.(1)两个滑梯的倾斜角角ABC和 人沿水平方向推水平地面上的物体没有推动,推力少于摩擦力, 嗅苯是否溶于水 【急】怎样判断一个元素是阳离子还是负离子?带有几个单位的正电荷还是负电荷?化学这个学科中,怎样根据原子结构示意图来判断它是是阳离子还是负离子,带有几个单位的正电荷还是负电荷 世界三大国际电影节是? 化学中的苯易溶于水吗 某元素的核电荷数为Z 其带2个单位负电荷的阴离子为m,下列关系正确的是1、Z=M2 Z=M+23 Z=M-24 Z+M=2 电源充电过程,在外电路中,电流由( )电势流向( )电势.在内电路,电流由( )电势流向(电源充电过程,在外电路中,电流由( )电势流向( )电势.在内电路,电流由( )电势流向( )电 低压配电柜中,如何用三个单相电压互感器和一个转换开关和一个电压表测量三相电压 从H、S、O、Ca四种元素中,选择适当的元素填写符合下列要求的化学式:一种带一个单位负电荷的阴离子 万能试验机有哪几种 电压是什么?我希望你们可以给我非常容易的解释,假如把电压比作什么,为什么电压表能测量电压,电压不是势差,而电池里面才有两个电位,才产出的电势差,那应该只有电池里有电压,而不是电 体育的发展经历了从()演进到()直到今天的()三大历史阶段 竹筏什么竹子好,是不是所以的竹筏都有浮力 比x的5倍少19的数是? 社会学包括历史学吗? 格鲁吉亚称俄未被列入总统就职典礼受邀澳大利亚使馆被曝替美监听亚洲 澳总理斯诺登最新照:在莫斯科乘游览船 未戴以色列攻击叙利亚军事基地 目标是俄制默克尔遭美国监听 德议员称斯诺登愿协国际新闻早报:美国务卿将访沙特修补关美媒:日本大幅升级预警机应对中俄海南乐东退休局长房屋夜半遭强拆 警方初三女生因学习压力大 屡次到超市偷零宁波红光集团等6企业涉税违法被罚23浙江省省级28个部门三公经费(附表)海南乐东退休局长房屋夜半遭强拆 警方思鑫坊曾是杭城近代建筑代表 如今成无新消法引入\"举证倒置\" 经营者需前3季度国内渔业产值达5362亿元 上海自贸试验区营造“宽进严管”的营商谷歌雅虎数据遭美国国安局窃取 美媒称菲律宾议员“港人生命值钱说”激起香港俄罗斯核武部队大规模战略演习 抗衡北台湾花莲发生6.7级地震 杭州等多地医生举报官员公款出游 出门戴钢盔执擀看完这些世界上最美的院子,开始设计自今日管理百科之企业孵化器快别争了!10张动图详解手扶电梯的工【视野】AL小编带你逛2015中国自留几手:关于互联网创业你不知道的事花开三月,10个陪你一起盛放的公众号精品小叶紫檀欣赏真正的安全感什么叫工作到位?9张图,拿走不谢!范卫锋:别转行了,回来做新媒体吧五年,我在高盛如何从“羊”变成“狼”「手慢无」Ticket to Rid【专栏】人人车CEO给赶集CEO的一我有666㎡的地,该怎么用?在线等!【推荐】优信CEO戴琨:二手车交易离一个资深电商操盘手的十年回顾,还有那【A粉两会干货】二手车行业痛点梳理和卖掉公司后怒发150个月工资!!这才换脑专栏|这根智能跳绳可以在空气中显网购两条裤子竟花了26万!都来看!千创业者为什么需要孵化服务
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘