Bagi pengembang yang perlu mengimplementasikan fitur tertentu dengan mengontrol pemutaran audio secara mandiri, ARTC menyediakan fungsionalitas pemutaran audio kustom. Fitur ini memungkinkan Anda mengambil kendali penuh atas proses pemutaran.
Pengenalan fitur
Secara default, ARTC menyertakan modul pemutaran audio yang telah teruji di pasar dan memenuhi kebutuhan sebagian besar kasus penggunaan. Namun, dalam kondisi tertentu, Anda mungkin telah memiliki modul pemutaran audio kustom yang matang atau perlu melakukan post-processing pada data audio sebelum diputar. Untuk keperluan tersebut, ARTC menyediakan kemampuan pemutaran audio kustom, yang memungkinkan Anda menonaktifkan logika pemutaran internal dan mengambil alih penerimaan serta pemutaran data audio.
Inti dari fitur ini adalah mengaktifkan callback frame audio, sehingga Anda dapat memperoleh data audio PCM dari sumber lokal atau jarak jauh (remote) dan meneruskannya ke perangkat pemutaran Anda untuk diproses dan dirender.
Kode contoh
Android: Android/ARTCExample/AdvancedUsage/src/main/java/com/aliyun/artc/api/advancedusage/CustomAudioCaptureAndRender/CustomAudioRenderActivity.java
iOS: iOS/ARTCExample/AdvancedUsage/CustomAudioRender/CustomAudioRenderVC.swift
Persiapan awal
Sebelum menggunakan pemutaran audio kustom, pastikan Anda memenuhi persyaratan berikut:
Anda memiliki kemampuan untuk mengembangkan modul pemutaran audio lengkap atau telah memiliki pemutar audio pihak ketiga atau buatan sendiri yang matang.
Anda memahami konsep dasar pemrosesan audio, termasuk format data PCM, sample rate, dan jumlah channel.
Anda telah mengintegrasikan ARTC SDK dan mengimplementasikan kemampuan panggilan audio/video dasar.
Kebutuhan bisnis Anda benar-benar mengharuskan melewati modul pemutaran internal ARTC. Jika tidak, kami merekomendasikan menggunakan solusi pemutaran default untuk memastikan stabilitas dan kompatibilitas.
Implementasi
Implementasi
1. Nonaktifkan modul pemutaran internal SDK
Untuk menggunakan pemutaran audio kustom, Anda harus terlebih dahulu menonaktifkan modul pemutaran audio internal SDK. Kami menyarankan melakukannya saat membuat instans engine dengan meneruskan parameter extras ke metode getInstance.
Parameter yang relevan adalah user_specified_use_external_audio_player:
TRUE: Gunakan pemutar audio eksternal, yang menonaktifkan pemutaran internal SDK.FALSE: Jangan gunakan pemutar audio eksternal, yang mengaktifkan pemutaran internal SDK.
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 (nonaktifkan pemutaran audio 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("JSON serialization failed")
return
}
let engine = AliRtcEngine.sharedInstance(self, extras:extras)2. Dengarkan callback audio
Panggil enableAudioFrameObserver untuk mendaftarkan callback audio. Anda harus meneruskan parameter berikut:
enable: Nilai boolean yang menentukan apakah callback data diaktifkan.audioSource: Jenis sumber data untuk callback, yang dapat mencakup data audio dari berbagai tahap. Untuk pemutaran audio kustom, Anda biasanya perlu mengamati sumberAliRtcAudioSourcePlayback, yang sesuai dengan callbackonPlaybackAudioFrame.config: Parameter audio yang diinginkan untuk callback, termasuk sample rate dan jumlah channel.
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)3. Proses data PCM dalam callback
Tangani data PCM yang diterima dalam callback dan kirimkan ke perangkat audio sistem Anda untuk diputar.
Android
@Override
public boolean onPlaybackAudioFrame(AliRtcEngine.AliRtcAudioFrame frame) {
// Implementasikan logika kustom Anda untuk memutar data audio dari callback di sini.
return true;
}iOS
func onPlaybackAudioFrame(_ frame: AliRtcAudioFrame) -> Bool {
// Implementasikan logika kustom Anda untuk memutar data audio dari callback di sini.
return true
}4. Nonaktifkan observer saat meninggalkan channel
Android
mAliRtcEngine.enableAudioFrameObserver(false, AliRtcAudioSourcePlayback, config)iOS
engine.enableAudioFrameObserver(false, audioSource: audioSource, config: observerConfig)5. (Opsional) Kontrol pemutaran internal secara dinamis
Jika aplikasi Anda memerlukan pengaktifan atau penonaktifan pemutaran internal SDK secara dinamis selama panggilan, gunakan antarmuka 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\"}}")