AOQ Client SDK mendukung pemutaran audio kustom. Melalui mekanisme callback frame audio, data PCM yang telah didekode dikirimkan ke lapisan aplikasi sehingga Anda dapat mengimplementasikan logika rendering audio sendiri.
Ikhtisar
Secara default, AOQ Client SDK memutar data audio remote yang diterima melalui speaker sistem atau earpiece. Namun, dalam beberapa skenario, modul pemutaran audio bawaan SDK mungkin tidak memenuhi kebutuhan Anda. Pemutaran audio kustom berguna ketika Anda perlu:
- Mengarahkan output data audio yang diterima ke perangkat pemutaran kustom atau pipeline pemrosesan audio.
- Memproses ulang data audio yang diterima—misalnya, untuk pengenalan ucapan berbasis AI atau efek audio.
- Mengatasi konflik perangkat pemutaran audio.
AOQ Client SDK menyediakan dukungan pemutaran kustom yang fleksibel. Melalui mekanisme callback frame audio, data PCM yang telah didekode dikirimkan ke lapisan aplikasi agar Anda dapat melakukan rendering dan pemutaran sendiri.
Kode contoh
Segera hadir.
Prasyarat
- Sebuah instans engine telah dibuat dengan memanggil
createEngine. - Koneksi ke server telah terjalin (callback
onConnectionStatusChangetelah melaporkanAoqConnectionStatusConnected).
Implementasi
1. Mulai pemutaran audio dalam mode eksternal
Saat memanggil startAudioPlayer, atur isExternal=true untuk menonaktifkan perangkat rendering audio internal SDK. Lapisan aplikasi kemudian bertanggung jawab atas pemutaran audio tersebut.
AoqClientEngine.AoqAudioPlaybackConfig config = new AoqClientEngine.AoqAudioPlaybackConfig();
config.isExternal = true; // Nonaktifkan pemutaran internal SDK; lapisan aplikasi melakukan rendering audio
config.channel = 1; // Jumlah channel
engine.startAudioPlayer(config);
Parameter:
Parameter | Type | Default | Description |
|---|---|---|---|
isVoipMode | boolean | false | Apakah mode VoIP diaktifkan (AEC perangkat keras). Berlaku pada perangkat mobile. |
isDefaultSpeaker | boolean | true | Apakah speaker digunakan secara default. Berlaku pada perangkat mobile. |
isExternal | boolean | false | Apakah mode pemutaran eksternal digunakan. Jika true, SDK tidak membuka perangkat pemutaran. |
channel | int | 1 | Jumlah channel |
2. Atur pendengar callback frame audio
Panggil setAudioFrameObserver untuk mendaftarkan listener callback data frame audio. Implementasikan metode callback onPlaybackAudioFrame guna menerima data PCM pemutaran.
engine.setAudioFrameObserver(new AoqClientListener.AoqAudioFrameListener() {
@Override
public void onPlaybackAudioFrame(@NonNull AoqClientEngine.AoqAudioFrameData frame) {
// Proses data audio pemutaran yang diterima di sini
// frame.dataPtr: data PCM
// frame.numOfSamples: jumlah sampel
// frame.numOfChannels: jumlah channel
// frame.samplesPerSec: laju sampel
// frame.bytesPerSample: byte per sampel
playPcmData(frame);
}
});
3. Aktifkan callback data pemutaran
Panggil enableAudioFrameObserver untuk mengaktifkan callback frame audio pada posisi pemutaran. Tentukan sumber data sebagai AoqAudioSourcePlayback.
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
observerConfig.sampleRate = 48000; // Laju sampel audio callback
observerConfig.channels = 1; // Jumlah channel audio callback
observerConfig.mode = AoqClientEngine.AoqAudioObserverMode.AoqAudioObserverModeReadOnly; // Mode hanya-baca
engine.enableAudioFrameObserver(
true, // Aktifkan callback
AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback, // Sumber data pemutaran
observerConfig
);
Parameter:
Parameter | Type | Default | Description |
|---|---|---|---|
sampleRate | int | 48000 | Laju sampel audio callback (Hz) |
channels | int | 1 | Jumlah channel audio callback |
mode | AoqAudioObserverMode | AoqAudioObserverModeReadOnly | Mode baca/tulis |
4. Implementasikan rendering audio kustom
Ketika data PCM tiba dalam callback onPlaybackAudioFrame, lapisan aplikasi menangani rendering dan pemutaran. Pendekatan umum meliputi:
- Android AudioTrack: Tulis data PCM ke perangkat audio sistem menggunakan AudioTrack.
- Pengenalan ucapan AI: Teruskan data PCM ke mesin ASR untuk pengenalan ucapan.
- Efek audio: Terapkan efek audio pada data PCM sebelum diputar.
- Penyimpanan file: Simpan data audio yang diterima ke file lokal.
// Contoh: Pemutaran menggunakan Android AudioTrack
private AudioTrack mAudioTrack;
private volatile boolean mPlayRunning = false;
private void initAudioTrack(int sampleRate, int channels) {
int channelConfig = (channels == 2)
? AudioFormat.CHANNEL_OUT_STEREO
: AudioFormat.CHANNEL_OUT_MONO;
int bufferSize = AudioTrack.getMinBufferSize(
sampleRate, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
mAudioTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL,
sampleRate,
channelConfig,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize,
AudioTrack.MODE_STREAM);
mAudioTrack.play();
mPlayRunning = true;
}
private void playPcmData(AoqClientEngine.AoqAudioFrameData frame) {
if (!mPlayRunning || mAudioTrack == null) {
return;
}
if (frame.dataPtr != null && frame.dataSize > 0) {
mAudioTrack.write(frame.dataPtr, 0, frame.dataSize);
}
}
Catatan penting:
- Callback
onPlaybackAudioFramedijalankan pada thread internal SDK.frame.dataPtrhanya valid selama callback berlangsung. Jika Anda perlu menggunakan data tersebut secara asinkron, salin terlebih dahulu. AudioTrack.writemerupakan operasi blocking. Menulis langsung di dalam callback tidak masalah karena SDK mengirimkan callback pada laju yang terkendali.- Pertahankan flag
mPlayRunningagar Anda dapat menghentikan pemrosesan saat engine keluar atau pemutaran dihentikan.
5. Hentikan pemutaran kustom
Saat pemutaran kustom tidak lagi diperlukan, nonaktifkan terlebih dahulu callback frame audio, lalu hentikan perangkat pemutaran dan lepaskan sumber daya AudioTrack.
// 1. Nonaktifkan callback frame audio pada posisi pemutaran
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
engine.enableAudioFrameObserver(
false, // Nonaktifkan callback
AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback,
observerConfig
);
// 2. Hapus listener callback frame audio
engine.setAudioFrameObserver(null);
// 3. Hentikan pemutaran audio SDK
engine.stopAudioPlayer();
// 4. Lepaskan sumber daya AudioTrack
mPlayRunning = false;
if (mAudioTrack != null) {
mAudioTrack.stop();
mAudioTrack.release();
mAudioTrack = null;
}