第16讲 游戏中的声音处理技术.doc_第1页
第16讲 游戏中的声音处理技术.doc_第2页
第16讲 游戏中的声音处理技术.doc_第3页
第16讲 游戏中的声音处理技术.doc_第4页
第16讲 游戏中的声音处理技术.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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 接口提供了生成Filter Graph相关的方法IMediaControl*m_pMediaControl;/ IMediaControl 接口提供了控制流经Filter Graph数据流的相关方法IMediaEventEx*m_pEvent;/ IMediaEventEx 继承自IMediaEvent,提供了从Filter Graph 管理器获取事件消息的方法IMediaSeeking*m_pMediaSeeking;/ IMediaSeeking 提供了控制流的播放位置和播放速度的方法IBasicAudio* m_pBasicAudio;/ IBasicAudio接口提供了声音和声道的部分处理,如音量大小和音量均衡等IBaseFilter* m_pMpegAFilter;/ 在用新的过滤器(Filter)控制声道的时候用到的接口IMpegAudioDecoder*m_pMpegAudioDec;/ 一个Filter接口,提供了提取和分配声道功能有了这些接口,我们就可以在自己的类中进行封装了。注意的是要用这些接口来编程需要设置一些环境,如include和lib3、编写一个DirectShow应用程序大体需要三个步骤: 1.创建一个Filter Graph Manager的实例 2.使用Filter Graph Manager创建一个filter graph,此时,需要已经具备所有必需的filter。 3.使用Filter Graph Manager控制filter graph和通过这些filter的流,在这个过程中,应用程序会收到Filter Graph Manager发送的事件第一步,首先,需要调用CoInitialize来作初始化,然后调用CoCreateInstance创建Filter Graph Manager/初始化COM接口HRESULT hr = CoInitialize(NULL);if (FAILED(hr) TRACE(ERROR - Could not initialize COM library.n); return FALSE;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();如果需要打开文件,则:WCHAR wstrSoundPathMAX_PATH;/将文件名转化为UNICODE形式MultiByteToWideChar(CP_ACP, 0, szSoundFileName, -1, wstrSoundPath, MAX_PATH);m_pGraph-RenderFile(wstrSoundPath, NULL);m_pMediaPosition-put_CurrentPosition(0);/从什么位置开始播放m_pMediaControl-Run();/播放四、其他功能的实现在第二步所有接口的挂接基础之上,其他功能的实现就十分简单了,下面简要介绍。1BOOL Pause(void) if(m_pMediaControl != NULL) / isplaying m_pMediaControl-Pause(); return TRUE; return FALSE;2 BOOL Stop(void) if(m_pMediaControl) m_pMediaControl-Stop();m_pMediaControl-Release(); m_pMediaControl = NULL;return TRUE; return FALSE;3 BOOL SetVolume(long vol) if(!m_pBasicAudio) return FALSE; m_pBasicAudio-put_Volume(vol);/ get_Volume可以得到当前音量 /注意,0为最大,-10000为最小,即静音。所以如果设置大于0, 则自动设为0 return TRUE;4 BOOL SetChannel(int channel) if(!m_pMpegAudioDec) return; / channel - AM_MPEG_AUDIO_DUAL_LEFT为左声道m_pMpegAudioDec-put_DualMode(channel);5 BOOL SetPrecess(LONGLONG pos) if(!m_pMediaSeeking) return FALSE; m_pMediaSeeking-SetPositions(&pos, AM_SEEKING_AbsolutePositioning , &m_stoppos, AM_SEEKING_AbsolutePositioning); return TRUE;mp3播放实例:1、mp3.h文件#pragma once#include /#include class CMP3public:CMP3();CMP3();bool Init(const char* szSoundFileName);bool Pause();bool play();bool SetVolume(long vol);/bool SetPrecess(LONGLONG pos);private:IGraphBuilder*m_pGraph;/播放的设备IMediaControl*m_pMediaControl;/播放的控制器IMediaPosition*m_pMediaPosition;/播放的位置IBasicAudio * m_pBasicAudio; / IBasicAudio接口提供了声音和声道的部分处理,如音量大小和音量均衡等;2、mp3.cpp文件#include MP3.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();bool CMP3:Init(const char* szSoundFileName)WCHAR wstrSoundPathMAX_PATH;/将文件名转化为UNICODE形式MultiByteToWideChar(CP_ACP, 0, szSoundFileName, -1, wstrSoundPath, MAX_PATH);m_pGraph-RenderFile(wstrSoundPath, NULL);m_pMediaPosition-put_CurrentPosition(0);/从什么位置开始播放/m_pMediaControl-Run();/播放return true;bool CMP3:play()m_pMediaControl-Run();/播放return true;bool CMP3:Pause()m_pMediaControl-Pause();/m_pMediaSeeking-GetPositions(&m_curpos,&m_stoppos)return true;bool CMP3:SetVolume(long vol) if(!m_pBasicAudio) return FALSE; m_pBasicAudio-put_Volume(vol);/ get_Volume可以得到当前音量 /注意,为最大,-10000为最小,即静音。所以如果设置大于, 则自动设为 return TRUE;在项目属性中添加:Strmiids.lib在winmain()函数所在开头文件添加#includemp3.hCMP3 *Pmp3;在InitD3D()函数实例化对象指针Pmp3;Pmp3 = new CMP3();Pmp3-Init(星月神话.mp3);在Render()函数添加:播放功能if (g_pKeyStateBufferDIK_SPACE & 0x80) Pmp3-play();if (g_pKeyStateBufferDIK_LEFT & 0x80)vol+=100; if(vol=0) vol=0; if (g_pKeyStateBufferDIK_RIGHT & 0x80) vol-=100; if(volplay(); Pmp3-SetVolume(vol);Avi文件播放类文件#include #include class CAVIpublic:CAVI();CAVI();bool init(const char* szAviFileName);bool Pause();bool play();void setFullScreenMode(HWND);private:IGraphBuilder*m_pGraph;/播放的设备IMediaControl*m_pMediaControl;/播放的控制器IVideoWindow*m_pVw;IMediaEvent*m_pEvent;类实现文件#include AVI.HCAVI:CAVI()CoInitialize(NULL);/初始化COM接口CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,IID_IGraphBuilder, (void*) &m_pGraph);m_pGraph-QueryInterface(IID_IVideoWindow,(void*) &m_pVw);m_pGraph-QueryInterface(IID_IMediaControl,(void*) &m_pMediaControl);m_pGraph-QueryInterface(IID_IMediaPosition,(void*) &m_pEvent);CAVI:CAVI()m_pMediaControl-Stop();m_pMediaControl-Release();m_pEvent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论