用DirectX Audio和DirectShow播放声音和音乐

用DirectX Audio和DirectShow播放声音和音乐(7)      摘要: MP3是一种音频压缩格式,它通过删除或修改音乐中不易被人耳察觉的部分来使音乐更小,占用的存储空间更少。在项目中使用MP3(.MP3文件)需要使用 DirectX中的DirectShow组件,在这个组件的帮助下,只需几行短短的代码,就能使用任意的MP3文件了(DirectShow也支持其他的媒体文件,比如WMA,AVI,MPG等)。当然要想使用更多的媒体文件,必须已经在操作系统中安装了解码器。

解码器(codec)是一个程序,用于解码或编码一些指定的格式(比如MP3解码器专门解码.MP3文件)。通常可以从发明或者创建这种格式的公司中获取这种格式的解码器。比如, MP3解码器来自于Fraunhofer Insitute。幸运的是,MP3解码器等几种比较流行的解码器已经被集成到操作系统中(比如.mp3,.avi,.mpg等),而无需另外从 internet下载这些格式的解码器了。

要在项目中使用DirectShow,需要包含dshow.h头文件,并且在链接库中加入strmiids.lib。  
 
用DirectX Audio和DirectShow播放声音和音乐(6)      摘要: DirectMusic加载器在使用固有文件或者MIDI文件的时候会自动加载默认的音色库。乐器总是被一组一组地使用,很多组乐器音色的集合被称之为 DLS音色库(可下载的音乐)。每组乐器使用三个值编号,它们是:最高有效位(most-significant byte,MSB),最低有效位(least-significant byte,LSB)和组编号。

通常播放MIDI文件的乐器组是标准化的,也就是说编号为1的乐器总是钢琴,如果想使用新的钢琴作为乐器,可以从DLS集合中加载。 DirectMusic包含了标准的乐器集合,通常称之为GM/GS集合(GM = General MIDI,GS = General Synthesizer),这个集合由日本罗兰(Roland)公司提出,称为MIDI合成器标准。
  
 
用DirectX Audio和DirectShow播放声音和音乐(5)      摘要: 在DirectAudio中,DirectSound负责数字音频方面的处理,而DirectMusic则负责Midi文件(Musical Instrument Data Interface,数字音乐格式,.mid作为文件扩展名),DirectMusic固有音乐文件(.sgt文件)和数字录音设备录制的波形格式文件(.wav文件)等文件的播放操作。

能体现DirectMusic的强大之处是DirectMusic固有文件格式,一首用DirectMusic固有文件格式制作的音乐包括数个小音乐格式,这些样式还能用不同的乐器组合一个接一个地播放。随机的样式和乐器的选取创造出了随时都在改变的音乐,再加上节拍变化,就形成了一个魅力无穷的音乐系统。DirectMusic的另一个特性是可以使用“基调”,就是在正在播放的音乐片段上叠加一段其他音乐,新加入的音乐可以很平滑的融入到原有的音乐中。这在很多时候都有用,比如一个玩家完成了一个目标,可以马上播放一段“获得荣誉”的音乐提示他。 
 
用DirectX Audio和DirectShow播放声音和音乐(4)      摘要: “通告”是一种触发机制,当缓存中播放位置达到某个固定的位置时,就会向程序发出通知。有了通告,就可以知道播放什么时候结束,这种机制在比较长的声音中特别有效。通告使用一个叫做IDirectSoundNotify8的对象,这个程序的作用就是在音频缓存中标记一个位置,然后触发事件通知应用程序,而应用程序可以通过消息循环或者单独的线程进行处理。

标记的位置可以是一个缓存中的偏移值,也可以是由宏指定的停止标记,这个表示停止的宏是DSBPN_OFFSETSTOP。并不是任何偏移值都可以用来作为通告发生的位置,这个值必须和音频的数据块对齐,并且通告的偏移必须按照从小到大的顺序排列。偏移值是不能够共享的,如果使用 DSBPN_OFFSETSTOP宏,它必须被放在最后。举例来说,对于一个块大小为2的音频(单声道、16位),尝试对偏移为4和5的位置设通告会导致失败,因为偏移量位置4和5都在同一个数据块中。 
 
用DirectX Audio和DirectShow播放声音和音乐(3)      摘要: 所谓声道平衡就是调节左右声道的大小, DirectSound定义了两个宏帮助把声道平衡调节到最左边和最右边,使用DSBPAN_LEFT将声道调整到最左边,使用DSBPAN_RIGHT 将声道调整到最右边。

通过调用IDirectSoundBuffer8::SetPan函数可以调节声道平衡。   
 
用DirectX Audio和DirectShow播放声音和音乐(2)      摘要: 让缓存在程序启动的时候开始播放可以节省不少处理器时间。因为内存资源是有限的,特别是在硬件设备中,而你使用的数据缓存可能需要任意大小,因此主音频缓冲区和辅助缓冲区使用环形缓存。因为数据缓冲是一个一维数组,所以可以让这个缓冲区头尾相接。这是一个十分强大的技术,利用这个技术我们可以节省大量的内存。

声音在进行混音处理后,被送入环形主音频缓存。一旦播放位置到达主音频缓存的终点,声音又从头开始播放,这样声音就被无间隙地连续播放。如果想要使用缓存的这种循环特性,需要指定启用循环播放的特性,若不然当播放到缓冲区终点时,播放就停止了。

为了播放缓存中的音频数据(在开启循环选项的情况下播放),需要调用Play函数。  
 
用DirectX Audio和DirectShow播放声音和音乐(1)      摘要: 音乐就是一系列的音符,这些音符在不同的时间用不同的幅度被播放或者停止。有非常多的指令被用来播放音乐,但是这些指令的操作基本相同,都在使用各种各样不同的音符。在计算机上进行作曲,实际上是存储了很多组音乐,回放时由音频硬件将这些音符播放出来。

Midi格式(文件扩展名是.MID)是存储数字音乐的标准格式。

DirectMusic 音乐片段(music segments)使用.SGT文件扩展名,其他的相关文件包括乐队文件(band file .BND),这种文件里面包含乐器信息;弦映射表文件(chordmaps file .CDM)包含在回放时修改音乐的和弦指令;样式文件(styles file .STY)包含回放样式信息;模板文件(templates file .TPL)包含创造音乐片段的模板。  

posted @ 2009-05-19 15:45  龙仪  阅读(1771)  评论(0编辑  收藏  举报