2024年6月3日发(作者:)

VC下音频文件的播放

杨晨

引子

首先说明一点,我学得不好,感觉没能较好的完成党交给的重任,呵呵。

我这几天一直没有看关于播放声音的东东。因为一方面感觉似乎单从我们要完成的五子,炸

弹程序来看,我们现在已有的知识应该已经够用了。另一方面,在VC下播放音频是一项很

大很杂的东西,我自己不想在这上面花费过多的时间。再有就是我这个文章(应该叫随笔,

我想到哪写到哪,没有条理见谅)早写一天晚写一天对大家没有影响,毕竟这个东东相对于

我们的程序是独立的。

恩,由于我看的东西也挺杂的,手边也没有比较权威的资料,看了一些msdn上的东东,限

于英语水平有限,只是自己理解了一些,还不知对不对,所以很多东西我不能乱言,因为这

样可能会对你有所误导。下面说的大多参照网上或有些书上一些强人的观点,当然也有很多

我自己的语言,g你要看着些地方不爽可以不屑于顾。

OK,开始了。

Visual C++对多媒体的支持

对于一般的应用程序来说,Visual C++ 可以说是包罗万象,然而令人遗憾的是,几乎没

有听说过Visual C++ 对多媒体提供过什么支持,甚至有人说Visual C++不适合多媒体

编程。若是我们完全使用Visual C++的类库而不想点花招的话,恐怕连最一个简单的RPG

游戏都编不出来。对于一个需要大量动画、声音的多媒体应用程序来说,Visual C++ 最

多提供了一个外壳,而编制一个优秀的声音、动画引擎的任务,就落到了程序员的身上。

上面的话不是我说的,我接着说一句:那么,如何开发这个引擎,这个重任有可能以后就落

的你的头上了。需要你针对你的应用程序去组织类.

大的不太好,小的应用程序应该完全凑合。

Windows的多媒体服务功能

Windows 提供了丰富的多媒体服务功能,包括大量从低级到高级的多媒体API函数。利用

这些功能强大的API,用户可以在不同层次上编写多媒体应用程序.这里简要地介绍一些最

常用的多媒体服务。

1,高级音频函数.

MessageBeep、PlaySound和sndPlaySound。这三个函数你应该熟悉,我不想在这说

太多。因为我感觉很简单的,你查一下msdn就会了。要注意一下他们需要什么样的头文件,

参数都是做什么用,还有限于什么样的文件格式。比如它们都不能播放大于100k的波形声

音文件.

写个例子你应该清晰一些:

PlaySound("关机.wav", NULL, SND_ASYNC|SND_LOOP);

//第一个参数是声音文件名,最后的那个SND_LOOP是循环播放的意思。

我感觉要实现同时播放两个音乐好似只用这几个函数是不可能实现的。不管你用不用线程控

制,用了一次那么它就把那个设备的接口给占住了,用第二次要么把那个接口给抢走了第一

次的不能用了,要么抢不走,苦苦等你不想用了再拾过来。

2.MCI

什么是MCI?

MCI(Media Control Interface)媒体控制接口是MircroSoft提供的一组多媒体设

备和文件的标准接口,它的好处是可以方便地控制绝大多数多媒体设备包括音频、视频、影

碟、录像等多媒体设备,而不需要知道它们的内部工作状况。但是古人云:成也萧何,败也

萧何。MCI虽然看上去高大全,但对于一些高级应用来说,它是远远不够的。

上面的话也不是我说的,但低级中级应用是完全凑合的。

MCI向Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,

就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备

进行控制。对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的

按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。比如,

对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来

说却只需要按同一按钮。