iOS直播/游戲怎麼利用特殊音效製造娛樂效果?

来源:https://www.cnblogs.com/zegodeveloper/archive/2022/05/18/16284636.html
-Advertisement-
Play Games

我們在直播中,為了增強真實感,烘托場景氛圍需要播放的簡短效果音。例如:掌聲、笑聲、禮物音效、提示音等。在游戲中,有時也需要播放子彈聲、碰撞打擊聲等。 ZegoExpress SDK 提供音效文件播放器,通過 ZegoAudioEffectPlayer 統一管理音效,支持音效播放(可以多音效重疊播放... ...


1 功能簡介

我們在直播中,為了增強真實感,烘托場景氛圍需要播放的簡短效果音。例如:掌聲、笑聲、禮物音效、提示音等。在游戲中,有時也需要播放子彈聲、碰撞打擊聲等。

ZegoExpress SDK 提供音效文件播放器,通過 ZegoAudioEffectPlayer 統一管理音效,支持音效播放(可以多音效重疊播放)、播放控制(如暫停播放、音量調節、設置播放進度)、預載入音效等功能。

2 支持格式

音效文件播放器支持播放 MP3、M4A、AAC、WAV 格式的本地音頻文件。

3 示例源碼下載

請參考 下載示例源碼 獲取源碼。

相關源碼請查看 “/ZegoExpressExample/Examples/AdvancedAudioProcessing/AudioEffectPlayer” 目錄下的文件。

4 前提條件

在實現音效文件播放器功能之前,請確保:

5 使用步驟

5.1 創建音效播放器

調用 ZegoExpressEnginecreateAudioEffectPlayer 方法創建音效播放器實例。

引擎當前只支持同時創建一個實例,超出後將返回 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 暫停/恢復/停止播放

  1. 調用 pause 指定的音效,調用 pauseAll 方法則暫停所有正在播放的音效。
  2. 音效暫停播放後,調用 resume 方法可以恢復播放 “audioEffectID” 指定的音效,調用 resumeAll 方法則恢復所有已暫停音效。
  3. 調用 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 調節音量

  1. 調用 setVolume 方法可以設置 “audioEffectID” 指定的音效音量,取值範圍為 [0, 200],預設值為 “100”。
  2. 調用 setVolumeAll 方法則同時設置所有音效音量,取值範圍為 [0, 200],預設值為 “100”。
// 設置 0 號 audioEffectID 的音量為 100
[self.audioEffectPlayer setVolume:100 audioEffectID:0];

// 設置所有資源的音量為 100
[self.audioEffectPlayer setVolumeAll:100];

5.2.5 播放進度控制

  1. 調用 getTotalDuration 方法獲取單個音效的總時長。
  2. 調用 getCurrentProgress 方法獲取音效當前播放進度。
  3. 調用 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開發者帳號,快速開始。

音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SpringDataRedis的序列化的一些問題 RedisTemplate可以接收任意Object作為值寫入Redis,但是如果不實現設置序列化器的化預設是採用JDK序列化,序列化後的結果可讀性差並且記憶體占用空間大,如下圖。 自定義RedisTemplate的序列化方式 key和 hashKey採 ...
  • 導讀: 今天和大家分享京東零售OLAP平臺的建設和場景的實踐,主要包括四大部分: 管控面建設 優化技巧 典型業務 大促備戰 -- 01 管控面建設 1. 管控面介紹 管控面可以提供高可靠高效可持續運維保障、快速部署小時交付的能力,尤其是針對ClickHouse這種運維較弱但是性能很高的OLAP核心引 ...
  • 本文介紹如何使用 UPDATE 和 DELETE 語句處理表中的數據,還介紹了為什麼 WHERE 子句對 UPDATE 和 DELETE 語句很重要。 一、更新數據 更新(修改)表中的數據,可以使用 UPDATE 語句。有兩種使用 UPDATE 的方式: 更新表中的特定行; 更新表中的所有行。 下麵 ...
  • 本文介紹如何使用 SQL INSERT 語句將數據插入到表中,如何用 INSERT SELECT 從其他表中導入行,如何用 SELECT INTO 將行導出到一個新表。 一、數據插入 毫無疑問,SELECT 是最常用的 SQL 語句了。但是,還有其他 3 個常用的 SQL 語句需要學習。第一個就是 ...
  • i,大家好,我是大D。今天繼續瞭解下 HBase 是如何寫入數據的,然後再講解一下一個比較經典的面試題。 ...
  • 本文介紹如何利用 SQL UNION 操作符將多條 SELECT 語句組合成一個結果集。使用 UNION 可極大地簡化複雜的 WHERE 子句,簡化從多個表中檢索數據的工作。 一、組合查詢 多數 SQL 查詢只包含從一個或多個表中返回數據的單條 SELECT 語句。但是,SQL 也允許執行多個查詢( ...
  • 本文介紹自聯結(self-join)、自然聯結(natural join)和外聯結 (outer join),包括它們的含義和使用方法。介紹如何使用表別名,如何對被聯結的表使用聚集函數。 一、使用表別名 SQL 如何創建計算欄位 介紹瞭如何使用別名引用被檢索的表列。給列起別名的語法如下: SELEC ...
  • JSONOBJECT解析數據 若JSON格式數據如下所示: [{"id":"5","version":"5.5","name":"Clash of Clans"}, {"id":"6","version":"6.0","name":"Boom Beachx"}] 可以看到要解析的數據是一個JSON數 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文將以 C# 語言來實現一個簡單的布隆過濾器,為簡化說明,設計得很簡單,僅供學習使用。 感謝@時總百忙之中的指導。 布隆過濾器簡介 布隆過濾器(Bloom filter)是一種特殊的 Hash Table,能夠以較小的存儲空間較快地判斷出數據是否存在。常用於允許一定誤判率的數據過濾及防止緩存 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 「簡單有價值的事情長期堅持做」 這是成功最簡單,但也最難學的秘訣。不經過訓練,人很難意識到時間複利的威力。 仙劍奇俠傳的「十里坡劍神」和金庸群俠傳的「十級野球拳」,就是簡單的事情持之以恆反覆做,最後就有巨大的威力 唐家三少成為網文收入第一,最重要的一步是十四年從未斷日更 這樣的案例很多,一開始可能成 ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“我愛加班”。 面試開始,直入正題。 面試官: 看你簡歷上面寫著精通MySQL,我先問你事務的特性是什麼? 老生常談,這個還有誰不會背的嗎? 我: ...
  • 基礎知識 python是一門腳本語言,它是解釋執行的。 python使用縮進做為語法,而且python2環境下同一個py文件中不能同時存在tab和空格縮進,否則會出錯,建議在IDE中顯示縮進符。 python在聲明變數時不寫數據類型,可以type(xx)來獲取欄位的類型,然後可以int(),list ...
  • 為什麼要多線程下載 俗話說要以終為始,那麼我們首先要明確多線程下載的目標是什麼,不外乎是為了更快的下載文件。那麼問題來了,多線程下載文件相比於單線程是不是更快? 對於這個問題可以看下圖。 橫坐標是線程數,縱坐標是使用對應線程數下載對應文件時花費的時間,藍橙綠代表下載文件的大小,每個線程下載對應文件2 ...
  • 詳細講解python爬蟲代碼,爬微博搜索結果的博文數據。 爬取欄位: 頁碼、微博id、微博bid、微博作者、發佈時間、微博內容、轉發數、評論數、點贊數。 爬蟲技術: 1、requests 發送請求 2、datetime 時間格式轉換 3、jsonpath 快速解析json數據 4、re 正則表達式提... ...
  • 背景: 一般我們可以用HashMap做本地緩存,但是HashMap功能比較弱,不支持Key過期,不支持數據範圍查找等。故在此實現了一個簡易的本地緩存,取名叫fastmap。 功能: 1.支持數據過期 2.支持等值查找 3.支持範圍查找 4.支持key排序 實現思路: 1.等值查找採用HashMap2 ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 本章是系列文章的第八章,用著色演算法進行寄存器的分配過程。 本文中的所有內容來自學習DCC888的學習筆記或者自己理解的整理,如需轉載請註明出處。周榮華@燧原科技 寄存器分配 寄存器分配是為程式處理的值找到存儲位置的問題 這些值可以存放到寄存器,也可以存放在記憶體中 寄存器更快,但數量有限 記憶體很多,但 ...