本文將為您介紹ARTC SDK中音訊常用操作和配置。
功能介紹
ARTC SDK中關於音頻配置與操作的各項實用功能,涵蓋從音頻編碼模式及音頻情境模式的設定,到本地音頻採集和播放管理、遠端音頻播放控制、耳返功能的應用,以及如何靈活設定音頻路由等關鍵環節。
範例程式碼
Android端音頻常用操作和配置:Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/AudioBasicUsage/AudioBasicUsageActivity.java。
iOS端音頻常用操作和配置:iOS/ARTCExample/BasicUsage/AudioBasicUsage/AudioBasicUsageVC.swift。
Harmony端音頻常用操作和配置:Harmony/ARTCExample/entry/src/main/ets/pages/basicusage/AudioBasicUsage.ets。
前提條件
功能實現
1.設定音頻編碼模式和情境模式(加入頻道前)
ARTC SDK 提供setAudioProfile介面,支援設定不同的音頻編碼模式和音頻情境模式。開發人員可以根據不同的業務情境和使用者需求,對音訊品質進行精準最佳化。
setAudioProfile只可以在加入頻道前調用,加入頻道後不可以重新設定。ARTC SDK 推薦使用
AliRtcEngineHighQualityMode高音質編碼模式和AliRtcSceneMusicMode音樂情境模式。
1.1.音頻編碼模式(AliRtcAudioProfile)
一般建議使用高音質模式(
AliRtcEngineHighQualityMode)。如果需要與Web互連,需要選擇採樣率為 48k 的模式。
如果需要雙聲道,建議設定為
AliRtcEngineStereoHighQualityMode。
枚舉名 | 描述 | 採樣率 | 聲道數 | 最大編碼碼率 |
AliRtcEngineLowQualityMode | 音頻低音質模式 | 8000Hz | 單 | 12kbps |
AliRtcEngineBasicQualityMode | 標準音質模式 | 16000Hz | 單 | 24kbps |
AliRtcEngineHighQualityMode | 高音質模式 | 48000Hz | 單 | 64kbps |
AliRtcEngineStereoHighQualityMode | 立體聲高音質模式 | 48000Hz | 雙 | 80kbps |
AliRtcEngineSuperHighQualityMode | 超高音質模式 | 48000Hz | 單 | 96kbps |
AliRtcEngineStereoSuperHighQualityMode | 立體聲超高音質模式 | 48000Hz | 雙 | 128kbps |
1.2.音頻情境模式(AliRtcAudioScenario)
枚舉名 | 描述 |
AliRtcSceneDefaultMode | 使用硬體 3A,可以從藍牙裝置採集,如果需要藍芽採集可以設定為此模式。 |
AliRtcSceneMusicMode | (建議設定)音樂情境模式,使用軟體 3A,從手機採集(音質更高)。 |
1.3.範例程式碼
以下將為您提供一些常見情境的音頻編碼模式及應用情境的模式設定樣本。
需要藍芽採集
Android
// 需要設定為AliRtcSceneDefaultMode情境
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneDefaultMode);iOS
// 需要設定為AliRtcSceneDefaultMode情境
engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneDefaultMode)Harmony
this.rtcEngine.setAudioProfile(AliRtcAudioProfile.AliRtcHighQualityMode, AliRtcAudioScenario.AliRtcSceneDefaultMode);需要與 Web 端互連
Android
// 需要設定為採樣率48k的編碼模式,例如AliRtcEngineHighQualityMode
mAliRtcEngine.setAudioProfile(AliRtcEngineHighQualityMode, AliRtcSceneMusicMode);iOS
// 需要設定為採樣率48k的編碼模式,例如AliRtcEngineHighQualityMode
engine.setAudioProfile(AliRtcAudioProfile.engineHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)Harmony
this.rtcEngine.setAudioProfile(AliRtcAudioProfile.AliRtcHighQualityMode, AliRtcAudioScenario.AliRtcSceneMusicMode);需要雙聲道
Android
// 設定為帶Stereo的模式,例如AliRtcEngineStereoHighQualityMode
mAliRtcEngine.setAudioProfile(AliRtcEngineStereoHighQualityMode, AliRtcSceneMusicMode);iOS
// 設定為帶Stereo的模式,例如AliRtcEngineStereoHighQualityMode
engine.setAudioProfile(AliRtcAudioProfile.engineStereoHighQualityMode, audio_scene: AliRtcAudioScenario.sceneMusicMode)Harmony
this.rtcEngine.setAudioProfile(AliRtcAudioProfile.AliRtcStereoHighQualityMode, AliRtcAudioScenario.AliRtcSceneMusicMode);2.本端音頻採集設定
本節主要介紹如何控制本端音頻採集,例如靜音麥克風、關閉麥克風採集等,主要介面及區別如下:
介面 |
|
|
實現原理 | 發送靜音幀。 | 關閉/開啟麥克風採集。 |
調用時機 | 加入頻道前後均可調用。 | 加入頻道後調用。 |
是否釋放麥克風資源 | 否 | 是 |
2.1.靜音麥克風
ARTC 提供muteLocalMic介面用於靜音麥克風和外部輸入音頻,該介面可以在加入頻道前後調用設定是否靜音。
與stopAudioCapture不同,調用muteLocalMic介面靜音麥克風時,並沒有釋放麥克風資源,麥克風採集和編碼模組仍在運行,僅是發送碼率極低的靜音幀。
支援設定的模式AliRtcMuteLocalAudioMode如下:
| 預設模式,與 |
| 全部靜音,麥克風採集與外部PCM輸入都停止推送。 |
| 靜音麥克風模式,只停止麥克風採集推送。 |
範例程式碼如下:
Android
// 靜音全部
mAliRtcEngine.muteLocalMic(true, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteAllAudioMode);
// 取消靜音全部
mAliRtcEngine.muteLocalMic(false, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteAllAudioMode);
// 僅靜音麥克風
mAliRtcEngine.muteLocalMic(true, AliRtcEngine.AliRtcMuteLocalAudioMode.AliRtcMuteOnlyMicAudioMode);iOS
// 靜音全部
self.rtcEngine?.muteLocalMic(true, mode: .allAudioMode)
// 取消靜音全部
self.rtcEngine?.muteLocalMic(false, mode: .allAudioMode)
// 僅靜音麥克風
self.rtcEngine?.muteLocalMic(true, mode: .onlyMicAudioMode)Harmony
// 靜音全部
this.rtcEngine.muteLocalMic(true, AliRtcMuteLocalAudioMode.AliRtcMuteLocalAudioModeMuteAll);
// 取消靜音全部
this.rtcEngine.muteLocalMic(false, AliRtcMuteLocalAudioMode.AliRtcMuteLocalAudioModeMuteAll);
// 僅靜音麥克風
this.rtcEngine.muteLocalMic(true, AliRtcMuteLocalAudioMode.AliRtcMuteLocalAudioModeMuteOnlyMic);2.2.關閉/恢複麥克風採集
SDK 加入頻道預設開啟麥克風採集,如果需要關閉麥克風採集,可以調用stopAudioCapture停止麥克風採集,此介面會釋放麥克風資源停止採集音頻。如果需要恢複麥克風採集,請調用startAudioCapture介面。
Android
// 停止麥克風採集
mAliRtcEngine.stopAudioCapture();
// 恢複麥克風採集
mAliRtcEngine.startAudioCapture();iOS
// 停止麥克風採集
self.rtcEngine?.stopAudioCapture()
// 恢複麥克風採集
self.rtcEngine?.startAudioCapture()Harmony
// 停止麥克風採集
this.rtcEngine.stopAudioCapture();
// 恢複麥克風採集
this.rtcEngine.startAudioCapture();3.遠端音頻播放設定
本節將介紹如何控制遠端使用者音訊播放。
3.1.靜音遠端使用者
ARTC 提供muteRemoteAudioPlaying介面停止/恢複遠端指定使用者音頻播放,介面定義如下:
public abstract int muteRemoteAudioPlaying(String uid, boolean mute);這裡的靜音不影響音頻拉流和解碼,可以在入會前後設定。
這裡的靜音僅影響遠端使用者音頻在本端的播放,不影響遠端使用者採集。
3.2.設定指定遠端使用者播放音量
ARTC 提供setPlayoutVolume介面控制本端播放音量。
/**
* @brief 設定播放音量
* @param volume 播放音量,取值範圍[0,400]
* - 0:靜音
* - <100:減小音量
* - >100:放大音量
* @return
* - 0: 成功
* - 非0: 失敗
*/
public abstract int setPlayoutVolume(int volume);ARTC 提供setRemoteAudioVolume介面用於控制指定的遠端使用者音頻播放音量,當傳入 volume 參數為 0 時等同於muteRemoteAudioPlaying介面。
/**
* @brief 調節本地播放的指定遠端使用者音量
* @param uid 使用者ID,從App server分配的唯一標示符
* @param volume 播放音量,取值範圍[0,100] 0:靜音;100:原始音量
* @return
* - 0: 成功
* - 非0: 失敗
*/
public abstract int setRemoteAudioVolume(String uid, int volume);4.耳返功能
耳返功能指通過耳機監聽麥克風採集的聲音。
4.1.開啟耳返
可以在加入頻道前後調用enableEarBack介面開啟耳返功能。如果需要關閉耳返功能,請再次調用enableEarBack並將參數置為 false。
建議戴耳機的情況下開啟耳返。
Android
rtcEngine.enableEarBack(true);iOS
engine.enableEarBack(true)Harmony
this.rtcEngine.enableEarBack(true);4.2.設定耳返音量
調用setEarBackVolume介面調整耳返的音量,參數volume表示音量大小,範圍為 [0~100],其中 0 表示靜音,100 表示正常音量,預設值為 100。
Android
rtcEngine.setEarBackVolume(60);iOS
rtcEngine?.setEarBackVolume(volume)Harmony
this.rtcEngine.setEarBackVolume(value);5.使用者音量回調及說話人回調
ARTC 提供了使用者音量回調和說話人(當前活躍的發言人)回調,便於應用即時感知使用者的發言狀態。
該功能預設關閉,需要調用enableAudioVolumeIndication介面開啟該功能,功能開啟後系統會按照設定的頻率周期性地上報每位使用者的即時音量與當前說話人,開發人員可根據此實現 UI 互動。
5.1. 開啟回調功能
調用enableAudioVolumeIndication 開啟功能並設定回調頻率、平滑係數等,參數如下:
interval:回調頻率間隔,單位為 ms。建議設定為 300~500ms,最小不能低於 10ms,如果設定為負值表示關閉此功能。
smooth:平滑係數,數值越大表示平滑程度越高,反之平滑程度低即時性好,建議設定為 3,取值範圍為 [0-9]。
reportVad:說話人檢測開關,0 表示關閉,1 表示開啟。
Android
mAliRtcEngine.enableAudioVolumeIndication(500, 3,1);iOS
// 使用者音量回調和說話人檢測
engine.enableAudioVolumeIndication(500, smooth: 3, reportVad: 1)Harmony
// 使用者音量回調和說話人檢測
this.rtcEngine.enableAudioVolumeIndication(1000, 3, 1);5.2. 實現並註冊相關回調
調用registerAudioVolumeObserver介面註冊相關回調,之後系統會根據設定的間隔回調:
onAudioVolume回調負責提供周期性的音頻音量資訊,用於即時掌握各使用者的發言強度。系統會定時上報當前檢測到的所有使用者(包括本地和遠端)的音量層級,開發人員可用於實現聲波動畫、音量指示條或靜音檢測等 UI 反饋。其中,當 mUserId 為 "0" 時,表示該條目為本地採集音量;mUserId 為“1”時表示所有遠端使用者的混音音量,其他值表示指定使用者的音量資訊。 totalVolume 表示所有遠端使用者混音後的總體音量。onActiveSpeaker是語音激勵(Voice Activity Detection, VAD)觸發的主講人回調。當系統檢測到某個使用者成為當前最活躍的發言人(說話音量和期間超過閾值)時,會通過此回調通知應用程式層。開發人員可利用該事件實現“自動聚焦發言人”的互動體驗,例如會議情境講說話人視頻視窗置為大屏等。
Android
private final AliRtcEngine.AliRtcAudioVolumeObserver mAliRtcAudioVolumeObserver = new AliRtcEngine.AliRtcAudioVolumeObserver() {
// 使用者音量回調
@Override
public void onAudioVolume(List<AliRtcEngine.AliRtcAudioVolume> speakers, int totalVolume){
handler.post(() -> {
if(!speakers.isEmpty()) {
for(AliRtcEngine.AliRtcAudioVolume volume : speakers) {
if("0".equals(volume.mUserId)) {
// 本地目前使用者音量
} else if ("1".equals(volume.mUserId)) {
// 遠端使用者整體音量
} else {
// 遠端使用者音量
}
}
}
});
}
// 說話人檢測回調
@Override
public void onActiveSpeaker(String uid){
// 說話人
handler.post(() -> {
String mag = "onActiveSpeaker uid:" + uid;
ToastHelper.showToast(AudioBasicUsageActivity.this, mag, Toast.LENGTH_SHORT);
});
}
};
// 註冊回調
mAliRtcEngine.registerAudioVolumeObserver(mAliRtcAudioVolumeObserver);iOS
ios 不需要調用註冊回調介面,只需要實現相關回調即可:
0nAudioVolumeCallback
onActiveSpeaker
func onAudioVolumeCallback(_ array: [AliRtcUserVolumeInfo]?, totalVolume: Int32) {
// 使用者音量回調
"onAudioVolumeCallback, totalVolume: \(totalVolume)".printLog()
}
func onActiveSpeaker(_ uid: String) {
// 說話人回調
"onActiveSpeaker, uid: \(uid)".printLog()
}Harmony
this.rtcEngineEventListener.onAudioVolumeCallback(
(volumeInfo : AliRtcUserVolumeInfo[], volumeInfoCount : number, totalVolume : number) => {
console.info(`音量回調: volumeInfo=${volumeInfo}, volumeInfoCount=${volumeInfoCount}, totalVolume=${totalVolume}`);
}
)
this.rtcEngineEventListener.onActiveSpeaker((uid: string) => {
console.info(`當前活動使用者: uid=${uid}`);
});6.設定音頻路由
音頻路由(Audio Route)作為音訊裝置管理中的重要組成模組,用於判斷和調整當前通話過程中聲音播放的音訊裝置。裝置類型主要包含:
內建播放裝置:一般包括擴音器和耳機。
當音頻路由為擴音器時,聲音比較大,不用將手機貼臉也能聽清,因此可以實現“免提”的功能。
當音頻路由為耳機時,聲音比較小,只有將耳朵湊近才能聽清楚,隱私性較好,適合用於電話中。
外接裝置:涵蓋有線耳機、藍芽耳機等外部音訊裝置,以及外置音效卡等專業音頻介面。
音頻路由的優先順序在SDK內部已經定義好,並會根據當前外設的串連狀態自動切換,切換的流程圖如下所示:
6.1.預設音頻路由
預設音頻路由用於在入會前設定預設的音頻路由裝置,在耳機和擴音器之間選擇。如果沒有設定該功能,將預設使用擴音器。
當串連的藍芽耳機和有線耳機等其他外設中斷連線時,將使用該功能設定的裝置進行播放。
當沒有外置裝置,且使用者沒有設定當前裝置,則使用 SDK 預設設定。SDK 預設使用擴音器作為輸出,如果需要修改此預設設定,可以調用
setDefaultAudioRoutetoSpeakerphone切換預設設定。
/**
* @brief 設定預設音訊輸出是否從擴音器出聲,預設從擴音器出聲
* @param defaultToSpeakerphone
* - true: 擴音器模式(預設擴音器)
* - false: 耳機模式
* @return
* - 0: 成功
* - <0: 失敗
*/
public int setDefaultAudioRoutetoSpeakerphone(boolean defaultToSpeakerphone);6.2.當前音頻路由
當前音頻路由用於在會議當中設定當前播放的音訊裝置,在耳機和擴音器之間選擇。如果沒有設定該功能, 將使用預設音頻路由所設定的裝置進行播放。
在串連有線耳機或者藍芽耳機等其他外設的情況下,該函數調用不生效。
在沒有外置裝置的情況下,使用者可以調用enableSpeakerphone設定當前是否使用擴音器,設定為否則使用耳機。如果需要檢查當前的音訊裝置為擴音器或耳機,可以調用isSpeakerOn介面。
/**
* @brief 設定音訊輸出為耳機還是擴音器
* @param enable true:擴音器模式(預設擴音器);false:耳機模式
* @return
* - 0: 成功
* - <0: 失敗
*/
public int enableSpeakerphone(boolean enable);
/**
* @brief 擷取當前音訊輸出為耳機還是擴音器
* @return
* - true: 擴音器模式;
* - false: 耳機模式
*/
public boolean isSpeakerOn();6.3.音頻路由裝置變化回調
如果想擷取音頻播放裝置切換時的回調需要註冊並監聽以下回調。
public abstract class AliRtcEngineEventListener {
/**
* @brief 警告通知
* @details 如果engine出現warning,通過這個回調通知app
* @param warn 警告類型
* @param message 警告訊息
*/
public void onOccurWarning(int warn, String message);
}warn傳回值和裝置類型對應關係如下表:
傳回值 | 裝置 |
1 | 有線有麥耳機 |
2 | 耳機 |
3 | 有線無麥耳機 |
4 | 擴音器 |
6 | SCO 藍牙裝置 |
7 | A2DP 藍牙裝置 |