Vistb's Tiny IT Space

Am I a Geek?

导航

使用OpenGL与fmod实现音乐可视化效果(简单频谱浏览)

Posted on 2011-01-21 15:59  Vistb  阅读(6084)  评论(2编辑  收藏  举报

好久没写日志了,主要是懒的写。不管是生活还是学习,都懒得写……不过最近觉得还是写写好,而且有了很好的动力,主要是准备在学习OpenGL、GLSL等一系列有关多媒体的工具库的过程中依据所学到的东西,结合实际做一些简单、有趣(但不一定实用)的小demo。分享经验,也算留个备份。

相关的源码和可执行文件可以在GoogleCode上浏览和下载:http://code.google.com/p/multimedia-fun/

今天第一篇说说利用OpenGL和fmod实现可视化效果。

音乐的可视化效果大家应该都知道,下图就是Windows Media Player中的一个简单的可视化效果。

 

但是大家有没有想过这些效果是怎么实现的呢?其实原理很简单,就是将音乐的频谱的一些数值属性与我们所见的图像的一些属性(如颜色、亮度等等)相关联,当音乐进行时,由于声音属性在不断变化,图像的属性也不断变化,由此产生的动画效果,也就是所谓的可视化效果了。那什么又是频谱呢?我们知道所有声音都是不同频率(的震动)组合而成的,而每个频率的震动的振幅各不相同。这种针对声音的,以频率为横轴,震动幅度为纵轴的图像就是频谱,频谱可以被看做为最简单的音乐可视化效果之一。下图就是WMP中的频谱可视化效果。

 

明白了原理后,实现频谱可视化效果就简单了。使用OpenGLfreeglut(glut的“等价”替代品)作为图像库,fmod作为音频库。OpenGL不用多说,freeglut是免费开源产品,fmod是商业产品,但用于非商业用途时免费。之所以选用fmod而不适用irrKlang、OpenAL等,是因为其使用简单、功能强大,而且有直接的API(FMOD::Channel的getSpectrum方法)可以很方便的获得声音的频谱信息。

有关OpenGL的东西就不细说了,fmod本人也是刚入门,可以参照快速指南写出简单的程序(我就是参照那个的)。

最后贴一个程序最终截图。

 

程序源码地址:http://code.google.com/p/multimedia-fun/source/browse/trunk/Multimedia%20Fun/fmod-spectrum-1/main.cpp

可执行程序下载(务必先安装vc2010运行库):http://multimedia-fun.googlecode.com/files/fmod-spectrum-1.rar

最后分享几个小经验:

  1. FMOD::Channel::getSpectrum()函数的numvalues必须为2的幂次。
  2. 设置声音循环可以使用FMOD::Sound::setMode()函数,并以FMOD_LOOP_NORMAL为参数。设置循环次数可以使用FMOD::Channel::SetLoopCount()函数。同时,setMode()必须在FMOD::System::playSound()之前调用才有效果,否则则在下一次调用playSound()后起效。
  3. FMOD::Channel::getSpectrum()只在FMOD::Sound的模式为FMOD_SOFTWARE时才有效。FMOD::Sound的模式可以在FMOD::System::createSound()时指定。
  4. 很奇怪的一点,我也不确定。貌似glColor*要在glRasterPos*前调用才会对glutBitmapCharacter()渲染出的字符的颜色起作用。