All Products
Search
Document Center

Alibaba Cloud Model Studio:Pemutaran audio kustom

Last Updated:Sep 02, 2026

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 onConnectionStatusChange telah melaporkan AoqConnectionStatusConnected).

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 onPlaybackAudioFrame dijalankan pada thread internal SDK. frame.dataPtr hanya valid selama callback berlangsung. Jika Anda perlu menggunakan data tersebut secara asinkron, salin terlebih dahulu.
  • AudioTrack.write merupakan operasi blocking. Menulis langsung di dalam callback tidak masalah karena SDK mengirimkan callback pada laju yang terkendali.
  • Pertahankan flag mPlayRunning agar 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;
}