CN104793917B - 一种实时获取Cocos2d‑x游戏播放声音的方法 - Google Patents
一种实时获取Cocos2d‑x游戏播放声音的方法 Download PDFInfo
- Publication number
- CN104793917B CN104793917B CN201510070822.1A CN201510070822A CN104793917B CN 104793917 B CN104793917 B CN 104793917B CN 201510070822 A CN201510070822 A CN 201510070822A CN 104793917 B CN104793917 B CN 104793917B
- Authority
- CN
- China
- Prior art keywords
- game
- frame
- cocos2d
- sound
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Abstract
本发明公开了一种实时获取Cocos2d‑x游戏播放声音的方法,通过创建一个服务于Cocos2d‑x游戏开发人员的特殊Framework来获取游戏播放的声音;在该Framework中完整的重新编译实现了OpenAL库,并在OpenAL库实现中加入特定的回调函数用于获得当前播放的音频帧;并且通过引入全局的Cocos2d‑x共享Director来获得回调接口,并添加回调函数用于监控Cocos2d‑x游戏的每一帧,以此获得当前AVPlayer的播放状态并获得当前播放的音频帧;最后将获得的多路原始音频帧进行合并以获得混合后的声音帧,获得的声音帧和玩游戏的用户听到的声音完全一致;本方法为游戏开发人员提供了一种实时处理、保存游戏运行中的声音的方法。
Description
技术领域
本发明涉及一种实时获取Cocos2d-x游戏播放声音的方法,具体是指在游戏运行的过程中自动获取当前游戏播放的所有声音数据的方法。
背景技术
Cocos2d-x是一个支持多平台的2D手机游戏引擎,使用C++开发,基于OpenGL ES,基于Cocos2d-iphone,支持WOPhone,iOS 4.1,Android 2.1及更高版本,WindowsXP&Windows7,WindowsPhone 8。采用Cocos2d-x提供的SDK可以很容易地建立和运行IOS平台下的手机游戏。
IOS平台下Cocos2d-x提供了两种声音引擎,分别基于OpenAL和AVFoundation来进行封装实现。基于OpenAL的引擎主要用于提供实时的声效播放,例如游戏中的射击声音等;基于AVFoundation的声音引擎主要采用AVPlayer来实现,主要用于播放游戏的背景音乐。因此在基于Cocos2d-x开发的游戏中有两种声音播放源头。在游戏开发时,游戏开发人员有时需要对游戏运行中的声音特进行特殊处理以实现特殊的音乐效果,例如加入白噪声、变音等;此外游戏开发人员可能需要保存游戏运行过程中的声音用于回放游戏过程。为了实现这些特殊目的,就必须获得当前游戏中正在播放的所有的声音,并且需要实时的对当前播放的多路声音数据进行合成并处理。
为了实现上述目的,传统的方式分为两种:
(1)不采用Cocos2d-x提供的声音引擎,自己封装一套声音引擎,这样整个游戏运行期间的声音播放都由自己的声音引擎代码来控制,包括声音数据的加载、管理、播放、进度控制等等。这种方式的缺点是实现工作量大,并且自己封装的稳定性难以保证,和Cocos2d-x的兼容性也难以保证。
(2)修改Cocos2d-x的声音引擎源码,将自己的处理加入到引擎中。这种方式的实现无法保证通用性,针对正常播放的数据可能会产生破坏性的作用,并且有可能会破坏Cocos2d-x的完整性,此外只能针对单个应用,难以移植。
上面两种传统方式的一个共同的缺点是:由于OpenAL和AVFoundation都是以二进制库形式提供的底层播放基础,因此基于它们开发的声音播放只能实现播放声音文件,暂停播放,恢复播放等基本,而无法实时获得当前正准备送到声卡播放的音频数据帧。为了实现对当前播放声音的实时特殊处理就必须获得当前正播放的音频原始帧数据,并对音频帧数据进行实时处理才能满足需要。
发明内容
针对上述现有技术存在的问题,本发明提出通过重新编译提供OpenAL库函数实现并通过函数回调的方式获得当前播放的音频帧数据、并通过监控方式实时预加载Cocos2d-x的AVFoundation的AVPlayer播放的音频文件,通过音频时间轴计算的方式获得当前AVPlayer播放的音频帧,最后实时的将两种来源的音频帧数据进行合并,并通过回调函数的方式将合并后的当前播放的原始音频帧内容提供给游戏开发人员。
为了实现上述目的,本发明采用的手段是:
一种实时获取Cocos2d-x游戏播放声音的方法,通过创建一个服务于Cocos2d-x游戏开发人员的特殊Framework来获取游戏播放的声音,在该Framework中完整的重新编译实现OpenAL库;在OpenAL库实现中加入特定的回调函数用于获得当前播放的音频帧;并且通过引入全局的Cocos2d-x共享Director来获得回调接口,并添加回调函数用于监控Cocos2d-x游戏的每一帧,以此获得当前AVPlayer的播放状态并获得当前播放的音频帧,最后将获得的多路原始音频帧进行合并以获得混合后的声音帧,获得的声音帧和玩游戏的用户听到的声音完全一致,包括如下具体的步骤:
(1)创建一个用于IOS平台的Framework项目;
(2)引入OpenAL的代码实现,定义一个接收OpenAL播放的音频数据的函数get_openal_data(),并添加在OpenAL代码实现中音频处理函数处用于获得当前播放的音频帧;
(3)获得Cocos2d-x全局共享的Director对象并为其添加一个全局的事件回调Scheduler函数director_scheduler(),用于获得当前游戏每一帧的回调事件通知;该函数在游戏运行的每一帧都将被调用,这样就可以实时检测当前Cocos2d-x采用AVPlayer方式播放的声音文件,只要发现声音文件被切换了,就立即将当前播放的声音文件加载到内存,并根据声音文件的格式及当前播放的时间计算出当前播放的声音帧数据在内存中指针,具体的计算公式如下:
设当前播放的声音数据的指针为p,当前播放的音频帧数据指针为fp,并当前声音播放的第t秒,设音频每一帧为bf字节,音频采样频率为sr,则fp=p+t*sr*bf;
(4)在游戏运行的每一帧对采用前述步骤获得的两帧数据进行实时的合并,设获得音频帧为S1,S2,合并后的音频帧为S,则计算方式为:S=S1<0&&(S2<<16)<0?(S1+(S2<<16))-((S1*(S2<<16))/-2147483648):(S1>0&&(S2<<16)>0?(S1+(S2<<16))-((S1*(S2<<16))/2147483648):S1+(S2<<16));
(5)定义一个为Cocos2d-x游戏开发人员调用的函数get_playing_sound_dataframe(),通过该函数开发人员即可获得当前播放的游戏声音帧数据;另外定义一个用于初始化环境变量信息的函数init_environment()函数,通过该函数可以对一些必要的资源进行初始化;
(6)将Framework工程进行编译,设编译后的Framework名称为soundFramework。
采用如上的方法,本发明创建一个服务于Cocos2d-x游戏开发人员的特殊Framework。在该Framework中,提供函数用于获得当前Cocos2d-x游戏播放的音频帧,完整的重新编译实现了OpenAL库,在OpenAL库实现中加入特定的回调函数用于获得当前播放的音频帧;并且通过引入全局的Cocos2d-x共享Director获得回调接口,并添加回调函数用于监控Cocos2d-x游戏的每一帧,以此获得当前AVPlayer的播放状态并获得当前播放的音频帧。最后将获得的多路原始音频帧进行合并以获得混合后的声音帧,获得的声音帧和玩游戏的用户听到的声音完全一致
获得的soundFramework引入到Cocos2d-x游戏工程中,无需修改任何游戏的代码,更不需要修改Cocos2d-x的游戏引擎的源代码;只需要将soundFramework设置为游戏工程的Link Binary With Libraries中的一员即可;
游戏开发人员只需要在游戏初始化的时候调用init_environment()函数用于初始化soundFramework,当游戏开发人员需要对声音进行处理的时候,调用get_playing_sound_dataframe()函数即可获得当前游戏音频帧数据;
本发明与现有技术相比,具有如下的优点和有益效果:
●为游戏开发人员提供了一种实时处理游戏运行中的声音的方法,通过该方法可以精准的对当前播放的音频帧进行实时处理,用于实现特殊的音乐效果,例如加入白噪声、变音等;
●为游戏开发人员提供了一种用于保存游戏运行过程中声音数据的方法,并可以用于回放游戏过程;
●本发明实现的方法不需要修改Cocos2d-x游戏引擎的任何代码,这样保证了游戏引擎的完整性,并且保证了稳定性;此外游戏开发人员调用本发明的方式简单,不需要改动游戏的实现代码,易于后续升级与维护;
●本发明具有通用性和易用性。实现获取音频数据的Framework是预先编译的,可以在IOS平台下任何基于Cocos2d-x开发的游戏中使用,只需要简单的添加Framework到游戏项目中即可,节约了游戏开发人员的时间和精力。
附图说明
图1为使用本发明的游戏应用程序的架构图。
图2是图1中抓取游戏音频Framework的内部结构示意图。
图3是应用实现本发明时的流程图。
具体实施方式
下面结合实施例对本发明作进一步的详细说明,但本发明的实施方式不限于此。
实施例
如图1、2所示,本发明是作为一个IOS Framework的形式存在并提供给游戏开发人员使用的,在Cocos2d-x游戏开发人员使用本发明时,只需要把实现的Framework添加到游戏工程,并调用Framework提供的接口函数即可。在运行时该Framework将自动获取Cocos2d-x游戏的声音数据提供给游戏开发人员使用。
如图2所示,获取声音数据的Framework主要包含4个模块:OpenAL实现模块;Cocos2d-x scheduler实现模块;合并多路音频数据的模块;音频数据管理模块。
OpenAL实现模块主要完成替换IOS系统的OpenAL库,提供和IOS系统提供的OpenAL的库一样的功能,将Cocos2d-x对OpenAL的调用引入到自己实现的OpenAL中用于获取播放的音频数据。
Cocos2d-x scheduler实现模块用于实现符合Cocos2d-x事件监控回调Scheduler标准的回调类及相应的函数实现。将实现的Scheduler挂接到全局的Director对象后即可监控游戏每一帧的回调事件通知,这样游戏运行的每一帧都将会回调通知事件,这样就可以检测当前Cocos2d-x采用AVPlayer方式播放的声音文件的变化与播放状态的变化,例如播放开始、暂停、恢复、快进、音量变化等。
合并多路音频数据的模块对多路来源的音频数据进行统一的格式化,并按照相应的计算公式进行数据的归一化合并计算,获得统一的完整的合成的音频数据。
音频数据管理模块用于管理当前AVFoundation方式播放的音频数据文件的预加载与数据定位,根据监控获得信息对数据指向的指针进行对应的移位操作,以便于快速精准的获取当前播放的音频帧数据。
为了更好的实现本发明,结合图3所示详细解释实现本发明的步骤如下:
步骤1:创建一个用于IOS平台的Framework项目,定义Framework提供的接口函数init_environment()和get_playing_sound_dataframe();
步骤2:导入OpenAL的代码实现;
步骤3:实现一个用于接收OpenAL音频数据的函数get_openal_data();将该函数并添加在OpenAL实现代码中的音频处理函数处,用于获得当前播放的音频帧;
步骤4:获得Cocos2d-x全局共享的Director对象并为其添加一个全局的事件回调Scheduler函数director_scheduler(),用于获得当前游戏每一帧的回调事件通知;
步骤5:通过上一步骤的回调函数,可以在每一帧实时的检测当前Cocos2d-x采用AVPlayer方式播放的声音文件,只要发现声音文件被切换了,就立即将当前播放的声音文件加载到内存,并根据声音文件的格式及当前播放的时间计算出当前播放的声音帧数据在内存中指针,具体的计算公式如下:
设当前播放的声音数据的指针为p,设当前播放的音频帧数据指针为fp,并设当前声音播放的第t秒,同时设音频每一帧为bf字节,音频采样频率为sr,则fp=p+t*sr*bf;
步骤6:实现获取多路原始音频数据后,需要将音频数据进行实时合并,设获得音频帧为S1,S2,合并后的音频帧为S,则计算方式为:S=S1<0&&(S2<<16)<0?(S1+(S2<<16))-((S1*(S2<<16))/-2147483648):(S1>0&&(S2<<16)>0?(S1+(S2<<16))-((S1*(S2<<16))/2147483648):S1+(S2<<16));
步骤S7:定义一个用于为Cocos2d-x游戏开发人员调用的函数get_playing_sound_dataframe(),通过该函数开发人员即可获得当前播放的游戏声音帧数据;另外定义一个用于初始化环境变量信息的函数init_environment()函数,通过该函数可以对一些必要的资源进行初始化;
如上所述,便可以很好的实现本发明。
Claims (1)
1.一种实时获取Cocos2d-x游戏播放声音的方法,通过创建一个服务于Cocos2d-x游戏开发人员的特殊Framework来获取游戏播放的声音,在该Framework中完整的重新编译实现OpenAL库;在OpenAL库实现中加入特定的回调函数get_openal_data()用于获得当前播放的音频帧;并且通过引入全局的Cocos2d-x共享Director来获得回调接口,并添加回调函数用于监控Cocos2d-x游戏的每一帧,以此获得当前AVPlayer的播放状态并获得当前播放的音频帧,最后将获得的多路原始音频帧进行合并以获得混合后的声音帧,获得的声音帧和玩游戏的用户听到的声音完全一致,包括如下具体的步骤:
(1)创建一个用于IOS平台的Framework项目;
(2)引入OpenAL的代码实现,定义一个接收OpenAL播放的音频数据的函数get_openal_data(),并添加在OpenAL代码实现中音频处理函数处用于获得当前播放的音频帧;
(3)获得Cocos2d-x全局共享的Director对象并为其添加一个全局的事件回调Scheduler函数director_scheduler(),用于获得当前游戏每一帧的回调事件通知;该函数在游戏运行的每一帧都将被调用,具体的计算公式如下:
设当前播放的声音数据的指针为p,当前播放的音频帧数据指针为fp,并当前声音播放的第t秒,设音频每一帧为bf字节,音频采样频率为sr,则fp=p+t*sr*bf;
从而检测当前Cocos2d-x采用AVPlayer方式播放的声音文件的变化与播放状态的变化,获取当前播放音频帧;
(4)在游戏运行的每一帧对采用步骤(2)和步骤(3)分别获得的音频帧数据进行实时的合并,设获得音频帧为S1,S2,合并后的音频帧为S,则计算方式为:S=S1<0&&(S2<<16)<0?(S1+(S2<<16))-((S1*(S2<<16))/-2147483648):(S1>0&&(S2<<16)>0?(S1+(S2<<16))-((S1*(S2<<16))/2147483648):S1+(S2<<16));
(5)定义一个为Cocos2d-x游戏开发人员调用的函数get_playing_sound_dataframe(),通过该函数开发人员即可获得当前播放的游戏声音帧数据;另外定义一个用于初始化环境变量信息的函数init_environment()函数,通过该函数可以对一些必要的资源进行初始化;
(6)将Framework工程进行编译,设编译后的Framework名称为soundFramework。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510070822.1A CN104793917B (zh) | 2015-02-10 | 2015-02-10 | 一种实时获取Cocos2d‑x游戏播放声音的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510070822.1A CN104793917B (zh) | 2015-02-10 | 2015-02-10 | 一种实时获取Cocos2d‑x游戏播放声音的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104793917A CN104793917A (zh) | 2015-07-22 |
CN104793917B true CN104793917B (zh) | 2017-09-12 |
Family
ID=53558736
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510070822.1A Expired - Fee Related CN104793917B (zh) | 2015-02-10 | 2015-02-10 | 一种实时获取Cocos2d‑x游戏播放声音的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104793917B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108200482B (zh) * | 2018-01-16 | 2020-07-21 | 威创集团股份有限公司 | 一种跨平台高清音视频播放方法、系统及客户端 |
CN113596704A (zh) * | 2020-04-30 | 2021-11-02 | 上海风语筑文化科技股份有限公司 | 一种实时空间指向性立体声解码方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102622236A (zh) * | 2012-01-13 | 2012-08-01 | 深圳市妙趣工场信息科技有限公司 | 一种Geart3D游戏引擎 |
CN103096134A (zh) * | 2013-02-08 | 2013-05-08 | 广州博冠信息科技有限公司 | 一种基于视频直播和游戏的数据处理方法和设备 |
CN103905885A (zh) * | 2014-03-25 | 2014-07-02 | 广州华多网络科技有限公司 | 视频直播方法及装置 |
CN104008565A (zh) * | 2014-05-26 | 2014-08-27 | 桂林力港网络科技有限公司 | 一种利用cocos2d-x以及HGE引擎播放Flash位图动画的系统和方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101872632A (zh) * | 2004-12-01 | 2010-10-27 | 松下电器产业株式会社 | 集成电路 |
US8819172B2 (en) * | 2010-11-04 | 2014-08-26 | Digimarc Corporation | Smartphone-based methods and systems |
-
2015
- 2015-02-10 CN CN201510070822.1A patent/CN104793917B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102622236A (zh) * | 2012-01-13 | 2012-08-01 | 深圳市妙趣工场信息科技有限公司 | 一种Geart3D游戏引擎 |
CN103096134A (zh) * | 2013-02-08 | 2013-05-08 | 广州博冠信息科技有限公司 | 一种基于视频直播和游戏的数据处理方法和设备 |
CN103905885A (zh) * | 2014-03-25 | 2014-07-02 | 广州华多网络科技有限公司 | 视频直播方法及装置 |
CN104008565A (zh) * | 2014-05-26 | 2014-08-27 | 桂林力港网络科技有限公司 | 一种利用cocos2d-x以及HGE引擎播放Flash位图动画的系统和方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104793917A (zh) | 2015-07-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108228188B (zh) | 一种视图组件处理方法、电子设备及可读存储介质 | |
EP3417380B1 (en) | Recording web conferences | |
CN104424022B (zh) | 屏幕录制方法及装置 | |
Wyse et al. | The viability of the web browser as a computer music platform | |
CN109582463A (zh) | 资源配置方法、装置、终端及存储介质 | |
US10248474B2 (en) | Application event distribution system | |
US11738277B2 (en) | Game testing system | |
CN103905644A (zh) | 移动终端通话界面的生成方法及设备 | |
CN106293659A (zh) | 一种音频实时处理方法、装置及智能终端 | |
CN104793917B (zh) | 一种实时获取Cocos2d‑x游戏播放声音的方法 | |
CN107636541A (zh) | 用投射闹钟或闹钟加内容提示唤醒 | |
CN102609302A (zh) | 一种多媒体应用的并发管理方法和装置 | |
CN107391219A (zh) | 函数编译方法和装置 | |
CN104394477A (zh) | 一种实现视频在线视频编辑的方法 | |
CN111258530B (zh) | 音频播放控制方法和服务器以及音频播放系统 | |
CN108513149A (zh) | 一种直播延迟测试方法及其装置 | |
CN113421578A (zh) | 音频处理方法、装置、电子设备及存储介质 | |
KR101603676B1 (ko) | 휴대용 기기들을 위한 오디오 장치 | |
WO2007005661A3 (en) | Systems and methods for adding media from a content input device into a loop | |
CN108073424A (zh) | 组件接口的调用方法及装置 | |
CN108566417A (zh) | 一种基于安卓系统的多线程断点续传下载系统及方法 | |
US20170194032A1 (en) | Process for automated video production | |
CN109669691A (zh) | 基于嵌入式Linux音频播放器的平台通用控制方法及系统 | |
CN112988552B (zh) | 应用程序测试方法、装置、设备及存储介质 | |
CN103781014B (zh) | 一种从安卓系统获取真立体声数据的方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20170912 Termination date: 20200210 |
|
CF01 | Termination of patent right due to non-payment of annual fee |