在我們看直播的時候,經常會在直播程序中聽到有掌聲、口哨聲、背景音樂等音效,那么這些聲音特效是如何實作的呢大家有沒有想過?anyRTC下面就為大家簡單介紹一下如何實作在直播程序中播放音頻檔案,
功能描述
在通話或者直播的程序中,除了用戶端自己說話的聲音之外,有時候還需要播放一些特定的音頻檔案或者背景音樂讓頻道內的其他用戶也可以聽到,比如說給游戲添加音效,或者在直播的時候播放一些背景音樂等,為此anyRTC提供了以下兩種方法滿足用戶播放音效和其他音頻檔案的需求,
如何播放音效檔案
音效就是指由聲音所制造的效果,是指為增進一場面之真實感、氣范訓戲劇訊息,而加于聲帶上的雜音或聲音,所謂的聲音則包括了樂音和效果音,包括數字音效、環境音效、MP3音效(普通音效、專業音效),簡單來說音效就是持續很短時間的音頻,播放音效檔案方法主要用來播放短小的氛圍音,比如鼓掌、刀劍等武器之間的撞擊聲音等,可以多個音效疊加播放,且音效檔案可以預加載以提高性能,anyRTC SDK 提供 IAudioEffectManager 類統一管理音效,包含一些管理音效的常用方法, 音效由音頻檔案路徑指定,但在 IAudioEffectManager 內部使用 sound id 來識別和處理音效,音效檔案通常保存在 assets 檔案夾下;SDK 并不強制如何定義 sound id,保證每個音效有唯一的識別即可,一般的做法有自增 id,使用音效檔案名的 hashCode 等,
實作方法
參考如下步驟,在你的專案中實作播放音效檔案:
- 在加入頻道前呼叫 getAudioEffectManager 方法獲取音效管理類 IAudioEffectManager,
- 呼叫 preloadEffect 方法預加載音效檔案,可以多次呼叫該方法加載多個音效檔案,
- 加入頻道后呼叫 playEffect 方法播放音效檔案,可以多次呼叫該方法同時播放多個音效,我們建議最多同時播放三個音效檔案,
管理音效的方法需通過 IAudioEffectManager 介面類呼叫,
示例代碼
``
// 首先獲取全域的音效管理類
IAudioEffectManager manager = rtcEngine.getAudioEffectManager();
// 預加載音效(推薦),需注意音效檔案的大小,并在加入頻道前完成加載
// 僅支持 mp3,aac,m4a,3gp,wav格式
// 開發者可能需要額外記錄 id 與檔案路徑的關聯關系,用來播放和停止音效
int id = 0;
manager.preloadEffect(id++, "path/to/effect1");
// 可以加載多個音效
manager.preloadEffect(id++, "path/to/effect2");
// 播放一個音效
manager.playEffect(
0, // 要播放的音效 id
"path/to/effect1", // 播放檔案的路徑
-1, // 播放次數,-1 代表無限回圈
0.0, // 改變音效的空間位置,0表示正前方
100, // 音量,取值 0 ~ 100, 100 代表原始音量
true // 是否令遠端也能聽到音效的聲音
);
// 暫停所有音效播放
manager.pauseAllEffects();
// 獲取音效的音量,范圍為 0 ~ 100
double volume = manager.getEffectsVolume();
// 保證音效音量在原始音量的 80% 以上
volume = volume < 80 ? 80 : volume;
manager.setEffectsVolume(volume);
// 繼續播放暫停的音效
manager.resumeAllEffects();
// 停止所有音效
manager.stopAllEffects();
// 釋放預加載的音效
manager.unloadAllEffects();
注意事項
1、預加載不是一個必須的步驟,一般來說為了提高性能或者需要反復播放某個特定的音效的時候,我們建議使用預加載,但如果音效檔案比較大,不建議預加載,
2、以上方法都有回傳值,回傳值小于 0 表示方法呼叫失敗,
如何實作音樂混音
混音是音樂制作中的一個步驟,是把多種來源的聲音,整合至一個立體音軌或單音音軌中,這些混合聲音信號,來源可能分別來自不同的樂器、人聲或管弦樂,收錄自現場演奏或錄音室內,在混音的程序中,混音師會將每一個原始信號的頻率、動態、音質、定位、殘響和聲場單獨進行調整,讓各音軌最佳化,之后再疊加于最終成品上,這種處理方式,能制作出一般聽眾在現場錄音時不能聽到之層次分明的完美效果,
在音視頻通話直播場景下,混音是指播放本地或者在線音樂檔案,同時讓頻道內的其他人聽到此音樂,混音方法主要用來播放比較長的背景音,比如直播的時候播放的音樂,同時只可以有一個檔案播放,如果在混音播放第一個檔案的程序中播放第二個檔案,會自動停止第一個檔案的播放,
anyRTC混音功能如下:
- 混音或替換: 混音指的是音樂檔案的音頻流跟麥克風采集的音頻流進行混音(疊加)并編碼發送給對方;替換指的是麥克風采集的音頻被音樂檔案的音頻流替換掉,對方只能聽見音樂播放,
- 回圈:可以設定是否回圈播放混音檔案,以及回圈次數,
- 調節音量:可以同時或分別調節音樂檔案在本地和遠端的播放音量,
- 調節音調:可以分別調節本地人聲的音調和音樂檔案的音調,
實作方法
示例代碼
``
// 混音設定
int loopCount = -1; //無限回圈播放混音檔案;設定為正整數表示混音檔案播放的次數
boolean loopback = false; 檔案音頻流是否發送給對端;如果設定為 true,檔案音頻流僅在本地可以聽見,不會發送到對端
boolean cycle = false; //不替換麥克風采集的音頻
// 開始播放混音
rtcEngine.startAudioMixing("path/to/music", loopback, replace, cycle);
// 將本地和遠端音樂檔案播放音量調節為原始音量的 50%
int volume = 50;
rtcEngine.adjustAudioMixingVolume(volume);
// 將本地人聲的音調設為 1.5
double pitch = 1.5;
rtcEngine.setLocalVoicePitch(pitch);
// 將本地音樂檔案的音調升 10 個半音,
int pitch = 10;
rtcEngine.setAudioMixingPitch(pitch);
// 獲取當前播放的混音音樂的時長
int duration = rtcEngine.getAudioMixingDuration();
// duration 可以用來設定播放進度條的最大進度等
// seekBar.setMax(duration);
// 獲取當前混音的播放進度
int currentPosition = rtcEngine.getAudioMixingCurrentPosition();
// 可以設定 timer 定時獲取播放進度,用來顯示播放進度
// seekBar.setProgress(currentPosition);
// 若用戶拖動了進度條,可以在 seekBar 的回呼中獲取 progress 并重設音樂當前播放的位置
rtcEngine.setAudioMixingPosition(progress);
// 暫停、恢復混音檔案播放
rtcEngine.pauseAudioMixing();
rtcEngine.resumeAudioMixing();
// 停止播放混音檔案,麥克風采集播放恢復
rtcEngine.stopAudioMixing();
總結
在娛樂行業高速發展的今天,視頻通話、直播等行業已經發展的相對完善,如何讓用戶能有更好的體驗,更深層次的感受是值得我們思考的,像播放音頻檔案這種小小的功能看似不起眼實際上對于直播場景來說是非常重要的,因為他可以讓用戶更能感受到直播的氛圍,主播也能更好的展現節目效果,適當的播放一些音效和背景音樂可以讓用戶有一種身臨其境的感覺,極大的提升用戶的體驗感,同樣的在線上教育行業下,老師在與學生上課的時候,特別是和小朋友上課的時候,適當的掌聲、喝彩聲等音效可以讓小朋友更能專注在課堂上保證課程效果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/266011.html
標籤:其他
上一篇:積水幾何
