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:
- Envie dados de áudio recebidos para um dispositivo de reprodução personalizado ou pipeline de processamento de áudio.
- Dados de áudio recebidos pós-processamento – por exemplo, para reconhecimento de fala de IA ou efeitos de áudio.
- Contornar conflitos de dispositivos de reprodução de áudio.
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
- Uma instância do mecanismo foi criada chamando
createEngine. - Uma conexão com o servidor foi estabelecida (o
onConnectionStatusChangeretorno de chamada foi relatadoAoqConnectionStatusConnected).
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:
- Android AudioTrack: Grave os dados PCM no dispositivo de áudio do sistema usando AudioTrack.
- Reconhecimento de fala de IA: passe os dados PCM para um mecanismo ASR para reconhecimento de fala.
- Efeitos de áudio: aplique efeitos de áudio aos dados PCM antes da reprodução.
- Armazenamento de arquivos: Salve os dados de áudio recebidos em um arquivo local.
// 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);
}
}
- O
onPlaybackAudioFrameo retorno de chamada é acionado em um thread interno do SDK. Oframe.dataPtrsó é válido durante o retorno de chamada. Se precisar usar os dados de forma assíncrona, copie-os primeiro. AudioTrack.writeé uma operação de bloqueio. Escrever diretamente dentro do retorno de chamada é adequado porque o SDK fornece retornos de chamada a uma taxa controlada.- Manter o
mPlayRunningsinalizador para que você possa interromper o processamento quando o mecanismo for encerrado ou a reprodução for interrompida.
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;
}