使用 DirectSound 播放音频文件并实时显示其频谱 - 第三部分






4.93/5 (20投票s)
一篇展示如何使用 DirectSound 播放音频文件并实时准确显示其频谱的文章
- 下载源代码 - 137.84 KB (原始版本,发布于 2008-12-12)
- 下载源代码 - 934 KB (新版本,发布于 2008-12-23)
- 下载编译后的二进制文件 - 239 KB

引言
本文是我文章的改进版本:使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分。 在本文中,我增加了对 MP3、WMA、WAV 和 OGG Vorbis 的支持,这需要 Windows Media 9 或更高版本的支持,并且我做了一些额外的工作来重组代码。 在本文之前,Code Project 上发布过两篇文章,它们列在下面。
- 使用DirectSound播放Wave文件并实时显示其频谱,这篇文章是原始版本,仅支持wave格式。
- 使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分,这篇文章是之前的改进版本。
输入
输入流包括文件、CD、麦克风等等。 在本文中,输入流是音频文件。 因此,我将CInput
定义为所有输入类型的基类,并在该类中定义了一些纯虚函数。 函数GetDataInternal
必须由派生类实现,该函数从音频文件读取音频数据并将其填充到缓冲区中。
在本文中,我使用WMF(Windows Media Format)解码WMA格式。 使用的主要接口是IWMSyncReader
、INSSBuffer
、IWMHeaderInfo
。 IWMSyncReader
接口提供了使用同步调用读取WMA文件的能力。 INSSBuffer
接口是缓冲区对象的基本接口。 缓冲区对象是内存缓冲区的包装器。 此接口公开的方法用于操作缓冲区。 IWMHeaderInfo
接口设置和检索ASF文件头部分的信息。 您可以使用此接口的方法操作三种类型的标头信息:元数据属性、标记和脚本命令。 您可以阅读MSDN了解更多信息。
诸如libmad、libogg和libvorbis之类的库都集成在此应用程序中。 我为MP3、WMA、WAV和OGG Vorbis文件读取定义了四个类,分别是CWMIn
、CWaveIn
、CMP3In
和CVorbisIn
。 有关更多详细信息,请阅读代码。
该应用程序使用libmad解码mp3文件,它不再依赖于WMF(Windows Media Format),这个库太棒了,我喜欢它。 :)
输出
此组件已在使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分中实现,使用DirectSound进行输出。 因此,如果您对此有任何疑问,您应该首先阅读它。 您也可以使用关键字DirectSound
在CodeProject上搜索; 你会得到很多关于它的文章。
期望
我总是觉得窗口中显示的频谱不正确,尤其是在播放某些声音文件时。 所以,我希望我能在这方面得到帮助,并彻底解决它。
错误修复
在文章使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分中存在一些错误。 我已经做了很多工作来修复它。 可能存在未知的错误,这需要时间才能找到。 如果你发现了任何错误,请告诉我。 谢谢。
历史
- 2008年12月23日:发布了新版本,支持mp3、wav、wma和ogg。 另一件重要的事情是,使用libmad解码mp3文件,而不再依赖于WMF(Windows Media Format)。
- 2008 年 12 月 12 日:首次发布