Recursos de áudio
Captura de áudio, reprodução e configuração de codec AOQ SDK
O SDK do cliente AOQ fornece recursos de áudio abrangentes, incluindo gerenciamento de alto-falante, mixagem de arquivos, injeção de fluxo de áudio externo e retornos de chamada de dados de quadro de áudio, em Android (Java), iOS (Objective-C) e HarmonyOS (ArkTS).
Captura de áudio
A captura de áudio abre o microfone do dispositivo e alimenta dados de áudio em tempo real no pipeline de codificação do SDK. O SDK oferece suporte a dois modos de captura:
- Captura interna (padrão): o SDK gerencia automaticamente o microfone – abrindo, gravando e fechando-o.
- Captura externa: o aplicativo gerencia o microfone diretamente e alimenta os dados PCM capturados no SDK por meio da API de fluxo de áudio externo.
Parâmetros de configuração
| Parâmetro |
Tipo |
Padrão |
Descrição |
| éExterno |
bool |
falso |
Se deve usar o modo de captura externa |
| isVoipMode |
bool |
falso |
Se deve ativar o modo VoIP (hardware AEC). Válido no celular. Se a captura e a reprodução estiverem configuradas, o que for definido primeiro terá efeito. |
| canal |
interno |
1 |
Número de canais de captura. Suporta 1 (mono) ou 2 (estéreo). |
Referência da API
| Função |
Android |
iOS |
HarmonyOS |
| Iniciar captura |
startAudioCapture(config) |
startAudioCapture:config: |
startAudioCapture(config) |
| Pare a captura |
stopAudioCapture() |
stopAudioCapture |
stopAudioCapture() |
| Ativar/ativar som |
muteAudioCapture(mute) |
muteAudioCapture: |
muteAudioCapture(mute) |
Exemplo
Android
AoqAudioCaptureConfig config = new AoqAudioCaptureConfig();
config.isVoipMode = true;
config.channel = 1;
engine.startAudioCapture(config);
iOS
AoqAudioCaptureConfig *config = [[AoqAudioCaptureConfig alloc] init];
config.isVoipMode = YES;
config.channel = 1;
[engine startAudioCapture:config];
HarmoniaOS
const config: AoqAudioCaptureConfig = { isVoipMode: true, channel: 1 };
engine.startAudioCapture(config);
Reprodução de áudio
A reprodução de áudio renderiza dados de áudio remotos recebidos para o alto-falante ou fone de ouvido local. O SDK oferece suporte a controles avançados, incluindo pausa/retomada com fade in/out e interrupção do turno atual de uma conversa de áudio.
Parâmetros de configuração
| Parâmetro |
Tipo |
Padrão |
Descrição |
| isVoipMode |
bool |
falso |
Se deve ativar o modo VoIP (hardware AEC). Válido no celular. Se a captura e a reprodução estiverem configuradas, o que for definido primeiro terá efeito. |
| isDefaultSpeaker |
bool |
verdade |
Se deve usar o alto-falante por padrão. Válido em dispositivos móveis e apenas em modo não VoIP. |
| éExterno |
bool |
falso |
Se deve usar o modo de reprodução externa. |
| canal |
interno |
1 |
Número de canais de reprodução. Suporta 1 (mono) ou 2 (estéreo). |
Referência da API
| Função |
Android |
iOS |
HarmonyOS |
| Iniciar a reprodução |
startAudioPlayer(config) |
startAudioPlayer:config: |
startAudioPlayer(config) |
| Pare a reprodução |
stopAudioPlayer() |
stopAudioPlayer |
stopAudioPlayer() |
| Pausar a reprodução |
pauseAudioPlayer(fadeMs) |
pauseAudioPlayer: |
pauseAudioPlayer(fadeMs) |
| Retomar a reprodução |
resumeAudioPlayer(fadeMs) |
resumeAudioPlayer: |
resumeAudioPlayer(fadeMs) |
| Interromper conversa |
interruptAudioPlayer(trackType, fadeMs) |
interruptAudioPlayer:fadeMs: |
interruptAudioPlayer(trackType, fadeMs) |
parâmetro fadeMs: a duração do fade-in ou fade-out em milissegundos ao pausar ou retomar a reprodução. Defina como 0 para uma troca imediata.
Gerenciamento de alto-falantes
Alterne o dispositivo de saída de áudio entre o alto-falante e o fone de ouvido.
| Função |
Android |
iOS |
HarmonyOS |
| Trocar alto-falante |
enableSpeakerphone(enable) |
enableSpeakerphone: |
enableSpeakerphone(enable) |
| Consultar estado do alto-falante |
isSpeakerphoneEnabled() |
isSpeakerphoneEnabled |
isSpeakerphoneEnabled() |
A troca de alto-falante só é permitida no modo VoIP. Quando não estiver no modo VoIP, ligar enableSpeakerphone desencadeia um OnError(AoqECAudioDeviceEarpieceRequiresVoipMode) notificação de erro.
Comportamento específico do iOS: os dispositivos iPad têm apenas modo alto-falante. Quando a categoria AVAudioSession não é PlayAndRecord, esse método sempre retorna SIM.
Configuração do codec de áudio
Configure o formato de codificação, taxa de amostragem, contagem de canais e taxa de bits para uplink de áudio (codificador) e downlink (decodificador). Essas configurações determinam o formato de publicação e extração de streams.
Parâmetros de configuração
| Parâmetro |
Tipo |
Padrão |
Descrição |
| trackType |
AoqTrackType |
Áudio |
Tipo de faixa de áudio. Atualmente, apenas um fluxo de áudio é suportado. |
| tipo de codec |
AoqEncoderType |
ÁudioOpus |
Tipo de codificação: AudioPCM(1) ou AudioOpus(2) |
| taxa de amostra |
interno |
48.000 |
Taxa de amostragem. Opus suporta 8K/16K/48K. PCM suporta 8K/16K/32K/48K. |
| canal |
interno |
1 |
Contagem de canais. Suporta 1 (mono) ou 2 (estéreo). |
| taxa de bits |
interno |
32.000 |
Taxa de bits em bps. |
| Função |
Android |
iOS |
HarmonyOS |
| Definir configuração do codificador |
setAudioEncoderConfig(config) |
setAudioEncoderConfig: |
setAudioEncoderConfig(config) |
| Definir configuração do decodificador |
setAudioDecoderConfig(config) |
setAudioDecoderConfig: |
setAudioDecoderConfig(config) |
Formatos de codificação suportados
| Valor enum |
Número |
Descrição |
| AoqEncoderTypeAudioPCM |
1 |
Áudio PCM bruto |
| AoqEncoderTypeAudioOpus |
2 |
Codificação Opus |
Mixagem de arquivos de áudio
Misture um arquivo de áudio local no fluxo de áudio atual para publicação e/ou reprodução local. Cada arquivo de áudio é identificado por um código atribuído pelo aplicativo fileId, permitindo que várias instâncias de arquivo sejam gerenciadas simultaneamente.
Misturando parâmetros de configuração
| Parâmetro |
Tipo |
Padrão |
Descrição |
| nome do arquivo |
Corda |
- |
Caminho do arquivo de áudio (incluindo nome do arquivo) |
| ciclos |
interno |
-1 |
Número de loops. -1 significa loop indefinidamente. |
| startPosMs |
longo |
0 |
Posição inicial de reprodução em milissegundos |
| publicarVolume |
interno |
100 |
Volume de publicação [0-100] |
| volume de reprodução |
interno |
100 |
Volume de reprodução local [0-100] |
Referência da API
| Função |
Android |
iOS |
HarmonyOS |
| Iniciar a reprodução |
startAudioFile(fileId, config) |
startAudioFile:config: |
startAudioFile(fileId, config) |
| Pare a reprodução |
stopAudioFile(fileId) |
stopAudioFile: |
stopAudioFile(fileId) |
| Pausa |
pauseAudioFile(fileId) |
pauseAudioFile: |
pauseAudioFile(fileId) |
| Currículo |
resumeAudioFile(fileId) |
resumeAudioFile: |
resumeAudioFile(fileId) |
| Obtenha a duração do arquivo |
getAudioFileDuration(fileId) |
getAudioFileDuration: |
getAudioFileDuration(fileId) |
| Obtenha a posição atual |
getAudioFileCurrentPosition(fileId) |
getAudioFileCurrentPosition: |
getAudioFileCurrentPosition(fileId) |
| Procure se posicionar |
setAudioFilePositionMillis(fileId, pos) |
setAudioFilePositionMillis:positionMillis: |
setAudioFilePositionMillis(fileId, pos) |
| Definir volume |
setAudioFileVolume(fileId, type, vol) |
setAudioFileVolume:type:volume: |
setAudioFileVolume(fileId, type, vol) |
| Obtenha volume |
getAudioFileVolume(fileId, type) |
getAudioFileVolume:type: |
getAudioFileVolume(fileId, type) |
Direção do volume (tipo): AoqAudioStreamPublish(0) controla o volume de publicação. AoqAudioStreamPlayout(1) controla o volume de reprodução local.
Retornos de chamada de estado
| Código do estado |
Valor |
Descrição |
| AoqAudioFileNone |
0 |
Estado inicial |
| AoqAudioFileIniciado |
1 |
A reprodução começou |
| AoqAudioFileStopped |
2 |
A reprodução parou |
| AoqAudioFilePausado |
3 |
Reprodução pausada |
| AoqAudioFileRetomado |
4 |
A reprodução foi retomada |
| AoqAudioFileEnd |
5 |
A reprodução terminou |
| AoqAudioFileBuffering |
6 |
Buffer |
| AoqAudioFileBufferingEnd |
7 |
O buffer terminou |
| AoqAudioFileFalha |
8 |
Falha na reprodução |
Fluxos de áudio externos
Os fluxos de áudio externos permitem injetar dados de áudio PCM gerados pelo aplicativo no pipeline de áudio do SDK para publicação e/ou reprodução local. Os casos de uso típicos incluem saída de síntese TTS, saída de áudio do modelo AI e efeitos sonoros de fundo. Cada fluxo de áudio externo é identificado por um código atribuído ao aplicativo streamId.
Parâmetros de configuração
| Parâmetro |
Tipo |
Padrão |
Descrição |
| trackType |
AoqTrackType |
Áudio |
Tipo de faixa de áudio |
| tipo de codec |
AoqEncoderType |
ÁudioPCM |
Formato de fluxo de áudio |
| canais |
interno |
1 |
Contagem de canais |
| taxa de amostra |
interno |
48.000 |
Taxa de amostragem. Suporta 8/12/16/24/32/44,1/48/64/88,2/96/176,4/192 kHz. |
| volume de reprodução |
interno |
100 |
Volume de reprodução local [0-100] |
| publicarVolume |
interno |
100 |
Volume de publicação [0-100] |
| maxBufferDuration |
interno |
600000 |
Duração máxima do buffer em milissegundos. Intervalo válido: [100, ~]. O push falhará se o buffer estiver cheio. |
| habilitar3A |
bool |
falso |
Se deve aplicar o processamento 3A ao PCM de entrada |
Referência da API
| Função |
Android |
iOS |
HarmonyOS |
| Adicionar fluxo externo |
addAudioExternalStream(streamId, config) |
addAudioExternalStream:config: |
addAudioExternalStream(streamId, config) |
| Enviar dados de áudio |
pushAudioExternalStreamData(streamId, data) |
pushAudioExternalStreamData:data: |
pushAudioExternalStreamData(streamId, data) |
| Definir volume |
setAudioExternalStreamVolume(streamId, type, vol) |
setAudioExternalStreamVolume:type:volume: |
setAudioExternalStreamVolume(streamId, type, vol) |
| Obtenha volume |
getAudioExternalStreamVolume(streamId, type) |
getAudioExternalStreamVolume:type: |
getAudioExternalStreamVolume(streamId, type) |
| Limpar buffer |
clearAudioExternalStreamBuffer(streamId, fadeoutMs) |
clearAudioExternalStreamBuffer:fadeoutMs: |
clearAudioExternalStreamBuffer(streamId, fadeoutMs) |
| Remover fluxo |
removeAudioExternalStream(streamId) |
removeAudioExternalStream: |
removeAudioExternalStream(streamId) |
Práticas recomendadas para envio de dados
- Ligar
pushAudioExternalStreamData em um loop para garantir que os dados sejam enviados com êxito.
- Se o código de erro 110 (buffer cheio) for retornado, suspenda por 30 ms e tente novamente. Não descarte dados.
- Antes de o motor desligar, pare primeiro o push loop e depois ligue
removeAudioExternalStream.
- Para captura em tempo real, cada quadro dura 10 ms - chame push sempre que houver dados disponíveis. Para entrada baseada em arquivo, cada quadro dura 40 ms - chame push uma vez a cada 30 ms.
Retornos de chamada de quadro de áudio
Os retornos de chamada de quadro de áudio permitem obter dados PCM brutos em diferentes pontos do pipeline de áudio, para uso em análise de áudio, processamento personalizado, gravação e cenários semelhantes.
Posições de fontes de dados suportadas
| Fonte de dados |
Valor enum |
Descrição |
| Capturado |
0 |
Dados de áudio brutos após captura, antes do processamento 3A |
| Processo Capturado |
1 |
Dados de áudio após processamento 3A. Os retornos de chamada começam somente após uma conexão bem-sucedida. |
| Publicar |
2 |
Dados de áudio prestes a serem publicados. Requer uma conexão bem-sucedida. |
| Reprodução |
3 |
Dados de áudio prestes a serem reproduzidos (downlink remoto) |
Parâmetros de configuração de retorno de chamada
| Parâmetro |
Tipo |
Padrão |
Descrição |
| taxa de amostra |
interno |
48.000 |
Taxa de amostragem para áudio de retorno de chamada |
| canais |
interno |
1 |
Contagem de canais para áudio de retorno de chamada. Suporta 1 ou 2. |
| modo |
AoqAudioObserverMode |
Somente leitura |
Modo somente leitura (0) ou leitura-gravação (1) |
Etapas de uso
- Cadastre o observador: Ligue
setAudioFrameObserver para definir o ouvinte de retorno de chamada do quadro de áudio.
- Habilitar a fonte de dados: Ligue
enableAudioFrameObserver para selecionar a posição da fonte de dados e iniciar retornos de chamada.
- Tratar dados de retorno de chamada: processa dados PCM no retorno de chamada.
Referência da API
| Função |
Android |
iOS |
HarmonyOS |
| Cadastrar observador |
setAudioFrameObserver(listener) |
setAudioFrameObserver: |
setAudioFrameObserver(observer) |
| Habilitar retornos de chamada |
enableAudioFrameObserver(enabled, source, config) |
enableAudioFrameObserver:audioSource:config: |
enableAudioFrameObserver(enabled, source, config) |
Métodos de retorno de chamada
| Retorno de chamada |
Android |
iOS |
HarmonyOS |
| Dados capturados |
onCapturedAudioFrame(frame) |
onCapturedAudioFrame: |
onCapturedAudioFrame(frame) |
| Dados pós-3A |
onProcessCapturedAudioFrame(frame) |
onProcessCapturedAudioFrame: |
onProcessCapturedAudioFrame(frame) |
| Publicar dados |
onPublishAudioFrame(trackType, frame) |
onPublishAudioFrame:frame: |
onPublishAudioFrame(trackType, frame) |
| Dados de reprodução |
onPlaybackAudioFrame(frame) |
onPlaybackAudioFrame: |
onPlaybackAudioFrame(frame) |
Estado de áudio e roteamento
O SDK monitora automaticamente as alterações de estado do dispositivo de áudio e as opções de roteamento, além de notificar a camada de aplicação por meio de retornos de chamada.
Códigos de estado do dispositivo
| Código do estado |
Valor |
Descrição |
| AoqAudioDeviceNenhum |
0 |
Estado inicial |
| RegistroIniciando |
1 |
Captura começando |
| Registro iniciado |
2 |
Captura iniciada |
| Parada de registro |
3 |
Parada de captura |
| Registro parado |
4 |
Captura interrompida |
| Falha na gravação |
5 |
Falha na captura |
| JogarIniciando |
6 |
Início da reprodução |
| Jogo iniciado |
7 |
A reprodução começou |
| Parada de jogo |
8 |
Parada de reprodução |
| PlayStopped |
9 |
A reprodução parou |
| Falha na reprodução |
10 |
Falha na reprodução |
Tipos de roteamento de dispositivos
| Rota |
Valor |
Descrição |
| Padrão |
0 |
Padrão |
| Fone de ouvido |
1 |
Fone de ouvido com fio |
| Fone de ouvido |
2 |
Fone de ouvido |
| Fone de ouvidoNoMic |
3 |
Fone de ouvido sem microfone |
| Viva-voz |
4 |
Palestrante |
| Usb |
5 |
Dispositivo USB |
| Bluetooth |
6 |
Bluetooth SCO |
| BluetoothA2dp |
7 |
Bluetooth A2DP |
Referência de retorno de chamada
| Retorno de chamada |
Android |
iOS |
HarmonyOS |
| Mudança de estado do dispositivo |
onAudioDeviceStateChanged(state) |
onAudioDeviceStateChanged: |
onAudioDeviceStateChanged(state, reason) |
| Mudança de rota |
onAudioDeviceRouteChanged(routeType) |
onAudioDeviceRouteChanged: |
onAudioDeviceRouteChanged(routeType) |
| Dispositivo interrompido |
onAudioDeviceInterrupted(interrupt) |
onAudioDeviceInterrupted: |
onAudioDeviceInterrupted(interrupt) |
| Estado do arquivo |
onAudioFileState(state) |
onAudioFileState: |
onAudioFileState(fileId, stateCode, errorCode) |
Erro de áudio e códigos de aviso
Códigos de erro de áudio
| Código de erro |
Valor |
Descrição |
| AoqErrorCodeÁudio |
100 |
Erro geral de áudio |
| ÁudioExternalBufferFull |
110 |
Buffer externo cheio |
| Dispositivo de áudio |
120 |
Erro geral do dispositivo |
| Gravação AuthFalha |
121 |
Permissão de microfone negada |
| GravaçãoOcupado |
122 |
Microfone em uso por outro processo |
| GravaçãoFundoIniciar |
123 |
Começou a gravar em segundo plano |
| GravaçãoStartFail |
124 |
Falha ao iniciar a gravação |
| PlayoutOcupado |
125 |
Dispositivo de reprodução em uso por outro processo |
| PlayoutBackgroundIniciar |
126 |
Iniciou a reprodução em segundo plano |
| PlayoutStartFail |
127 |
Falha ao iniciar a reprodução |
| Fone de ouvidoRequerVoipMode |
128 |
O fone de ouvido requer que o modo VoIP esteja ativado |
Códigos de aviso de áudio
| Código de aviso |
Valor |
Descrição |
| AoqWCAudio |
100 |
Aviso sonoro geral |
| ÁudioUivando |
101 |
Uivo detectado |
| Dispositivo de áudio |
120 |
Aviso geral do dispositivo |
| MicEnumerateError |
121 |
Erro de enumeração de microfone |
| MicStartTimeout |
122 |
Tempo limite de início do microfone |
| Erro de gravação |
123 |
Erro de gravação |
| SpeakerEnumerateError |
124 |
Erro de enumeração de alto-falantes |
| Alto-falanteStartTimeout |
125 |
Tempo limite de início do alto-falante |
| Erro de reprodução |
126 |
Erro de reprodução |
Somente iOS: controle AVAudioSession
No iOS, o setAudioSessionRestriction A API oferece controle refinado sobre como o SDK gerencia o sistema AVAudioSession.
| Controle |
Descrição |
| Definir categoria |
Se o SDK pode definir a categoria da sessão |
| Configurar sessão |
Se o SDK pode configurar parâmetros de sessão |
| Desativar sessão |
Se o SDK pode desativar a sessão |
| Ativar Sessão |
Se o SDK pode ativar a sessão |
Passe uma combinação bit a bit de valores de restrição para limitar o controle do SDK sobre AVAudioSession e evitar conflitos com outros componentes de áudio na camada de aplicativo.