65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (20投票s)

2008年12月12日

CPOL

3分钟阅读

viewsIcon

281363

downloadIcon

17759

一篇展示如何使用 DirectSound 播放音频文件并实时准确显示其频谱的文章

引言

本文是我文章的改进版本:使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分。 在本文中,我增加了对 MP3、WMA、WAV 和 OGG Vorbis 的支持,这需要 Windows Media 9 或更高版本的支持,并且我做了一些额外的工作来重组代码。 在本文之前,Code Project 上发布过两篇文章,它们列在下面。

输入

输入流包括文件、CD、麦克风等等。 在本文中,输入流是音频文件。 因此,我将CInput定义为所有输入类型的基类,并在该类中定义了一些纯虚函数。 函数GetDataInternal必须由派生类实现,该函数从音频文件读取音频数据并将其填充到缓冲区中。

在本文中,我使用WMF(Windows Media Format)解码WMA格式。 使用的主要接口是IWMSyncReaderINSSBufferIWMHeaderInfoIWMSyncReader接口提供了使用同步调用读取WMA文件的能力。 INSSBuffer接口是缓冲区对象的基本接口。 缓冲区对象是内存缓冲区的包装器。 此接口公开的方法用于操作缓冲区。 IWMHeaderInfo接口设置和检索ASF文件头部分的信息。 您可以使用此接口的方法操作三种类型的标头信息:元数据属性、标记和脚本命令。 您可以阅读MSDN了解更多信息。

诸如libmadlibogglibvorbis之类的库都集成在此应用程序中。 我为MP3、WMA、WAV和OGG Vorbis文件读取定义了四个类,分别是CWMInCWaveInCMP3InCVorbisIn。 有关更多详细信息,请阅读代码。

该应用程序使用libmad解码mp3文件,它不再依赖于WMF(Windows Media Format),这个库太棒了,我喜欢它。 :)

输出

此组件已在使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分中实现,使用DirectSound进行输出。 因此,如果您对此有任何疑问,您应该首先阅读它。 您也可以使用关键字DirectSoundCodeProject上搜索; 你会得到很多关于它的文章。

期望

我总是觉得窗口中显示的频谱不正确,尤其是在播放某些声音文件时。 所以,我希望我能在这方面得到帮助,并彻底解决它。

错误修复

在文章使用DirectSound播放Wave文件并实时显示其频谱 - 第 2 部分中存在一些错误。 我已经做了很多工作来修复它。 可能存在未知的错误,这需要时间才能找到。 如果你发现了任何错误,请告诉我。 谢谢。

历史

  • 2008年12月23日:发布了新版本,支持mp3、wav、wma和ogg。 另一件重要的事情是,使用libmad解码mp3文件,而不再依赖于WMF(Windows Media Format)。
  • 2008 年 12 月 12 日:首次发布
© . All rights reserved.