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

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


北大陈钟:SEMAT—中国软件工程发展的新机遇 超华尔街预期:苹果第二财季营收为436亿美元 跨平台游戏引擎Spaceport已被Facebook收购 文科生开发GPU数据库 性能超传统数据库70倍 开发者赚了90亿:从苹果Q2财报,看iOS生态 备受开发者青睐的13款热门开源项目 Netflix赌赢《纸牌屋》背后的秘密武器:大数据分析 为什么:Google Glass只能运行Web应用? 对话Rackspace高级副总裁Jim Curry:我们没有&amp;quot;辜负&amp;quot;营销炒作 7个大数据流言——避免错误的Hadoop和云分析决策 Facebook vs. Google:撇开搜索,数据中心产业上的又一竞技 苹果将于6月10日召开WWDC 新版OS X和iOS或将面世 传Amazon今年秋季发布电视机顶盒设备 够快:不会3种以上语言的程序员不是好程序员 Cloud Foundry、Greenplum获通用电气1亿美元注资 微软推超强Android应用Switch to Windows Phone Unity CEO宣布:放弃支持Flash平台 为交房租做App:我第一年赚了7万美金 iOS越狱大神Comex加盟Google 曾错过苹果Offer 维基百科正式从MySQL迁移到MariaDB数据库 JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember 大数据推广引领精准推广浪潮 ThoughtWorks负责人曾学海:数字渠道细分带来的架构演进 你画我猜2 : Draw Something 2正式发布 云中游科技CEO张帆:畅谈“找你妹”的自营销 Oracle当心,MySQL原始团队已重整旗鼓! 优秀的Meteor学习资源 ThoughtWorks美女分析师:如何规划企业在线数字渠道战略? OpenStack将怎样影响软件行业? 知识产权日特稿:谁动了程序员的源代码版权? MIT技术评论评选2013十大突破性技术:深度学习居首 新手提问,大侠莫抛弃我,谢谢,请往里看。 求教:我想拦截CreateProcess()的调用,并取出参数是否可行???? 这是什么病毒 如何指定发送端口 如何设置treeview的scrollbar? 请问各位,谁写过一个程序的整个文档,小弟很急,想参考一下。不知是否可以。谢谢了! 打算过年后跳槽,大家帮帮忙看看我这水平能拿多少?来者有分 天灾 +人祸100分求救 各位再请看看: ccur(922337203685477.30)=922337203685477.25 ??? 用JAVA做APPLET程序的朋友请进!!! 如何使应用程序(基于对话框)在状态栏里不可见 急,求救!在线等!请帮忙,谢谢 SQL Server 的客户端问题? 在线等; 好好的程序不能运行了 ,提示:不能创建宏 怎样打开一个数据库在单文档的视中显示数据??(我没有没结过的贴) 调用外部程序的问题 偶去吃饭了!大家去吗?我请客好了:) 大家能不能介绍一下四川的迈普 VB6到VB.NET升级问题?有的FORM可以升级,有的不行,错误如下:(急!!!搞定立即散分!在线等!) 男人的花样,女人的年华(淡月儿) 如何在VB中正确将调用的Excel进程关闭? 请问 void UpdateDialogControls()函数怎么用……(******) 求教:我想拦截CreateProcess()的调用,并取出参数是否可行???? 我想请问一下sql的认证问题 触发器:For ,Instead OF 和After有什么区别?? slq7.0是不是不支持Instead OF 和After 远程访问方案征求!!! 为什么在我的XP的文件夹里面有Thumbs.db???? 不难的问题,请帮忙!! 如何改变ASP.NET Web应用程序生成的项目的位置?? 如何在JBuilder7中连接远程MS SQL2k数据库? 为什么在x-win32的窗口中,不能使用KDevelop,创建QT工程?? 数据源的连接问题?急!急!急!急!急!急!急!急!在线等待! paradox7表有没有最大记录数或最大容量?! 请问safety-critical systems是什么系统? 为什么<textarea>会有字数限制,我写了超过330个字符就不能提交表单了。 看看吧,想改變這种現象!!<marquee>能移動內容,但它移動時有空白(要等全移完后才又重新移)能否不要這中間的空隙。 那里有 netapi32.dll 中所有的函数及结构体的Delphi版定义? 在ASP里怎么能才让字符的ASC2码值加一。比如a加一之后等于b 谁有ehlib和fastreport的使用资料,哪下载??? 有关排序的问题? 高分相送!,求地税信息化方案 一个java程序,怎么写不进去?等待…… SOS!!! 是显卡的问题吗? 挂接的Fat32文件系统文件名为乱码 Linux 下的 中文输入法 十分奇怪的问题,win2000下编辑框粘贴文本出错。 为什么我的iis打不开了?(在线等待) win2000下 “内存指令不能读” 的错误怎么解决???? 问用ASP+SQL SERVER的朋友一个问题。在线等待。。 英孚的englishtown口语课上课人数是多少?说是小班课,那有多少人? we'd better _________ 什么? Yang Lin do__(well)in English than all of them. 我英语不好怎么办怎么提高口语 英语翻译谢·· I think you can do well in English than Lily对吗 我的英语一点也不好怎么办啊? 英语翻译::即使明天是下雨天也没关系 求英语卷答案 看图 要出国,英语一直不好怎么办啊? 英语翻译The old man usually waters his garden every day (除了雨天) 这题的填空 英语卷的答案看图答得好 我英语不好 Make sure that closing the door before leaving这句话有语病吗.能不能这么写,这里的动名词做主语对吗 My brother is interested in...My brother is interested in____English or ____ English.答案是spoken;written.为什么?in不是介词吗?为什么不可以用speaking;writing?in不是介词吗?后面不是要加doing吗?为什么不可以用speak 英语卷答案,看图 Make sure that you should go to bed early tonight.为什么这里Make 做主语不用动名词? My brother is interested in (swim) in the sea. 英语卷答案,看图 急 第三人称单数的问题 we assume that the circuit exists ...用了assume,从句中的exist能否用第三人称单数,为什么?是用exist还是exists? Michael is interested in music.His brother prefers P.E.(合并成一句话)希望哪位仁士能够帮帮忙 怎样记英语效果好? 为什么我看书上用make sure开头的句子make不是making?动词作主语不要用动名词形式吗 It's seven o'clock in the evening.Lucy and her family are all at ____(家).They are doing different _____(事情).Lucy's father is drinkig _____(咖啡).Lucy's mother is _____(洗涤)clothes.Lucy's grandma is watching a _____(芭蕾 我带了一个家教,现在上了十天的样子,开始她还愿意学,现在好像不喜欢,听写也不怎么愿意听,都是我来了就给她时间看下书然后再听写,我买了一套卷子每天抽几个题目给她做下,我也会讲,然 改为第三人称单数形式(we are chinese) Where are Peter and Mary?They ( ) here at seven o'clock.A.were B.was C.are 青岛四年级英语辅导求个辅导班,以兴趣为主.能兼顾成绩的 you和we是第三人称单数吗 Please write a short passage about your dog at _______ 100 words.(little)请说出理由 happy汉语意思 make 后面可以加动名词形式吗make 后面可以加动名词形式么?除了原型还可以加什么?怎么用? Please write a short passage about one piace where you have been. 有人为好听的英文歌发来~有好听的发来听听~ 英语we第三人称复数吗 (4/5)me possible solutions?Please write a passage of about 120 words to Jesse Mccartney 的歌right where you want me中文歌词 look happy 的中文意思? 求推荐适合晨读的英语材料~Ps.本人现在大三.最好是针对雅思的~ 英语翻译求高人翻译,但拜托不要用翻译器糊弄人了,这么整我也不用到这儿求了>>>Maximal R&B - Your First R&B Source Happy ChildrensDay中文什么意思 晨读选择哪些英文材料想要晨读,练习下,请问应该选择哪些英文材料,最好能告知书名的,文章最好不要太长,一个个小故事即可,不要是名著, 英国文坛出现过许多享誉世界的作家,你知道他们的名字与主要作品吗?写出至少三种! 我的好谁知道谁还有谁能记得?英语 晴天可以工作雨天可以休息,用英语怎么翻译 写出三位英国的享誉世界的作家及主要作品 "还记得吗"用英文怎么说 see的过去式saw的音标是什么saw D.J.[sɔ:] K.K.[sɔ] n.锯 A carpenter's tools include saws,hammers,and screw-drivers.木工的工具包括锯子、锤子和旋凿.vt.& vi.锯 John is sawing.约翰正在锯东西.Would you like to saw 英国文坛出现过许多享誉文坛的作家,你知道他们的名字和著作吗?请写出三位.只要三位,尽量简略,一两本足以,多了不与加分!急! 英语怎祥记得好? 英语原形与过去式组成的词语有哪些啊?例如:see-saw 翻译A window in the kitchen room was scattered ,there was rubbish everywhere and the clock. 他们正在发卷纸 英语 make sure 和to be sure的区别________ where the public phones areA:Making sure B:To be sure C:Make sure D:being sure My mother was in the kitchen,句中was是be动词的过去时,翻译时,要怎么翻译? 英语翻译1.Once Shihuangdi became the first emperor of China,how did he set up the government?What kind of government was it?What kinds of laws did he set up?2.How did Shi Huangdi protect him self from people turning against him?6.The first empero our classmates want her to represent 为什么加to The living room was excellent _____ the kitchen.[A} except [B] except for [C} include [D] besides同时请说明原因谢谢 写出下列各词相对的反义词-英语 always--- future--- quickly--- ask--- safe--- empty---- push------- 英语中do well in与do well on 有什么区别?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘