欢迎来到天天文库
浏览记录
ID:47282909
大小:2.38 MB
页数:208页
时间:2019-08-23
《用DirectXAudio和DirectShow播放声音和音乐》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、用DirectXAudio和DirectShow播放声音和音乐(1)音乐就是一系列的音符,这些音符在不同的时间用不同的幅度被播放或者停止。有非常多的指令被用来播放音乐,但是这些指令的操作基本相同,都在使用各种各样不同的音符。在计算机上进行作曲,实际上是存储了很多组音乐,回放时由音频硬件将这些音符播放出来。Midi格式(文件扩展名是.MID)是存储数字音乐的标准格式。DirectMusic音乐片段(musicsegments)使用.SGT文件扩展名,其他的相关文件包括乐队文件(bandfile.BND),这种文件里面包含乐器信息;弦映射表文件(chordmapsfile.CDM)包含在回
2、放时修改音乐的和弦指令;样式文件(stylesfile.STY)包含回放样式信息;模板文件(templatesfile.TPL)包含创造音乐片段的模板。Midi是一种非常强大的音乐格式,惟一的不利因素是音乐品质依赖于音乐合成器的性能,因为Midi仅仅记录了音符,其播放的品质由播放音乐的软硬件决定。MP3文件(文件后缀为.MP3)是一种类似于波表文件的文件格式,但是MP3文件和WAV文件最大的区别在于MP3文件将声音压缩到了最小的程度,但是音质却基本不变。可以用DirectShow组件播放MP3文件,DirectShow组件是一个非常强大的多媒体组件,用DirectShow几乎可以播放任
3、何媒体文件,包括声音和音频文件,部分声音文件我们只能用DirectShow播放。DirectAudio是一个复合组件,它由DirectSound和DirectMusic两个组件组成,如下图所示:DirectMusic在DirectX8中得到了巨大的增强,但是DirectSound基本保持原有的状态。DirectSound是主要的数字声音回放组件。DirectMusic处理所有的乐曲格式,包括MIDI、DirectMusic本地格式文件和波表文件。DirectMusic处理完之后将它们送入DirectSound中做其他处理,这意味着回放MIDI的时候可以使用数字化的乐器。使用Direct
4、Sound使用时需要创建一个和声卡通讯的COM对象,用这个COM对象再创造一些独立的声音数据缓冲区(被称之为辅助音频缓冲区secondarysoundbuffers)来存储音频数据。缓冲区中的这些数据在主混音缓存(称之为主音频缓存primarysoundbuffer)中被混合,然后可以用指定的任何格式播放出来。回放格式通过采样频率、声道数、采样精度排列,可能的采样频率有8000HZ,11025HZ,22050HZ和44100HZ(CD音质)。对于声道数可以有两个选择:单通道的单声道声音和双通道的立体声声音。采样精度被限制在两种选择上:8位的低质量声音和16位的高保真声音。在没有修改的情
5、况下,DirectSound主缓冲区的默认设置是22025HZ采样率、8位精度、立体声。在DirectSound中可以调整声音的播放速度(这同样会改变声音的音调),调整音量、循环播放等。甚至还可以在一个虚拟的3D环境中播放,以模拟一个实际环绕在周围的声音。需要做的是将声音数据充满缓冲区,如果声音数据太大的话,必须创建流播放方法,加载声音数据中的一小块,当这一小块播放完毕以后,再加载另外的小块数据进缓冲区,一直持续这个过程,直到声音被处理完毕。在缓冲区中调整播放位置可以实现流式音频,当播放完成通知应用程序更新音频数据。这个通知更新的过程我们称之为“通告”。在同一时间被播放的缓存数目虽然没
6、有限制,但是仍然需要保证缓冲区数目不要太多,因为每增加一个缓冲区,就要消耗很多内存和CPU资源。在项目中使用DirectSound和DirectMusic,需要添加头文件dsound.h和dmsuic.h,并且需要链接DSound.lib到包含库中,添加DXGuid.lib库可以让DirectSound更容易使用。以下是DirectSoundCOM接口:IDirectSound8:DirectSound接口。IDirectSoundBuffer8:主缓冲区和辅助缓冲区接口,保存数据并控制回放。IDirectSoundNotify8:通知对象,通知应用程序指定播放位置已经达到。各个对象间
7、的关系如下图所示:IDirectSound8是主接口,用它来创建缓冲区(IDirectSoundBuffer8),然后用缓冲区接口创建通告接口(IDirectSoundNotify8),通告接口告诉应用程序指定的位置已经到达,通告接口在流化音频文件时非常有用。初始化DirectSound使用DirectSound的第一步是创建IDirectSound8对象,IDirectSound8起到控制音频硬件设备的作用,可以通过DirectSoundCr
此文档下载收益归作者所有