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

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


在运行时维护DBGRID的栏位宽度-VB资料 VB怎样使用VB开发基于Sybase的C/S软件 VB怎样在运行时动态生成多个相同的控件 直接编辑VB中网格控制项的两种方法 自制控件方面的有关知识-VB资料 Unicode vs Ansi -VB资料 VB 中调用 Word 拼写检查 VB4.0安装程序的汉化 VB中对字符串的处理及其扩展 把符串中的一子串替换为另一子串 -VB资料 把数字转成英文字-VB资料 翻转一个字符串-VB资料 混合字符串的长度 -VB资料 将阿拉伯数字转成中文字的程式 -VB资料 将包含有Null结尾的字符串转换为VB字符串 切分字符串-VB资料 清除字符串中指定的字符 -VB资料 VB如何取得计算机的所有字型? VB如何取得中英混合字符串的长度? 使VB的网格控件具有输入功能 VB如何使用未安装的字体? VB如何由两个ASC码(区位码)复原成一个汉字? VB如何转换C代码中的高字和低字 一些字符串操作的问题和回答 -VB资料 VB怎样把VC++代码转换成VB代码 字符串中包含双引号-VB资料 字符串中文的问题 -VB资料 巧用CLIPBOARD建立图像数据库-VB资料 在VB中存取数据库中的图片 Access97的报表解决方案-VB资料 Access下如何使用通用对话框-VB资料 请问C标准函数里是否有这样的函数,可以删除文件名相同但忽略扩展名的函数,如可以同时删除A1.LIN和A1.SA?谢先!!! 如何修改硬盘序列号(不是卷序列号,而是出厂序列号)? MS EXCHANGE SERVER 2000 在WEB页面更改MAILBOX的密码 关于string的简单问题 String和StringBuffer的具体区别是什么? 请问哪里有<<com原理与应用 >>电子书下载?谢谢 高级问题:如何实现在应用程序中动态布置控件。(分数不是问题) TList问题 请问: 我进不了windows2000 advanced server!!怎么办? 北京程序员俱乐部的相关问题 如何修改硬盘序列号(不是卷序列号,而是出厂序列号)? 请问C标准函数里是否有这样的函数,可以删除文件名相同但忽略扩展名的函数,如可以同时删除A1.LIN和A1.SA?谢先!!! 如何用DAO调用MSSQLSERVER中的存储过程获得结果集? sybase的字符串连接符是哪个 如何取得上网ip?(不是本地IP),在局域网中,客户机通过主机代理上网,能否确定客户是否连在网上? 请问网络高手--怎样知道对方的物理地址(知道对方的IP)??? 图片存在数据库中,在asp页上如何让其显示出来!? 如何把文件或图片以Blob类型存入Oracle数据库,并在JSP中把数据库中的Blob数据以最初的文件格式读出来??? 如何把文件或图片以Blob类型存入Oracle数据库,并在JSP中把数据库中的Blob数据以最初的文件格式读出来??? 请问大伙《TCP/IP详解》1,2,3卷----机械械工业出版社,是否值得购买?翻译的怎么样? CRYSTAL REPORTS DEVELOPER EDITION VERSION 哪里有下? 如何控制excel中的图表? 我想在我彻底陷去之前再清醒的看看这个世界..... 十万火急!!!IIS报HTTP 500的错误。 select时间段问题 请推荐uml方面的好书!! CreateWindow和MFC的CFrameWnd::LoadFrame产生的窗口的区别?? 在pb中用SetPicture(lb_image)当lb_image为空时picture的图片不变 有一段代码破不理解?谢谢! 在pb中用SetPicture(lb_image)当lb_image为空时picture的图片不变 用JAVA开发企业MIS系统,需要注意那些? 怎么在没有资源的项目里加入菜单资源?(急) 有一段代码破不理解?谢谢! 如何动态设置一个字段的类型。例如:下拉型,EDIT型,EDITMAST型。急用!!! 试问DELPHI中的线程是一个什么样的概念? need acdsee for linux 汇编火焰源程序,谁要,请留下Email。。。。 我在98下安装完JRUN3。0后做完的JSP网页应放在哪个目录下。急急急!!! 一个我觉得不可能实现的任务。请大家探讨!!!谢谢 在SQL表中如何得到不带年月日时间信息? 为什么要换页? 再问一个关于Delphi中处理字符串的问题 请问unix下是否支持文件流操作 fstream <<,>> 哪位老大给讲讲AVI中音频使用MP3压缩的标准及解压标准啊 need winzip for linux? 请问如何在ASP中实现FTP传输?紧急! need winimg for linux? need ie for linux? 哪有PowerDesigner 9正式版下载的? 怎样移除控件的事件? 已知关于x的多项式(m-2)x的5次方-x的(n+1)+4x+n次数是4,项数为3,求(m-n)的n次方的帮帮忙;今晚就要的。 已知一元二次方程x的平方+(m-2)x+4m=0的一个根为x=-1,求方程的另一个根. 我想知道四年级奥数题以及答案、必须有算式、跪求 已知方程组x-y=2,mx+y=6方程组有非负正整数解,求正整数m,和方程的解如上 our school is in the centre of the city同义句it rains a lot in thailand同义句 我今年a岁,爸爸比儿子大30岁,再过10年父子年龄之和是多少?怎样做 关于x,y的方程组x-y=2 ,mx+y=6有非负整数解.求正整数m? I study in a secondary school in our city.Everyone kowns it is very-----.The school now has about 3323 students ,------ sina*cosa=1-cos2a 求tana的值? 请问10平方米是不是等于100平方厘米 our school is in the centre of the city(改为同义句)our school is in ____ of the city 想象作文600字 3个连续自然数中必定有一个是3的倍数,名师请入,不懂勿入. 英语翻译:我们的公寓里市中心很近 our flat ____ ____ _____ the center of the city. 一篇想象类作文,600字假如我会七十二变 my mather's last sunday 英语作文初二英语作文急 方程x+y=1,x-y=9的解集是(5,4)为什么答案上写的是{(5,4)} .这不是方程组的解集吗.为什么是集合? 若关于x的一元二次方程x^2-6x+k+1=0有两个相等的实数根,则k的值为 m为正整数,已知二元一次方程组mx+y=10,3x-y=0有整数解,即x,y都为整数,求m的值是多少? 英语翻译 若关于X一元二次方程x^2-6x+k+1=0有两个相等的实数根,则K的值为 已知关于x y的二元一次方程组mx+2y=8,3x-2y=0的解事正整数,试分析正整数m的值,并写出对应方程组的解 there are ----teachers in our school .Atwo hundreds and thirty-four B two hundreds thirty-four C Atwo hundreds and thirt four D two hundred and thirty-four 应该选哪个为什莫B C D 这三个选项 都哪里错了 已知椭圆的中心在原点,焦点为F1(0,负的二倍根号二),且离心率e=三分之二倍根号二,求椭圆的方程 关于很忙的英语作文 I had a busy day last sunday there are 45 man teachers in our school改错 1.sina+cosa=(√2)/2(0 how did you spend last sunday 写一篇八年级上册的英语作文 There are about two h-----teachers in our school 关于想象的600字作文 英语作文:Last Sunday's picnic 101+103+105+……+199 =100*100-50*50 =7500 要是对?那这里为什么要减50的平方呀?不是应该 想象作文 600字 My Last sunday英语作文(七点半起床,早饭后骑车去孤寡老人张大爷家, 101平方加199平方简便运算等于多少 大自然想象作文600字小学六年级第一单元作文 快 急! 自然数中所有5的倍数都是() 谁的平方等于199 《幻想.》 作文600字、正常一点的 随便写, 有一类自然数,其中每一个数与5的和都是9的倍数,与5的差是7的倍数.这类自然数中从小到大排列的第10个是 . 一只青蛙在10米深的井底,它每小时往上爬1米后,要下滑0.6米.问:这只青蛙几小时才能爬到地面? 如果方程组x+y=1,ax+by=c有唯一的解,那么的abc值应满足 有一类自然数,其中每一个数与5的和都是9的倍数,与5的差都是7的倍数没写完:按从小到大的顺序写出这类自然数中的前三个 已知现在父亲比儿子大30岁4年后父亲年龄是儿子的4倍现在父子各是几岁 如果x=2,y=-2是方程组ax+by=1,ax-by=5的解,求a,b的值. 在方程ax+by+=0中,当x=2时,y=-3;当x=-3时,y=4,求a-b的值.ax+by+3=0 our school is a big nice school 的一般疑问句 已知中心在原点O,焦点F1、F2在x轴上的椭圆E经过点C(2,2),且抛物线y^2=(-4根号 6) x已知中心在原点O,焦点F1、F2在x轴上的椭圆E经过点C(2,2),且抛物线y^2=(-4根号 6) x(Ⅰ)求椭圆E的方程 英语翻译 This is our school 的一般疑问句并作否定回答怎么改? 已知m是整数,方程组{4x-3y=6,6x-my=26有整数解,是-哟不是+哟 已知关于x的一元一次方程ax+b=0的解为x=-2,则直线y=ax+b ( )A.与x轴交点的纵坐标为-2B.与y轴交点的纵坐标为-2C.与y轴交点的横坐标为-2D.与x轴交点的横坐标为-2 已知tana=2,则cos2a/(sina-cosa)^2=? 有20个连续自然数,其中所有是3的倍数的数的数相加是168.这20个数中最大的是多少? 已知关于x的多项式(m-2)x的5次方-x的n次方-1+4x-n是四处三项式,求(m-n)的n次方 一班和二班共植树270棵.一班植的树是二班的2倍.一班和二班各植树多少棵. There is a park near our school改成一般疑问句怎么改? 已知关于x的多项式(m-2)x的5次方-x的(n-1)+4x+n次数是4,项数为3,求(m-n)的n次方的值悬赏会在答题后给,对不起啦~ Our parents come and around our school 我们的父母过来参观我们的学校 这样翻译对吗? he is a good student in our school改为一般疑问句和否定句不急,看到能回答就好.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘