第16讲游戏中的声音处理技术

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第16讲游戏中的声音处理技术FMOD1.DirectShow介绍DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件。DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其它用途的DirectShow组件。DirectShow是建立在组件对象模型(COM)上的,因此当你编写DirectShow应用时,你必须具备COM客户端程序编写的知识。对于大部分的应用,你不需要实现自己的COM对象,DirectShow提供了大部分你需要的DirectShow组件。2、介绍几个接口IGraphBuilder*m_pGraph;//IGraphBuilder接口提供了生成FilterGraph相关的方法IMediaControl*m_pMediaControl;//IMediaControl接口提供了控制流经FilterGraph数据流的相关方法IMediaEventEx*m_pEvent;//IMediaEventEx继承自IMediaEvent,提供了从FilterGraph管理器获取事件消息的方法IMediaSeeking*m_pMediaSeeking;//IMediaSeeking提供了控制流的播放位置和播放速度的方法IBasicAudio*m_pBasicAudio;//IBasicAudio接口提供了声音和声道的部分处理,如音量大小和音量均衡等IBaseFilter*m_pMpegAFilter;//在用新的过滤器(Filter)控制声道的时候用到的接口IMpegAudioDecoder*m_pMpegAudioDec;//一个Filter接口,提供了提取和分配声道功能有了这些接口,我们就可以在自己的类中进行封装了。注意的是要用这些接口来编程需要设置一些环境,如include和lib3、编写一个DirectShow应用程序大体需要三个步骤:1.创建一个FilterGraphManager的实例2.使用FilterGraphManager创建一个filtergraph,此时,需要已经具备所有必需的filter。3.使用FilterGraphManager控制filtergraph和通过这些filter的流,在这个过程中,应用程序会收到FilterGraphManager发送的事件第一步,首先,需要调用CoInitialize来作初始化,然后调用CoCreateInstance创建FilterGraphManager//初始化COM接口HRESULThr=CoInitialize(NULL);if(FAILED(hr)){TRACE(ERROR-CouldnotinitializeCOMlibrary.\n);returnFALSE;}hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGraph);退出的时候别忘了:CoUninitialize();二、设置需要的接口(m_pMediaControl,m_pBasicAudio,m_pMediaPosition,m_pMediaSeeking)m_pGraph-QueryInterface(IID_IMediaControl,(void**)&m_pMediaControl);m_pGraph-QueryInterface(IID_IMediaPosition,(void**)&m_pMediaPosition);m_pGraph-QueryInterface(IID_IBasicAudio,(void**)&m_pBasicAudio);m_pGraph-QueryInterface(IID_IMediaSeeking,(void**)&m_pMediaSeeking);m_pMediaSeeking-GetPositions(&m_curpos,&m_stoppos);m_filelength=m_stoppos-0;//得到媒体文件的总大小——帧数三、如果不是重新打开一个文件,而只是暂停之后的播放则Play函数可简化:m_pMediaControl-Run();如果需要打开文件,则:WCHARwstrSoundPath[MAX_PATH];//将文件名转化为UNICODE形式MultiByteToWideChar(CP_ACP,0,szSoundFileName,-1,wstrSoundPath,MAX_PATH);m_pGraph-RenderFile(wstrSoundPath,NULL);m_pMediaPosition-put_CurrentPosition(0);//从什么位置开始播放m_pMediaControl-Run();//播放四、其他功能的实现在第二步所有接口的挂接基础之上,其他功能的实现就十分简单了,下面简要介绍。1BOOLPause(void){if(m_pMediaControl!=NULL)//isplaying{m_pMediaControl-Pause();returnTRUE;}returnFALSE;}2BOOLStop(void){if(m_pMediaControl){m_pMediaControl-Stop();m_pMediaControl-Release();m_pMediaControl=NULL;returnTRUE;}returnFALSE;}3BOOLSetVolume(longvol){if(!m_pBasicAudio)returnFALSE;m_pBasicAudio-put_Volume(vol);//get_Volume可以得到当前音量//注意,0为最大,-10000为最小,即静音。所以如果设置大于0,则自动设为0returnTRUE;}4BOOLSetChannel(intchannel){if(!m_pMpegAudioDec)return;//channel---AM_MPEG_AUDIO_DUAL_LEFT为左声道m_pMpegAudioDec-put_DualMode(channel);}5BOOLSetPrecess(LONGLONGpos){if(!m_pMediaSeeking)returnFALSE;m_pMediaSeeking-SetPositions(&pos,AM_SEEKING_AbsolutePositioning,&m_stoppos,AM_SEEKING_AbsolutePositioning);returnTRUE;}mp3播放实例:1、mp3.h文件#pragmaonce#includedshow.h//#includewindows.hclassCMP3{public:CMP3();~CMP3();boolInit(constchar*szSoundFileName);boolPause();boolplay();boolSetVolume(longvol);//boolSetPrecess(LONGLONGpos);private:IGraphBuilder*m_pGraph;//播放的设备IMediaControl*m_pMediaControl;//播放的控制器IMediaPosition*m_pMediaPosition;//播放的位置IBasicAudio*m_pBasicAudio;//IBasicAudio接口提供了声音和声道的部分处理,如音量大小和音量均衡等};2、mp3.cpp文件#includeMP3.HCMP3::CMP3(){CoInitialize(NULL);//初始化COM接口CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGraph);m_pGraph-QueryInterface(IID_IMediaControl,(void**)&m_pMediaControl);m_pGraph-QueryInterface(IID_IMediaPosition,(void**)&m_pMediaPosition);m_pGraph-QueryInterface(IID_IBasicAudio,(void**)&m_pBasicAudio);//m_pGraph-QueryInterface(IID_IMediaSeeking,(void**)&m_pMediaSeeking);}CMP3::~CMP3(){m_pMediaControl-Stop();m_pMediaControl-Release();m_pMediaPosition-Release();m_pBasicAudio-Release();m_pGraph-Release();CoUninitialize();}boolCMP3::Init(constchar*szSoundFileName){WCHARwstrSoundPath[MAX_PATH];//将文件名转化为UNICODE形式MultiByteToWideChar(CP_ACP,0,szSoundFileName,-1,wstrSoundPath,MAX_PATH);m_pGraph-RenderFile(wstrSoundPath,NULL);m_pMediaPosition-put_CurrentPosition(0);//从什么位置开始播放//m_pMediaControl-Run();//播放returntrue;}boolCMP3::play(){m_pMediaControl-Run();//播放returntrue;}boolCMP3::Pause(){m_pMediaControl-Pause();//m_pMediaSeeking-GetPositions(&m_curpos,&m_stoppos)returntrue;}boolCMP3::SetVolume(longvol){if(!m_pBasicAudio)returnFALSE;m_pBasicAudio-put_Volume(vol);//get_Volume可以得到当前音量//注意,为最大,-10000为最小,即静音。所以如果设置大于,则自动设为returnTRUE;}在项目属性中添加:Strmiids.lib在winmain()函数所在开头文件添加#includemp3.hCMP3*Pmp3;在InitD3D()函数实例化对象指针Pmp3;Pmp3=newCMP3();Pmp3-Init(星月神话.mp3);在Render()函数添加:播放功能if(g_pKeyStateBuffer[DIK_SPACE]&0x80){Pmp3-play();}if(g_pKeyStateBuffer[DIK_LEFT]&0x80){vol+=100;if(vol=0)vol=0;}if(g_pKeyStateBuffer[DIK_RIGHT]&0x80){vol-=100;if(vol=-10000)vol=-10000;}if(g_pKeyStateBuffer[DIK_SPACE]&0x80){Pmp3-play();}Pmp3-SetVolume(vol);Avi文件播放类文件#includedshow.h#includewindows.hclassCAVI{pub

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功