All Products
Search
Document Center

ApsaraVideo Live:Pemutaran audio kustom

Last Updated:Mar 26, 2026

Pemutaran audio kustom memberikan developer berpengalaman kendali penuh atas proses pemutaran audio untuk memenuhi kebutuhan spesifik. ARTC menyediakan fitur ini untuk kasus penggunaan tersebut.

Ikhtisar

Secara default, ARTC menyertakan modul pemutaran audio yang telah teruji di lapangan dan memenuhi sebagian besar kebutuhan pemutaran. Namun, jika Anda memiliki modul pemutaran audio kustom yang sudah ada atau perlu melakukan post-processing terhadap data audio sebelum diputar, ARTC menyediakan fitur pemutaran audio kustom. Fitur ini memungkinkan Anda menonaktifkan logika pemutaran internal dan mengelola penerimaan serta pemutaran data audio.

Anda kemudian dapat meneruskan data tersebut ke perangkat pemutaran Anda untuk diproses dan diputar.

Kode contoh

Android: Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomAudioCaptureAndRender/CustomAudioRenderActivity.java.

iOS: iOS/ARTCExample/AdvancedUsage/CustomAudioRender/CustomAudioRenderVC.swift.

Prasyarat

Sebelum menggunakan pemutaran audio kustom, pastikan Anda memenuhi persyaratan berikut:

  • Anda mampu mengembangkan modul pemutaran audio lengkap atau telah memiliki pemutar audio pihak ketiga atau internal yang mapan.

  • Anda memahami alur kerja dasar pemrosesan audio, termasuk konsep seperti format data PCM, laju sampel, dan jumlah saluran.

  • Anda telah mengintegrasikan ARTC SDK dan mengimplementasikan fitur panggilan audio dan video dasar.

  • Kasus penggunaan Anda memerlukan bypass terhadap modul pemutaran internal ARTC. Jika tidak, kami merekomendasikan menggunakan solusi pemutaran default untuk memastikan stabilitas dan kompatibilitas.

Implementasi

image

Implementasi

1. Nonaktifkan pemutaran internal

Untuk menggunakan fitur pemutaran audio kustom, Anda biasanya perlu menonaktifkan pemutaran internal SDK. Kami merekomendasikan menonaktifkannya saat membuat instans engine dengan memanggil getInstance dan meneruskan parameter extras. Parameter terkait adalah sebagai berikut:

user_specified_use_external_audio_player: Menentukan apakah akan menggunakan pemutar eksternal.

  • "TRUE": Menggunakan pemutar eksternal dan menonaktifkan pemutaran internal.

  • "FALSE": Menggunakan pemutaran internal default.

Android

String extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras);

iOS

// Buat dan inisialisasi engine.
var customAudioPlayConfig: [String: String] = [:]
// Gunakan pemutar eksternal, yang menonaktifkan pemutaran internal SDK.
customAudioPlayConfig["user_specified_use_external_audio_player"] = "TRUE"
// Serialisasi ke JSON.
guard let jsonData = try? JSONSerialization.data(withJSONObject: customAudioPlayConfig, options: []),
let extras = String(data: jsonData, encoding: .utf8) else {
    print("Serialisasi JSON gagal")
    return
}
let engine = AliRtcEngine.sharedInstance(self, extras:extras)

Mac

NSString * extras = @"{\"user_specified_use_external_audio_player\":\"TRUE\"}";
self.engine = [AliRtcEngine sharedInstance:self extras:extras];

Windows

std::string extras = "{\"user_specified_use_external_audio_player\":\"TRUE\"}";
mAliRtcEngine = AliRtcEngine.getInstance(this, extras.c_str());

2. Daftarkan callback frame audio

Panggil enableAudioFrameObserver untuk mendaftarkan callback frame audio. Teruskan parameter berikut:

  • enable: Boolean yang mengaktifkan atau menonaktifkan callback data.

  • audioSource: Jenis sumber data untuk callback. Untuk pemutaran audio kustom, atur nilai ini ke AliRtcAudioSourcePlayback untuk menerima data dari tahap pemutaran melalui callback onPlaybackAudioFrame.

  • config: Parameter audio yang diinginkan untuk callback, termasuk laju sampel dan jumlah saluran.

Android

// Atur konfigurasi callback.
AliRtcEngine.AliRtcAudioFrameObserverConfig config = new AliRtcEngine.AliRtcAudioFrameObserverConfig();
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = 1;
// Daftarkan untuk mengaktifkan callback data pemutaran.
mAliRtcEngine.enableAudioFrameObserver(true, AliRtcAudioSourcePlayback, config);

iOS

// Atur konfigurasi callback.
var observerConfig: AliRtcAudioFrameObserverConfig = AliRtcAudioFrameObserverConfig()
observerConfig.sampleRate = ._Unknown
observerConfig.channels = .monoAudio
// Daftarkan untuk mengaktifkan callback data pemutaran.
let audioSource: AliRtcAudioSource = .playback
engine.enableAudioFrameObserver(true, audioSource: audioSource, config: observerConfig)

Mac

AliRtcAudioFrameObserverConfig* config = [[AliRtcAudioFrameObserverConfig alloc] init];
config.channels = audioNumChannel;
config.sampleRate = AliRtcAudioSampleRate_48000;
config.mode = AliRtcAudioFrameObserverOperationModeReadOnly;
[self.engine enableAudioFrameObserver:TRUE audioSource:AliRtcAudioSourcePlayback config:config];

Windows

// Atur konfigurasi callback.
AliEngineAudioFrameObserverConfig config ;
config.sampleRate = AliRtcAudioSampleRate_48000;
config.channels = AliEngineMonoAudio;
// Daftarkan untuk mengaktifkan callback data pemutaran.
mAliRtcEngine->EnableAudioFrameObserver(true, AliEngineAudioSourcePlayback, config);

3. Proses data PCM dalam callback

Dalam callback, proses data PCM yang diterima dan kirimkan ke perangkat pemutaran Anda.

Android

@Override
public boolean onPlaybackAudioFrame(AliRtcEngine.AliRtcAudioFrame frame) {
    // Implementasikan logika kustom Anda untuk memutar data audio yang diterima dalam callback.

    return true;
}

iOS

func onPlaybackAudioFrame(_ frame: AliRtcAudioFrame) -> Bool {
    // Implementasikan logika kustom Anda untuk memutar data audio yang diterima dalam callback.
    
    return true
}

Mac

- (BOOL)onPlaybackAudioFrame:(AliRtcAudioFrame* _Nonnull)frame {
    // Implementasikan logika kustom Anda untuk memutar data audio yang diterima dalam callback.
    return true;
}

Windows

bool CTutorialDlg::OnPlaybackAudioFrame(AliEngineAudioRawData audioRawData) {
	// Implementasikan logika kustom Anda untuk memutar data audio yang diterima dalam callback.
	return true;
}

4. Nonaktifkan observer

Android

mAliRtcEngine.enableAudioFrameObserver(false, AliRtcAudioSourcePlayback, config)

iOS

engine.enableAudioFrameObserver(false, audioSource: audioSource, config: observerConfig)

Mac

[self.engine enableAudioFrameObserver:false audioSource:AliRtcAudioSourcePlayback config:config];

Windows

mAliRtcEngine->EnableAudioFrameObserver(false, AliEngineAudioSourcePlayback, config);

5. (Opsional) Aktifkan atau nonaktifkan pemutaran internal secara dinamis

Untuk mengaktifkan atau menonaktifkan pemutaran internal SDK secara dinamis selama panggilan, panggil metode setParameter.

Android

/* Nonaktifkan pemutaran internal secara dinamis. */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine.setParameter(parameter);

/* Aktifkan pemutaran internal secara dinamis. */
String parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}"; 
mAliRtcEngine.setParameter(parameter);

iOS

// Nonaktifkan pemutaran internal secara dinamis.
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}")
// Aktifkan pemutaran internal secara dinamis.
engine.setParameter("{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}")

Mac

// Nonaktifkan pemutaran internal secara dinamis.
[self.engine setParameter:"{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}"];
// Aktifkan pemutaran internal secara dinamis.
[self.engine setParameter:"{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}"];

Windows

/* Nonaktifkan pemutaran internal secara dinamis. */
std::string parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"FALSE\"}}";
mAliRtcEngine->SetParameter(parameter.c_str());

/* Aktifkan pemutaran internal secara dinamis. */
std::string parameter = "{\"audio\":{\"enable_system_audio_device_play\":\"TRUE\"}}"; 
mAliRtcEngine->SetParameter(parameter.c_str());