cocos2d-x的音頻引擎是cocosDenshion, 它的Android版比較弱, 只能播放一個背景音樂和些許音效, 如果要實現稍微復雜一點的音頻播放, 比如同時播放幾個音軌就不能了. 這一點遠不及iOS版.
對於普通的游戲, 背景音樂加音效也夠用了. 但是對於音樂類游戲, 就不行了.
fmod音頻引擎是一個非常專業的音頻引擎, 除了能同時播放多個音軌, 還有其他強大的功能.
使用起來也非常簡單:
1. 去fmod.org下載 fmod ex的android版本
2. 解壓縮后, 在api/inc下就是需要的頭文件, api/lib下面就是需要的庫文件
3. 打開基於cocos2d-x的工程的jni/Android.mk
在第一句 LOCAL_PATH := $(call my-dir)
后面加入
include$(CLEAR_VARS)
LOCAL_MODULE := fmodex
LOCAL_SRC_FILES := /YOUR_FMOD_PATH/api/lib/$(TARGET_ARCH_ABI)/libfmodex.so
LOCAL_EXPORT_C_INCLUDES := /YOUR_FMOD_PATH/api/inc
include$(PREBUILT_SHARED_LIBRARY)
注意YOUR_FMOD_PATH是你本地解壓縮fmod ex的路徑, 然后, 在
LOCAL_WHOLE_STATIC_LIBRARIES := 中最后加入fmodex
這樣就把libfmodex.so鏈接到工程里了.
然后, 將頭文件的路徑加入到 LOCAL_C_INCLUDES := 中
4. 在工程中需要調用fmod的地方include "fmod.h" 和 "fmod_errors.h"等.
就可以調用fmod來播放音頻文件了. 可以使用路徑來播放, 比如/sdcard/xxx/yyy.mp3.
不過, 用fmod不能直接用路徑播放Assets文件夾下的音頻文件, 因為這些文件是打包到apk中的.
若要播放Assets中的文件, 需要先讀取成數據, 調用fmod來播放. 參考代碼如下:
FMOD_SYSTEM *gSystem = 0;
FMOD_SOUND *gSound = 0;
FMOD_CHANNEL *gChannel = 0;
FMOD_RESULT result = FMOD_OK;
result = FMOD_System_Create(&gSystem);
result = FMOD_System_Init(gSystem, 32, FMOD_INIT_NORMAL, 0);
unsigned long size = 0;
unsigned char* data = CCFileUtils::sharedFileUtils()->getFileData("5stars.ogg", "r", &size);
FMOD_CREATESOUNDEXINFO exinfo = {0};
exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
exinfo.length = size;
result = FMOD_System_CreateSound(gSystem, (const char*)data, FMOD_OPENMEMORY | FMOD_CREATESAMPLE | FMOD_HARDWARE | FMOD_LOOP_OFF, &exinfo, &gSound);
result = FMOD_System_PlaySound(gSystem, FMOD_CHANNEL_FREE, gSound, 0, &gChannel);
這里, FMOD_System_CreateSound可以講數據指針作為data參數傳入, 注意后面的參數要加上FMOD_OPENMEMORY, 表示是用直接用數據播放音樂, FMOD_CREATESAMPLE表示讓FMOD來緩存音頻數據, 就可以在隨后釋放data. 同時, 要構造一個FMOD_CREATESOUNDEXINFO結構體, 用來傳入數據的長度.
執行程序, 就能聽到美妙的音樂啦~
這是播放一個文件, 若要同時播放多個文件, 創建多個Channel即可.
另外請注意, fmod ex雖然可免費使用, 但用於商業就要license費了. 對於低於5美元的產品, 100$還是可以接受的.