我們在直播中,為了增強真實感,烘托場景氛圍需要播放的簡短效果音。例如:掌聲、笑聲、禮物音效、提示音等。在游戲中,有時也需要播放子彈聲、碰撞打擊聲等。 ZegoExpress SDK 提供音效文件播放器,通過 ZegoAudioEffectPlayer 統一管理音效,支持音效播放(可以多音效重疊播放... ...
1 功能簡介
我們在直播中,為了增強真實感,烘托場景氛圍需要播放的簡短效果音。例如:掌聲、笑聲、禮物音效、提示音等。在游戲中,有時也需要播放子彈聲、碰撞打擊聲等。
ZegoExpress SDK 提供音效文件播放器,通過 ZegoAudioEffectPlayer 統一管理音效,支持音效播放(可以多音效重疊播放)、播放控制(如暫停播放、音量調節、設置播放進度)、預載入音效等功能。
2 支持格式
音效文件播放器支持播放 MP3、M4A、AAC、WAV 格式的本地音頻文件。
3 示例源碼下載
請參考 下載示例源碼 獲取源碼。
相關源碼請查看 “/ZegoExpressExample/Examples/AdvancedAudioProcessing/AudioEffectPlayer” 目錄下的文件。
4 前提條件
在實現音效文件播放器功能之前,請確保:
- 已在項目中集成 ZEGO Express SDK,實現基本的實時音視頻功能,詳情請參考 快速開始 - 集成 和 快速開始 - 實現流程。
- 已在 ZEGO 控制台 創建項目,並申請有效的 AppID,詳情請參考 控制台 - 項目管理 中的“項目信息”。
5 使用步驟
5.1 創建音效播放器
調用 ZegoExpressEngine
的 createAudioEffectPlayer
方法創建音效播放器實例。
引擎當前只支持同時創建一個實例,超出後將返回 nil
。
@property (nonatomic, strong) ZegoAudioEffectPlayer *audioEffectPlayer;
self.audioEffectPlayer = [[ZegoExpressEngine sharedEngine] createAudioEffectPlayer];
if (!self.audioEffectPlayer) {
NSLog(@"創建音效播放器失敗");
}
5.2 播放控制
5.2.1 (可選)為音效播放器設置事件回調
音效播放器事件回調設置
可以根據需要調用音效播放器的 setEventHandler
方法為播放器設置事件回調,用於監聽“音效播放狀態改變”等通知。
[self.audioEffectPlayer setEventHandler:self];
- (void)audioEffectPlayer:(ZegoAudioEffectPlayer *)audioEffectPlayer audioEffectID:(unsigned int)audioEffectID playStateUpdate:(ZegoAudioEffectPlayState)state errorCode:(int)errorCode {
NSLog(@"Play state update. ID:%d, state:%lu, err:%d", audioEffectID, (unsigned long)state, (int)errorCode);
}
5.2.2 開始播放
調用 start
方法播放音效,目前僅支持同時播放 12 個,且只能為本地文件,不支持播放網路資源。 其中 “audioEffectID” 需要保持全局唯一。
- 如果已通過
loadResource
方法預先載入了音效,則只需要傳入預載入時的 “audioEffectID”,“path”(音效資源的路徑)欄位傳空即可。 - 若需要重覆播放可以通過
ZegoAudioEffectPlayConfig
中 “playCount” 配置重覆次數。如果設置為 “0”,則表示無限重覆播放,直到用戶手動調用stop
停止。
// 此處示例獲取已存放於 App Bundle 內的 test.wav 資源
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
ZegoAudioEffectPlayConfig *config = [[ZegoAudioEffectPlayConfig alloc] init];
config.playCount = 1; // 播放一次
config.isPublishOut = YES; // 播放混入推流中
// 使用 0 作為此次的 audioEffectID
[self.audioEffectPlayer start:0 path:filePath config:config];
5.2.3 暫停/恢復/停止播放
- 調用
pause
指定的音效,調用pauseAll
方法則暫停所有正在播放的音效。 - 音效暫停播放後,調用
resume
方法可以恢復播放 “audioEffectID” 指定的音效,調用resumeAll
方法則恢復所有已暫停音效。 - 調用
stop
指定的音效,調用stopAll
方法則停止播放所有音效。
// 暫停 0 號 audioEffectID 資源的播放
[self.audioEffectPlayer pause:0];
// 恢復 0 號 audioEffectID 資源的播放
[self.audioEffectPlayer resume:0];
// 停止 0 號 audioEffectID 資源的播放
[self.audioEffectPlayer stop:0];
// 暫停所有資源的播放
[self.audioEffectPlayer pauseAll];
// 恢復所有資源的播放
[self.audioEffectPlayer resumeAll];
// 停止所有資源的播放
[self.audioEffectPlayer stopAll];
5.2.4 調節音量
- 調用
setVolume
方法可以設置 “audioEffectID” 指定的音效音量,取值範圍為 [0, 200],預設值為 “100”。 - 調用
setVolumeAll
方法則同時設置所有音效音量,取值範圍為 [0, 200],預設值為 “100”。
// 設置 0 號 audioEffectID 的音量為 100
[self.audioEffectPlayer setVolume:100 audioEffectID:0];
// 設置所有資源的音量為 100
[self.audioEffectPlayer setVolumeAll:100];
5.2.5 播放進度控制
- 調用
getTotalDuration
方法獲取單個音效的總時長。 - 調用
getCurrentProgress
方法獲取音效當前播放進度。 - 調用
seekTo
方法可以根據需要設置播放進度。
// 獲取 0 號 audioEffectID 的總時長
unsigned long long totalDuration = [self.audioEffectPlayer getTotalDuration:0];
// 獲取 0 號 audioEffectID 的當前播放進度
unsigned long long currentProgress = [self.audioEffectPlayer getCurrentProgress:0];
// 設置 0 號 audioEffectID 的播放進度為總進度的一半
[self.audioEffectPlayer seekTo:(unsigned long long)(totalDuration / 2) audioEffectID:0 callback:^(int errorCode) {
NSLog(@"seekTo result: %d", errorCode);
}];
5.3 (可選)預載入資源
預載入資源
在頻繁播放相同音效場景中,SDK 為了優化重覆讀文件並解碼的性能,提供了預載入音效文件到記憶體中的功能。
調用 loadResource
方法載入音效資源,可通過 “callback” 參數來監聽載入的結果,顯示載入成功後方可播放。最多支持同時預載入 15 個本地音效文件(不支持網路資源),並且單個音效文件時長不能超過 30 s,否則載入會報錯。
當載入的音效使用完成後,可以調用 unloadResource
介面卸載,以釋放相關資源。否則 SDK 將在 ZegoAudioEffectPlayer
實例釋放時會自動卸載已載入的音效。
預載入為非必須操作,為了提高性能或者需要反覆播放某個特定的音效時推薦使用。
// 此處示例獲取已存放於 App Bundle 內的 test.wav 資源
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"wav"];
[self.audioEffectPlayer loadResource:filePath audioEffectID:0 callback:^(int errorCode) {
NSLog(@"loadResource result, errorCode: %d", errorCode);
}];
5.4 銷毀媒體播放器
使用完音效播放器後,需要及時調用 destroyAudioEffectPlayer
方法銷毀,釋放該播放器占用的資源。
[[ZegoExpressEngine sharedEngine] destroyAudioEffectPlayer:self.audioEffectPlayer];
6 API 參考列表
方法 | 描述 |
---|---|
createAudioEffectPlayer |
創建音效播放器實例 |
setEventHandler |
設置音效播放器回調 |
start |
播放音效 |
pause |
暫停播放單個音效 |
pauseAll |
暫停播放所有音效 |
resume |
恢復播放單個音效 |
resumeAll |
恢復播放所有音效 |
stop |
停止播放單個音效 |
stopAll |
停止播放所有音效 |
setVolume |
調節音效音量 |
setVolumeAll |
調節所有音效音量 |
getTotalDuration |
控制播放進度 |
getCurrentProgress |
獲取當前播放進度 |
seekTo |
設置指定的播放進度 |
loadResource |
預載入資源 |
unloadResource |
卸載資源 |
destroyAudioEffectPlayer |
銷毀音效播放器實例 |
7 音效播放器與媒體播放器有什麼區別?
- 媒體播放器主要用於播放視頻及較長的音樂,支持播放網路資源。同一時間最多支持創建 4 個播放器實例,一個實例只能播放一個音視頻。
- 音效播放器主要用於播放時間較短的音效,不支持播放網路資源。同一時間只支持創建一個音效播放器實例,音效播放器支持多路音效併發播放,一個實例最多同時播放 12 個音效。
獲取更多支持
獲取本文的Demo、開發文檔、技術支持。
獲取SDK的商務活動、熱門產品。
註冊即構ZEGO開發者帳號,快速開始。