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

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


一周消息树:计算机将拥有五感 人类面临威胁? 通晓数学的人就可以当程序员吗? 360发布企业版4.0 可自定义软件白名单 不要总是依赖机器 MongoDB扩展彰显分片功夫 Dell与HP的OpenStack的战略:渠道对抗SLA 路况电台王雷:未来车载系统会是Android的天下 移动周报:2012移动开发工具系列盘点 谷歌不愿错失机会 Android或不再成它人独享 黑客文化:Facebook公布2012年Hackathon大赛顶级“黑客作品” 中国移动音乐开放平台正式对外开放 GitLab 4.0发布 更好地支持PostgreSQL 傻瓜式移动应用开发平台:专访摩讯创始人赵健 日本DeNA进军中国智能电视,与海信战略合作 扎克伯格不仅为Poke编码,而且还“献声” Wordament:首款支持Xbox Live成就的iPhone游戏 使用Storm实现实时大数据分析! 孙博凯:微软日益开放,Windows Azure更加拥抱开源 大数据计算:如何仅用1.5KB内存计算十亿个不同的对象 我们为什么爱EC2和S3却彻底抛弃EBS 不畏Surface:诺基亚明年或推Windows平板 Linus Torvalds:用户程序被破坏永远是Kernel的问题! Python高效编程技巧 苹果加速硬件迭代 iPad5原型机曝光 宏碁推99美金平板 价格创历史新低 黑莓10全键盘版代号N系列,谍照泄露! 那些年我们用过的互联网产品 QQ亿级业务演变:从文件、音视频说起 少年企鹅的成长之旅:QQ体验设计发展史 全球超算Top 500:Linux已占93.8%,Windows或将消失 AWS东部地区再次发生宕机 Netflix等网站受影响 2012年全球最美的十个数据中心 问一下用过VB的人几个问题,谢谢先 关于显示千分位的问题 win98拨号服务器问题 你竟然不回我的短信! 如何在Datagrid的最后追加一行,这一行放多个文本框,用来添加新数据 谁有可垂直居中的QRLabel? 怎样通过程序模拟网页post数据到一个servlet? wrox 的书的源码下载怎没有-up有分 《我们共同的容闳》专辑明天在央视国际频道播出 程序发布问题,大哥大姐来帮忙呀 在线咨询:用ATL做ActiveX控件,能不能让控件是个多文档界面程序。 谁记得这道题是怎么解答的? 申请www开头的域名都是收费的吗 苦恼!考研还是工作! 短信产品:CMPP接口、SGIP接口、CMPP代理网关、计算机与手机连接的短信群发 你是不会知道的!! acrobat pdf 不能打印 怎样使程序发生异常时不弹出带红叉的窗口,异常可采用日志文件记录? 我下载了mysql-3.23.57-win.zip 安装在win2k server下为何不能用? 妹妹求救:用什么软件可以编辑.dll文件! 帮帮忙 高分求VS.NET2003正版中文版下载 XML数据导入到SQL Sever数据库 IIS运行不了ASP.NET文件,怎样做呢? oracle8i安装问-在线等待-急 怎么开启dbms_output的功能。 如何批量运行插入语句??? 数据库输出的问题 关于DELPHI 与 .NET 怎么样可以使CStatic类定义的对象变成灰白的,即disabled掉,不准在资源中改。 请教一个关于文件的问题~~ 如何将UTF-8的编码变成gb2312的编码 为什么用ADOQUERy进行查询,时间超过40秒时便出现超时连接 说说 中秋你们那是怎么过的? 两天都没摆平的问题,各位帮忙看一下。我给大家唱小曲儿啦:) 向大力请教! 一点小问题 车票精确打印 深夜,你会为谁开着手机? 新手提问:日期时间无法完全显示:? 如何把位图,字体,图标资源保存在Dll动态库中,以便让不同的Windows应用程序共享 散分了300分~高兴,朋友的网站访问者有分~不够在加!!!!!!!!!!一定给分! 寻找网站后权限的解决方案---在线等待 有没有达人可以讲解下加密解密 请教高手:类的构造函数!谢谢 求一个从*.properties文件读取数据的javabean c/s部署问题 GTK2.0安装的问题??? 中国最好的免费影院--good 我的电脑打开,菜单栏没有在标题题下面,是怎么回事啊,在线等啊. windows 2000 server下能否安装oracle734 农村小学管理最有效的方式是什么 设p,q,r为素数,则方程p^3=p^2+q^2+9的所有可能解为r不用 设p,q,r为素数,没有r ,一定的。 求方程[p/2]+[p/3]+[p/6]=q的质数解【x】表示不超过x的最大整数 get a date with 请问韩国进口的速度悠悠球的白虎好吗? 怎样获得积分 下载文章 下载文章时用的积分要怎么获取? the rocks唱的bad Romance的MP3! the rocks唱的bad Romance的MP3 一道解方程题目 大家帮帮忙 弄不懂在社会实践活动中,某校甲.乙.丙三位同学一同调查了高峰时段北京的二环路. 三环路.四环路的车流量(每小时通过观测点的汽车数量),三位同学汇报高峰时 解方程我不懂读题列方程,怎么办 导演张元任罗马电影节评委二代谷歌眼镜模型图曝光 科技网站评“专家认为美国财政问题拖累美国及全球经中国赴刚果(金)维和人员组织应急演练世界首条横跨欧亚的海底隧道启用匈牙利央行下调基准利率至历史新低德媒:北京、上海、成都被美国列入监听港报:尼运河项目代表团悄悄访华澳大利亚国防部引发林火后愿“将功赎罪日刊:秘密外交或可助中日关系破冰由木荣司:安倍若得逞,受苦的是日本百中国游客在西班牙带动“中国热” 中文苗延红任海南民政厅党组书记 傅君利任你没看错!北京“大外环”河北段今年通200斤广告牌突然脱落 砸倒2名6岁拾荒老人迷路中暑 莒南公安救助并朝鲜强烈谴责亚欧首脑会议主席声明涉朝玩家为抓口袋妖怪跳车 纽约中央公园现你知道烈士公园的恋爱圣地吗?边赏景还浙江师范大学初阳学院“缘梦·红色印记喜剧新秀徐子力主演《追爱囧途》 誓将英国退欧大臣:新移民须走人,老移民可神级大仙界云扬界老掉牙的恋爱史美女快看过来六界战神伟业职业解梦师冒牌牛头人祭司吾道不求仙通神世界星辰之新生命朱家老宅旅游高雄港渔人码头旅游梅庵旅游龙母祖庙旅游包公楼旅游肇庆市博物馆旅游端州古城墙旅游七星岩音乐喷泉旅游阿美族文化中心旅游涵碧楼旅游慈恩塔旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘