Driver de áudio personalizado (iOS)

Visão geral

O SDK do OpenTok para iOS permite que você configure um driver de áudio personalizado para emissores e assinantes. Você pode usar um driver de áudio personalizado para personalizar o áudio dos fluxos dos emissores e assinantes. Você utilizará o driver de áudio personalizado quando quiser iniciar e interromper o áudio, bem como reproduzir seu próprio arquivo de áudio. Quando quiser fazer “qualquer coisa” com o áudio, além do comportamento padrão do SDK para bate-papo por vídeo ao vivo, você deverá usar drivers de áudio personalizados.

Configurando seu projeto

O código desta seção está no Toques amostra no repositório opentok-ios-sdk-samples. Caso ainda não tenha feito isso, você precisará clonar o repositório em um diretório local — isso pode ser feito usando a linha de comando:

git clone https://github.com/opentok/opentok-ios-sdk-samples.git

Abra o projeto no XCode para acompanhar o passo a passo

Explorando o código

Este aplicativo de exemplo utiliza o driver de áudio personalizado — definido pelo OTDefaultAudioDevice incluído no SDK do OpenTok para iOS. O driver de áudio é utilizado tanto pelos emissores quanto pelos assinantes. Neste aplicativo, o fluxo do assinante é o mesmo que o do emissor (um fluxo de autoassinatura). Primeiro, publicamos e, em seguida, interrompemos a captura do áudio do emissor, para que possamos reproduzir um toque exclusivamente em um AVAudioPlayer da Apple. Quando o assinante entra na chamada (10 segundos após o aplicativo publicar o fluxo), o reprodutor de toque interrompe a reprodução. O driver de áudio personalizado então volta a capturar e reproduzir o áudio.

A classe OTAudioDeviceRingtone herda de OTDefaultAudioDevice. A maior parte do processamento de áudio de baixo nível é realizada na classe OTDefaultAudioDevice. Ela utiliza o Apple Audio Units para processar, gravar e reproduzir áudio. A OTDefaultAudioDevice também oferece suporte a Bluetooth, lida com mudanças de rota, etc. Este tutorial não aborda esses recursos avançados; ele apenas mostra um uso simples do protocolo de ciclo de vida da OTAudioDevice para iniciar e parar o áudio.

Se você quiser realizar qualquer processamento de áudio relacionado ao dispositivo (iPhone), como habilitar o CallKit, reproduzir arquivos MP3, toques de celular, processamento de quadros de áudio etc., deve usar drivers de áudio personalizados. Consulte o projeto Custom-Audio-Driver no repositório opentok-ios-sdk-samples para obter mais detalhes.

Se você deseja apenas capturar, processar e reproduzir áudio quadro a quadro, pode usar os transformadores de áudio do WebRTC, que são mais fáceis de usar. Consulte o projeto Media-Transformers no repositório opentok-ios-sdk-samples para obter mais detalhes.

Aplicativo de toques

Um toque é um áudio externo reproduzido por meio da API AVAudioPlayer da Apple. Como o sistema de áudio do iPhone é um objeto singleton global, reproduzir o toque nele sem interromper nosso fluxo de áudio leva à sobreposição de sons. Portanto, o aplicativo precisa primeiro interromper a captura do áudio do publisher, depois reproduzir o toque e, por fim, reativar a captura e a reprodução de áudio quando um subscriber se conectar. Inicializamos o aplicativo Ringtone da seguinte maneira:


- (instancetype)initWithRingtone:(NSURL *)url {
    self = [super init];
    if (self) {
        ringtoneURL = url;
    }
    return self;
}

O toque (representado por uma URL) será reproduzido indefinidamente usando as APIs do AVAudioPlayer. O código a seguir mostra o fluxo de paragem, reprodução e início:


- (void)playRingtoneFromURL:(NSURL*)url
{
    [self stopCapture];
    [self stopRendering];
    // Stop & replace existing audio player
    if (_audioPlayer) {
        [_audioPlayer stop];
        _audioPlayer = nil;
    }
    
    NSError* error = nil;
    _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                         error:&error];
    if (error) {
        NSLog(@"Ringtone audio player initialization failure %@", error);
        _audioPlayer = nil;
        return;
    }
    [_audioPlayer setDelegate:self];
    
    // Tell player to loop indefinitely
    [_audioPlayer setNumberOfLoops:-1];

    // setup timer to vibrate device with some frequency
    if (_vibratesWithRingtone) {
        _vibrateTimer =
        [NSTimer scheduledTimerWithTimeInterval:VIBRATE_FREQUENCY_SECONDS
            target:self
            selector:@selector(buzz:)
            userInfo:nil
            repeats:YES];
    }
    
    // finally, begin playback
    [_audioPlayer play];
}

Métodos do ciclo de vida do OTAudioDevice

O [self startCapture] O método inicia a captura de áudio do editor, e o [self startRendering] O método inicia a reprodução de áudio do assinante.

Da mesma forma, o [self stopCapture] O método impede que o editor capture, e o [self stopRendering] O método impede que o assinante reproduza seu áudio. Esses métodos sobrescritos não fazem muita coisa no aplicativo de exemplo, exceto chamar o método pai.

Nosso código de áudio personalizado disponibiliza três métodos auxiliares relacionados a toques, conforme segue:


#pragma mark - Exposed interface methods
- (void)startRingtone {
    if (_audioPlayer == nil) {
        [self playRingtoneFromURL:ringtoneURL];
    }
}

- (void)stopRingtone {
    // Stop Audio
    [_audioPlayer stop];
    _audioPlayer = nil;
    
    // Stop vibration
    [_vibrateTimer invalidate];
    _vibrateTimer = nil;
    
    [self startCapture];
    [self startRendering];

}

- (BOOL)isRingTonePlaying {
    return _audioPlayer != nil;
}    

Esses métodos são utilizados na ViewController. Após publicar o vídeo, o doPublish O método inicia o toque. Quando o fluxo de autoinscrição se conecta, o subscriberDidConnectToStream O método interrompe o toque.

Parabéns! Você concluiu o tutorial sobre drivers de áudio personalizados para iOS.
Você pode continuar experimentando e ajustando o código que desenvolveu aqui, ou conferir o Próximos passos abaixo.

Próximos passos

Quando terminar esta seção, continue desenvolvendo e aprimorando seu aplicativo OpenTok com estes recursos úteis: