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

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


据统计,Oracle已击败IBM跃居软件行业第二 【技术博客推荐】2014年值得关注的10个开源项目 Intel在深圳建立智能设备创新中心 将投入1亿美元 免费获得价值1200元Unity2014顶级盛会门票! IBM公布Softlayer中国业务落地时间表 推荐30款最佳的数据可视化工具 数据库迁移测试:选白盒还是黑盒? 东软发布首款英特尔架构企业级移动终端解决方案 英特尔与腾讯创立游戏创新实验室 推进RealSense技术 《近匠》系列沙龙之探寻绝密武器:移动跨平台开发 iOS走向开放:苹果新推iAd Workbench广告服务 腾讯薛伟:快速模型更新在精准广告推荐中的应用 微软Build2014第一天要点精华汇总(组图) Windows 8.1 Update 1五大改变:任务栏回归,增强鼠标支持(图) 【十大院士】怀进鹏:全球的计算模式可能重新形成 微软Build2014第一天应了解的15件事 TypeScript1.0发布,完美支持Visual Studio系列产品 欲与Android展开价格战,微软宣布在移动设备上免费开放Windows 2014深圳英特尔信息技术峰会次日要点汇总 4月4日:微软39周岁,生日快乐! 正式进军硬件市场 Atlassian发布可穿戴设备Bitband 云计算时代IT专业人员需具备的10项技能 【走近院士】李德毅:大数据是连接虚拟和现实世界的桥梁 微软Build2014大会第二天干货总结 Microsoft Azure拥抱Puppet、Chef、MongoDB... 唏嘘不已!Brendan Eich上任Mozilla CEO仅十天即因歧视同性恋被迫辞职 最火HTML5 JavaScript游戏引擎:国外篇(一) Facebook发布PlanOut 开源部分A/B测试源码 一周消息树:6款Java转C#的最佳工具、Web开发者必备的9个软技能 对话“宙斯杯”获奖代表:依托京东云平台,打造精品电商CRM 关于微软开源WinJS,开发者必须知道的5件事 告别丑陋banner条,InMobi联合开发者尝试原生广告 如何在WIN NT4中安装、使用IIS4????? no pains,no gains. work for the beautiful girl here and for our beautiful life 各位大侠: 我是新手,有人能给我讲讲xmlspy吗?? win.ini与SYSTEM.INI的区别? Oracle 的产品真的很烂吗?参与者都有分! 现需开发一套对多个数据库(不是一个数据库中的多个表)进行操作的程序,使用BDE,请大家提建议 CPen的问题! 各位请教:我要通过电话线做多路远程接入但我不想用路由器 请问,使用ado控件的程序,考到其他机器上,除了数据库和应用程序之外,还需要拷贝什么文件? 部分技术超过OFFICE 国产软件挑战微软 关于子窗口 请教:uninstall onflow.exe和wcmdmgr.exe是什么软件? DataSet如何定位记录. lius_lzc(小刘)你好。请来这 高程成绩 不是高手不要进来!!!!!!!!!!!!! 那位大侠能说一下快手的原理啊,有源码最好???????????????? 各位有什么网站可在线看片或下载东西,网速要非常快,如果有请与大家分享,如果没有请勿进,免得大家试半天的网址,谢谢合作 实模式和保护模式的区别? 一个只问小湖的问题 ASP 中的 Response.End 在JSP中怎么写??? 有关多媒体数据库的问题 笨鱼笨鱼,好象你的故事大家都知道了,贴张相片出来给大家看看,大家说好不好啊?? 请教关于第三方控件的问题,谢谢 软件工程师们,你们开发软件的时候听什么音乐呀? 各位大侠,请帮助一下初学者 CPen的问题!!!!!!! 我在泡脚呢,给大家发分,打听一下你们泡脚的时候都干什么? 关于新的论坛数据的提问 在Delphi如何存取SQLServer DataBase表里的图像记录?(100分) 怎样循环更改窗口图标? 请问,那位能帮忙给个Email地址和url地址的正则表达式。急用,在下不胜感谢! 各位网络高手请进! 关于服务端用自己(socket)的程序,客户端用IE,怎样把客户端的数据信息传给服务端? 共享锁,排他锁有什么不同?· 请问在D3D8.0里可否加汉字?要注意什么?多谢! 请问有没有这样一种类似容器的东东,它其中的元素可以是异构类型,比如可以同时放类A,类B的对象 呵呵。前几天狂问问题狂送分,现在分快没了。 我得计算机怎么播放rm格式有问题啦!大侠们给个招吧! 如何在ctree view 中改变tree 的风格? 如何成为一名程序员? 帮帮我!!如何将一个Single(单精度型数)小数点后面那么多位去掉,我只要后面两位就够了。 急需高手(小菜鸟之SOS) 用什么办法可以另存一个表,结构和数据都和原表一样。 much point!!!谁能告诉我html的标准文档在那里可以下载,最好有状态转换图 如下菜单设置语句中,m_a.m_1.m_2.enabled=True ,如果m_2用变量ss,怎样写? 请问,哪里有turbo c3.0-下载,告诉我下载地址/ 各位:你们是怎样将TreeView与数据表联系起来的? [新版增强]BBS社区消息搜索软件 To Visual C++ [新版增强]BBS社区消息搜索软件 To Visual Basic [新版增强]BBS社区消息搜索软件 To Delphi 各位高手帮帮忙:为何在程序中设置打印机纸张不起作用?设置打印字体却起作用? 溶解性是不是物理性质 为什么说债券的市场利率越高,债券的发行价格越低?什么是市场利率? 道什么什么什么成语是成语接龙 为什么氧化镁能与水反应?而氧化铝却不可以? MRP、MRPII、ERP的含义是什么? 回弹碳化深度是如何测定碳化深度值测量,可采用适当的工具在测区表面形成直径约15mm的孔洞,其深度应大于混凝土的碳化深度(大于10mm)。孔洞中的粉末和碎屑应除净,并不得用水擦洗 一个质量为65kg的工人,用图12所示的装置提升一堆水泥砖.若动滑轮重50N,装水泥砖的托板重200N,每块水泥砖重100N.不计摩擦和绳重,当工人匀速提升水泥砖时,此装置的机械效率最高可达到 氧化镁,氧化铝,三氧化铁,四氧化三铁能和水反应吗 MRPⅡ的定义及功能不要答非所问,告诉我些其他的什么在MRP的基础上演化而来之流的.只要告诉我定义、功能这两点就行了. 图1中有彩色水泥砖4块,图2中有彩色水泥砖7块,图3中有彩色水泥砖10块,像这样,第n个图形要彩色水泥砖几还有一题.3个朋友在一起,每两人握一次手,他们一共握了几次手?4个朋友在一起呢?n个朋 哪种铜的导电率,导热率好?红铜(也就是红铜),黄铜(康铜),铍铜等最好有详细的参数.请分别作答.红铜(也就是紫铜)--上面打错了我现在需要做焊接实验,需要用铜做电极.红铜(也就是紫 何谓开环MRP?其基本构成及逻辑关系是什么? 酸与氧化铝的反应做实验时发现用稀盐酸(HCL)和氧化铝(AL2O3)反应时比稀硫酸(H2SO4)和氧化铝反应剧烈谁能帮我解释一下啊?同志们!我知道铝的表面有氧化铝起到了钝化的作用,但是!我 哪种铜 导电,导热性能好,抗腐蚀性哪种材料导电,导热性能好,散热快,抗腐蚀性( 要求耐酸缄)强啊 简述市场营销活动中传播信息的构成要素? 既然有过氧化镁,那么有过氧化铝吗 水泥砖和粘土砖哪个比较好 建设市场构成要素有哪些 炉渣空心砖一方的成本是多少?原料为石粉、水泥 一立方水泥砖多少块 每月完成计划的百分数是怎样算的? 请教免烧砖配料比例,原材料:水泥 粉煤灰 石粉;如果加“岩砂精”可减少水泥用量吗? 为保护耕地,许多地方都不再使用实心粘土砖,广泛使用发泡水泥砖,某发泡水泥切块的长宽厚分别为60cm、25cm、20cm,质量是15Kg,这种发泡水泥建材的密度是______kg/m的3次方 混凝土强度百分比咋算的测压出来的7天试件的数值是454,要求强度达到75%,怎么算达到没达到啊 氧化镁与浓硝酸能否反应?如果能 氧化镁到底合不可以和浓硝酸在加热情况下反应?如果能 那么方程式是? 氧化镁和水反应?初中里不是说不是只有生成可溶性碱才能反应嘛,怎么高温还能反应呢 混凝土抗压试验报告,有一代表值.怎么计算强度达到了百分之多少 胃舒平药片中三氧化二铝和氧化镁含量的测定的实验报告,要有实验目的,原理,越详细越好,急用! 童趣第一段在结构上起什么作用?它与其他各段是什么关系 金融市场上的卖空是什么意思 烧结砖与水泥砖的区别 童趣第一段在结构上起什么作用?他和其他各段是什么关系 金融市场里, 黄土 红壤 砖红壤 之间肥力的区别黄土 红壤 砖红壤 肥力排序 《爸爸的花儿落了》为何以此题目为题,具有什么深刻的含义?“花”在全文结构中起着什么样的作用? 请问:金融是什么意思? 氧化镁 氧化铁 氧化铝 氧化铜各是什么颜色 混凝土立方体抗压强度标准值的名词解释 FC在金融领域里是什么意思? 二氧化碳变成氧化镁 氧化铁变成氧化铝 怎么能利用置换反应来转化成功? 社会学功能论 冲突论 互动论 是什么, c20混凝土用回弹仪回弹大体多少回弹值是正常的? 碱是否能和氧化镁,氧化铁反应呢? 社会学研究有什么实际意义和功能 硝酸镁受热分解成氧化镁么?分解温度是多少? 取少量氧化镁,三氧化二铝,二氧化硅,三氧化二铁混合粉末,加入过量盐酸,充分反应后 社会学的意义为什么说社会学可以使人认识自我认识社会 或者说 社会学是如何使人认识自我认识社会的 最好结合实际举例说明 怎样分解氧化镁?如题,如果好的话追加5-20分. 一条环形小道,要用长50cm,宽15cm,厚3cm的水泥砖铺,铺完要用2500块水泥砖.这条小道的铺地面积至少是多少平方米?至少要用多少平方米的水泥砖? 用社会学功能论的观点解释为什么电脑病毒一直存在 氧化钙与氧化镁在和三氧化二铝反应的时候那个需要的温度低? 一条人行道长20米宽4米用面积20平方分米的水泥砖铺地需要这样的水泥砖多少块, 二氧化硫和浓硫酸反应两者反应吗?方程式?另外再问一个问题:气体溶于水溶质怎样判断,像是SO3溶于水形成H2SO4,溶质为硫酸,而NH3溶于水溶质仍是NH3,不按一水合氨来算,为什么?其他的怎样判断 什么而谈成语 溶解性与酸碱性有没有关系?我觉得物质在水中的溶解性越差,物质的酸性或碱性就越弱,那可以用物质在水中的溶解性来判断物质(不是物质的水溶液)是强酸/碱还是弱酸/碱吗?溶解性越好 三氧化二铝能不能与浓硫酸反应 浓硫酸为什么可以用铝罐装 什么道来成语 氧化锌的物理性质,溶解性,导电性,与酸碱的反应? 利率的构成要素是什么? 口什么什么道 成语
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn