·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发设计
考试公务员高考考研
业界互联网通信探索
您现在的位置:天新网 > 软件开发 > 游戏开发
游戏中音频的处理
http://www.21tx.com 2006年12月11日 丰石

游戏中音频的处理:
声音基础:
    原始森林中的一棵树倒下了可是没有听到它到下的声音,那么它发出声音了吗?这个问题看起来比较奇怪,但是这有助于我们理解声音的实质:声音就是在一定介质中传播的一种波,比如说在空气中.对于人来说,只有这种波引起了耳膜的震动才能叫做声音.
    大自然中的很多种声音都有一种恒定的波形--正弦波.然而人的声音却很复杂,不是能用简单的正选波能描述的.下图给出了这两种声音波形的图示:

游戏中音频的处理
声音的属性:振幅,频率.
声音的采集:
    声音的采集与使用不是太复杂,比如说你我们我们想录制一段2秒钟的对话,我们只要以恒定的频率来对声音进行采样然后存储可以了.如果我们以1000HZ的频率来录制的话,这就意味着2秒钟的对话被分成了2000等份.每一等份被称作是样品.对于每个样品我们记录其振幅以用来描述声音的大小.我们在规定的时间点上记录每个样品的振幅就得到了所谓的声音文件.
下图给大家展示了这样一个实例:声音被分成N个样品,正如我们看到的一样,当数字化后,声音也就失去了以前的波形,因为采样点不够多.也许您已经想到了,采样频率越大,我们得到的声音也就越逼真.但是具体多少才是最好的呢?这取决于我们想要得到的质量,以下是我们经常用到的频率:8000,11025,22050,44100HZ,最后一个是CD标准.

游戏中音频的处理
    前面我们提到了我们采集的是样品的振幅,那么我们如何来存储这些振幅呢?我们可以用8位,或者16位来存储这些振幅.如果用8位也就意味着我们256个等级,而16位的话就有65536个等级.有的时候我们要用更高的32位等.还有一个问题就是我们用几个通道,立体声要用两个通道,一般的声音是一个通道.另外我们还可以利用一些特殊的加密或者压缩的算法对这些数据进行处理.但我们更多的使用.WAV.它是未压缩的.处理起来更加快捷.
音乐使我们疯狂:
    技术上的突破使得我们可以获得听觉上的新鲜感.音乐就是一串声音.用合适的停顿,振幅的变化来演奏美妙的音乐.
MIDI:
    MIDI是存储音符的标准,MIDI文件里包含了如何演奏的说明(音符的高低,何时停顿等),然后专门的硬件设备就根据这些说明来演奏.MIDI一共使用128种标准设备接口,你可以只使用一部分设备,比如使用设备0(钢琴)等.一首歌曲可以分为多个音轨,每个音轨用特定的设备来播放.我们还可以把一些支持MIDI的乐器跟PC机相连,用乐器来给我们的PC机传送音符,我们的PC机里都有音乐设备接口,可以播放相应的声音.
DirectMusic:
     DirectMusic格式与MIDI格式类似,只不过DirectMusic增添了不少的功能,比如说创建动态音乐序列以丰富我们的听觉经历.我们可以改变节拍,乐器等来改变音乐.DirectMusic使用.SGT扩展名.其它相关的扩展名包括:.BND,.CDM,.STY等.当我们用DirectMusic来创作歌曲时,相关的文件都会被DirectMusic自动处理.
DirectX Audio概览:
    DirectX Audio有两个组成部分:DirectSound,DirectMusic,在这两个部分中,DirectMusic的变化比较大(与前面的版本相比较),DirectSound几乎跟以前的一样(8.0).
    DirectSound是处理数字声音的最主要的部件.DirectMusic处理多种文件格式,MIDI,本身自带格式,WAV文件等,最后把音符信号传给DirectSound来处理,下图来帮助理解:

游戏中音频的处理
现在我们已经有了音频处理方面的一些"背景",下面我们就来详细介绍DirectSound跟DirectMusic的使用.
DirectSound的使用:
     DirectSound初看起来比较复杂,其实是很容易学也很容易用的.我们创建一个用来跟硬件交互的对象,然后利用这个对象来创建用于存储数据的缓冲区.而对于数据缓冲区中的数据我们可以以我们自己喜欢的方式来播放,比如说我们可以改变节奏,音轨数,改变位数等.
     音轨只有两种选择:单通道或者双通道.位数也只限于两种选择:8位或者16位.DirectSound的默认配置是:22025HZ,8位,立体声.我们可以改变这些参数.我们可以改变节奏,改变音量大小,循环播放音乐等.
     把数据导入到缓冲区中是我们的工作,对于非常大的数据文件,我们可以创建一个管理流文件的函数:它每次可以移动一部分数据,直到所有的数据都播放完成.为了完成这项工作,我们需要在缓冲区的特定位置做一些记号,当到达这些记号时我们就通知应用程序来更新指定位置的数据.
      下面是我们DirectSound中要用到的几个对象:
Interface                                  Description
IDirectSound8            The main DirectSound interface object.
IDirectSoundBuffer8      Primary and secondary sound buffer object. Stores dataand controls playback.
IDirectSoundNotify8      Notification object. Notifies the application when specificpositions are reached within a sound buffer.
下图展示了这几个对象之间的关系:IDirectSound8是最主要的对象,我们可以从它来创建缓冲区IDirectSoundBuffer8.一个数据缓冲区又可以创建自己的通知对象IDirectSoundNotify8.

游戏中音频的处理

 

 

 

上一篇: Toon Shading Using GLSL
下一篇: Java 2游戏编程读书笔记(3)

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net