QwenCloudBRASIL
Tradução de apoio para consulta. Código e identificadores técnicos preservados. Consultar referência original ↗

Reprodução de áudio personalizada

Reproduza o áudio retornado pela AOQ usando um player externo

O AOQ Client SDK oferece suporte à reprodução de áudio personalizada. Através do mecanismo de retorno de chamada de quadro de áudio, os dados PCM decodificados são entregues à camada de aplicação, permitindo implementar sua própria lógica de renderização de áudio.

Visão geral

Por padrão, o SDK do cliente AOQ reproduz dados de áudio remotos recebidos por meio do alto-falante ou fone de ouvido do sistema. Em alguns cenários, o módulo de reprodução de áudio integrado do SDK pode não atender às suas necessidades. A reprodução de áudio personalizada é útil quando você precisa:

O AOQ Client SDK fornece suporte flexível de reprodução personalizada. Através do mecanismo de retorno de chamada de quadro de áudio, os dados PCM decodificados são entregues à camada de aplicativo para renderização e reprodução.

Código de exemplo

Em breve.

Pré-requisitos

Implementação

1. Inicie a reprodução de áudio no modo externo

Ao ligar startAudioPlayer, definir isExternal=true para desativar o dispositivo interno de renderização de áudio do SDK. A camada de aplicação é então responsável por reproduzir o áudio.

AoqClientEngine.AoqAudioPlaybackConfig config = new AoqClientEngine.AoqAudioPlaybackConfig();
config.isExternal = true;  // Disable SDK internal playback; application layer renders audio
config.channel = 1;        // Number of channels
engine.startAudioPlayer(config);

Parâmetros:

Parâmetro Tipo Padrão Descrição
isVoipMode booleano falso Se deve ativar o modo VoIP (hardware AEC). Válido no celular.
isDefaultSpeaker booleano verdade Se deve usar o alto-falante por padrão. Válido no celular.
éExterno booleano falso Se deve usar o modo de reprodução externa. Quando verdadeiro, o SDK não abre o dispositivo de reprodução.
canal interno 1 Número de canais

2. Defina o ouvinte de retorno de chamada do quadro de áudio

Ligar setAudioFrameObserver para registrar o ouvinte de retorno de chamada de dados do quadro de áudio. Implementar o onPlaybackAudioFrame método de retorno de chamada para receber os dados PCM de reprodução.

engine.setAudioFrameObserver(new AoqClientListener.AoqAudioFrameListener() {
  @Override
  public void onPlaybackAudioFrame(@NonNull AoqClientEngine.AoqAudioFrameData frame) {
    // Process the received playback audio data here
    // frame.dataPtr: PCM data
    // frame.numOfSamples: number of samples
    // frame.numOfChannels: number of channels
    // frame.samplesPerSec: sample rate
    // frame.bytesPerSample: bytes per sample
    playPcmData(frame);
  }
});

3. Habilite retornos de chamada de dados de reprodução

Ligar enableAudioFrameObserver para ativar retornos de chamada de quadro de áudio na posição de reprodução. Especifique a fonte de dados como AoqAudioSourcePlayback.

AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
observerConfig.sampleRate = 48000;  // Callback audio sample rate
observerConfig.channels = 1;       // Callback audio channel count
observerConfig.mode = AoqClientEngine.AoqAudioObserverMode.AoqAudioObserverModeReadOnly; // Read-only mode
engine.enableAudioFrameObserver(
  true,  // Enable callbacks
  AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback,  // Playback data source
  observerConfig
);

Parâmetros:

Parâmetro Tipo Padrão Descrição
taxa de amostra interno 48.000 Taxa de amostragem de áudio de retorno de chamada (Hz)
canais interno 1 Contagem de canais de áudio de retorno de chamada
modo AoqAudioObserverMode AoqAudioObserverModeReadOnly Modo de leitura/gravação

4. Implementar renderização de áudio personalizada

Quando os dados PCM chegam ao onPlaybackAudioFrame retorno de chamada, a camada de aplicativo cuida da renderização e da reprodução. As abordagens comuns incluem:

// Example: Playback using 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);
  }
}

5. Pare a reprodução personalizada

Quando a reprodução personalizada não for mais necessária, primeiro desative o retorno de chamada do quadro de áudio, depois pare o dispositivo de reprodução e libere os recursos do AudioTrack.

// 1. Disable audio frame callbacks at the playback position
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
engine.enableAudioFrameObserver(
  false,  // Disable callbacks
  AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback,
  observerConfig
);
// 2. Remove the audio frame callback listener
engine.setAudioFrameObserver(null);
// 3. Stop SDK audio playback
engine.stopAudioPlayer();
// 4. Release AudioTrack resources
mPlayRunning = false;
if (mAudioTrack != null) {
  mAudioTrack.stop();
  mAudioTrack.release();
  mAudioTrack = null;
}