自訂音頻播放是使用者在具有一定的研發能力的情況,希望自己控制播放來實現某些需求,因此ARTC提供了相關的功能,以方便使用者實現這些需求。
功能介紹
ARTC 預設整合了經過市場驗證的音頻播放模組,能夠滿足大多數情境下的播放需求。但在某些特殊情境下,使用者可能已有成熟的自訂音頻播放模組,或需要對音頻資料進行二次處理後再播放。為此,ARTC 提供了自訂音頻播放能力,允許使用者關閉內部播放邏輯,接管音頻資料的接收與播放過程。
該功能的核心是通過開啟音訊框架回調,擷取遠端或本地的 PCM 音頻資料,交由使用者實現的播放裝置進行處理和回放。
範例程式碼
Android端自訂音頻播放:Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomAudioCaptureAndRender/CustomAudioRenderActivity.java。
iOS端自訂音頻播放:iOS/ARTCExample/AdvancedUsage/CustomAudioRender/CustomAudioRenderVC.swift。
前提條件
在使用自訂音頻播放前,請確保滿足以下條件:
使用者已具備完整的音頻播放模組開發能力,或已有成熟的第三方/自研音頻播放器;
瞭解基本的音頻處理流程,包括 PCM 資料格式、採樣率、聲道數等概念;
已整合 ARTC SDK 並完成基礎音視訊通話功能的接入;
明確業務需求必須繞過 ARTC 內部播放模組,否則建議繼續使用預設播放方案以保證穩定性與相容性。
功能實現
功能實現
1. 關閉 SDK 內部播放
當您需要使用 SDK 的自訂音頻播放功能時,通常需要關閉 SDK 內部音頻播放,推薦在調用getInstance建立引擎時傳入 extras 參數來關閉 SDK 內部播放,相關參數如下:
user_specified_use_external_audio_player:表示是否使用外部播放。
"TRUE":使用外部音頻播放,即關閉 SDK 內部播放。"FALSE":不使用外部音頻播放,即開啟 SDK 內部播放。
Android
String extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras);iOS
// 建立並初始化引擎
var customAudioPlayConfig: [String: String] = [:]
// 使用外部播放(停止SDK內部音頻播放)
customAudioPlayConfig["user_specified_use_external_audio_player"] = "TRUE"
// 序列化為Json
guard let jsonData = try? JSONSerialization.data(withJSONObject: customAudioPlayConfig, options: []),
let extras = String(data: jsonData, encoding: .utf8) else {
print("JSON 序列化失敗")
return
}
let engine = AliRtcEngine.sharedInstance(self, extras:extras)2.監聽音頻回調
調用enableAudioFrameObserver 註冊音頻回調,需要傳入參數:
enable:決定是否允許資料回調。audioSource:回調的資料來源類型,包含不同階段的音頻資料。自訂音頻播放通常需要回調AliRtcAudioSourcePlayback待播放階段的資料,對應回調onPlaybackAudioFrame。config:期望回調的音頻參數,包括採樣率、聲道數等。
Android
// 設定回調配置
AliRtcEngine.AliRtcAudioFrameObserverConfig config = new AliRtcEngine.AliRtcAudioFrameObserverConfig();
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = 1;
// 註冊開啟播放資料回調
mAliRtcEngine.enableAudioFrameObserver(true, AliRtcAudioSourcePlayback, config);iOS
// 設定回調配置
var observerConfig: AliRtcAudioFrameObserverConfig = AliRtcAudioFrameObserverConfig()
observerConfig.sampleRate = ._Unknown
observerConfig.channels = .monoAudio
// 註冊開啟播放資料回調
let audioSource: AliRtcAudioSource = .playback
engine.enableAudioFrameObserver(true, audioSource: audioSource, config: observerConfig)3.在回調用處理收到的PCM資料給系統音訊裝置
在回調中處理接收到的PCM資料,同時提交給音訊裝置。
Android
@Override
public boolean onPlaybackAudioFrame(AliRtcEngine.AliRtcAudioFrame frame) {
// 播放回調的資料,自行實現
return true;
}iOS
func onPlaybackAudioFrame(_ frame: AliRtcAudioFrame) -> Bool {
// 播放回調的資料,自行實現
return true
}4.離開頻道,關閉監聽
Android
mAliRtcEngine.enableAudioFrameObserver(false, AliRtcAudioSourcePlayback, config)iOS
engine.enableAudioFrameObserver(false, audioSource: audioSource, config: observerConfig)5. (可選)動態開啟/關閉阿里內部播放
如果您的業務情境中需要在通話中動態開啟/關閉 SDK 的內部播放,請調用setParameter介面。
Android
/* 動態關閉阿里內部播放 */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine.setParameter(parameter);
/* 動態開啟阿里內部播放 */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}";
mAliRtcEngine.setParameter(parameter);iOS
// 動態關閉阿里內部播放
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}")
// 動態開啟阿里內部播放
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}")