Descreve como implementar a captura de áudio personalizada com o AOQ Client SDK, incluindo a adição de fluxos de áudio externos, o envio de dados PCM e o gerenciamento do ciclo de vida do fluxo.
Visão geral
O módulo de áudio integrado do AOQ Client SDK atende às necessidades básicas, mas em alguns cenários o módulo de captura padrão pode não ser suficiente. A captura de áudio personalizada é útil quando você precisa:
- Contornar conflitos de dispositivos de captura de áudio.
- Inserir dados de áudio de um sistema de captura personalizado ou de um arquivo de áudio no SDK para transmissão.
- Publicar áudio gerado por TTS de IA por meio do SDK.
Código de exemplo
Em breve.
Pré-requisitos
- Uma instância de engine foi criada chamando
createEngine. - Uma conexão com o servidor foi estabelecida (o callback
onConnectionStatusChangereportouAoqConnectionStatusConnected).
Implementação
1. Iniciar ou parar a captura de áudio
Inicie primeiro a captura de áudio. Os dados do fluxo de áudio externo são mixados com os dados de captura interna antes da publicação. Se não for necessária a captura interna pelo microfone, defina isExternal=true para desativar o dispositivo de captura interno.
2. Após conectar, adicione o fluxo de áudio externo
Assim que o callback onConnectionStatusChange reportar AoqConnectionStatusConnected, chame addAudioExternalStream para adicionar o fluxo de áudio externo. Atribua um streamId exclusivo, que será usado para enviar dados e gerenciar o fluxo.
Caso seja necessário processamento 3A (cancelamento de eco, supressão de ruído e controle automático de ganho), configure o parâmetro enable3A em AoqAudioExternalStreamConfig.
Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
trackType | AoqTrackType | AoqTrackTypeAudio | Tipo de faixa de áudio |
codecType | AoqEncoderType | AoqEncoderTypeAudioPCM | Formato do fluxo de áudio |
channels | int | 1 | Número de canais |
sampleRate | int | 48000 | Taxa de amostragem (Hz) |
playoutVolume | int | 100 | Volume de reprodução [0–100] |
publishVolume | int | 100 | Volume de publicação [0–100] |
maxBufferDuration | int | 1000 | Duração máxima do buffer (milissegundos) |
enable3A | boolean | false | Indica se deve aplicar processamento 3A ao PCM de entrada |
3. Capturar ou obter dados PCM
Implemente sua própria captura de áudio ou source adequada ao seu caso de uso e insira os dados no SDK. As fontes de dados mais comuns incluem:
- Captura por microfone: Utilize o AudioRecord do Android para capturar dados PCM.
- Leitura de arquivo: Extraia dados PCM de um arquivo de áudio local nos formatos PCM ou WAV.
- TTS de IA: Obtenha dados PCM de um mecanismo de síntese de fala.
- Fluxo de rede: Decodifique dados PCM a partir de um fluxo de áudio em rede.
AoqAudioFrameData.
4. Enviar dados de áudio para o SDK via stream ID
Chame pushAudioExternalStreamData para inserir os dados PCM capturados no SDK.
- Para captura por hardware: utilize quadros de 10 ms e envie sempre que houver dados disponíveis.
- Para entrada baseada em arquivo: utilize quadros de 40 ms e aguarde 30 ms entre os envios.
- Mantenha uma flag
running. Saia do loop de envio quando a engine for encerrada ou o stream ID for removido.
- Comece a enviar dados somente após estabelecer a conexão e adicionar o fluxo de áudio externo.
- Configure
numOfSamplesdeAoqAudioFrameDatapara corresponder ao tamanho real dos dados. - A chamada a
pushAudioExternalStreamDatapode falhar se o buffer interno estiver cheio (código de erro 110). Tente novamente após um curto intervalo. - Em capturas em tempo real, use quadros de 10 ms e envie sempre que houver dados disponíveis. Trate o código de erro 110 adequadamente.
- Para entrada baseada em arquivo, utilize quadros de 40 ms e envie a cada 30 ms. Trate o código de erro 110 adequadamente.
- Antes de encerrar a engine (
destroy) ou remover um stream ID, definamPushRunning = falsepara interromper o loop de envio e evitar acesso a recursos já liberados.
5. Remover o fluxo de áudio externo
Quando a captura personalizada não for mais necessária, pare primeiro o loop de envio e depois chame removeAudioExternalStream para remover o fluxo de áudio externo.