全部產品
Search
文件中心

ApsaraVideo Live:自訂音頻播放

更新時間:Dec 11, 2025

自訂音頻播放是使用者在具有一定的研發能力的情況,希望自己控制播放來實現某些需求,因此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\"}}")