Controlador de audio personalizado (iOS)

Visión general

El SDK de OpenTok para iOS te permite configurar un controlador de audio personalizado para emisores y suscriptores. Puedes utilizar un controlador de audio personalizado para personalizar el audio de las transmisiones de los emisores y los suscriptores. Utilizarás el controlador de audio personalizado cuando quieras iniciar y detener el audio, así como reproducir tu propio archivo de audio. Cuando quieras hacer «cualquier cosa» con el audio, aparte del comportamiento predeterminado del SDK para el chat de vídeo en directo, deberás utilizar controladores de audio personalizados.

Configuración de tu proyecto

El código de esta sección se encuentra en el Tonos de llamada muestra en el Repositorio «opentok-ios-sdk-samples». Si aún no lo has hecho, tendrás que clonar el repositorio en un directorio local; esto se puede hacer mediante la línea de comandos:

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

Abre el proyecto en XCode para seguir los pasos

Explorar el código

Esta aplicación de ejemplo utiliza el controlador de audio personalizado, definido por OTDefaultAudioDevice, incluido en el SDK de OpenTok para iOS. Tanto los emisores como los suscriptores utilizan este controlador de audio. En esta aplicación, la transmisión del suscriptor es la misma que la del emisor (una transmisión de autosuscripción). Primero emitimos y, a continuación, detenemos la captura de audio del emisor, de modo que podamos reproducir un tono de llamada exclusivamente en un AVAudioPlayer de Apple. Cuando el suscriptor se une (10 segundos después de que la aplicación emita la transmisión), el reproductor del tono de llamada deja de reproducirse. A continuación, el controlador de audio personalizado vuelve a capturar y reproducir audio.

La clase `OTAudioDeviceRingtone` hereda de `OTDefaultAudioDevice`. La mayor parte del procesamiento de audio de bajo nivel se lleva a cabo en `OTDefaultAudioDevice`. Esta utiliza Apple Audio Units para procesar, grabar y reproducir audio. OTDefaultAudioDevice también es compatible con Bluetooth, gestiona los cambios de ruta, etc. Este tutorial no aborda estas funciones avanzadas; simplemente muestra un uso sencillo del protocolo del ciclo de vida de OTAudioDevice para iniciar y detener el audio.

Si deseas realizar cualquier procesamiento de audio relacionado con el dispositivo (iPhone), como habilitar CallKit, reproducir archivos MP3, tonos de llamada, procesamiento de tramas de audio, etc., debes utilizar controladores de audio personalizados. Consulta el proyecto «Custom-Audio-Driver» en el repositorio «opentok-ios-sdk-samples» para obtener más detalles.

Si lo que quieres es limitarte a capturar, procesar y reproducir audio fotograma a fotograma, puedes utilizar los transformadores de audio de WebRTC, ya que son muy fáciles de usar. Consulta el proyecto «Media-Transformers» en el repositorio «opentok-ios-sdk-samples» para obtener más detalles.

Aplicación de tonos de llamada

Un tono de llamada es un audio externo que se reproduce mediante la API AVAudioPlayer de Apple Audio. Dado que el sistema de audio del iPhone es un objeto singleton global, reproducir el tono de llamada en él sin detener nuestro flujo de audio provoca que los sonidos se mezclen. Por lo tanto, la aplicación primero debe detener la captura del audio del editor, a continuación reproduce el tono de llamada y, por último, habilita la captura y la reproducción de audio cuando se une un suscriptor. Inicializamos la aplicación Ringtone de la siguiente manera:


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

El tono de llamada (representado como una URL) se reproducirá de forma indefinida mediante las API de AVAudioPlayer. El siguiente código muestra el flujo de operaciones de parada, reproducción e inicio:


- (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 del ciclo de vida de OTAudioDevice

El [self startCapture] El método inicia la captura de audio del editor, y el [self startRendering] El método inicia la reproducción de audio del suscriptor.

Del mismo modo, el [self stopCapture] El método impide que el editor capture, y el [self stopRendering] El método impide que el suscriptor reproduzca su audio. Estos métodos sobrescritos no hacen gran cosa en la aplicación de ejemplo, salvo llamar al método padre.

Nuestro código de audio personalizado ofrece tres métodos auxiliares relacionados con los tonos de llamada, tal y como se indica a continuación:


#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;
}    

Estos métodos se utilizan en el ViewController. Tras publicar el vídeo, el doPublish El método inicia el tono de llamada. Cuando se conecta el flujo de autosuscripción, el subscriberDidConnectToStream detiene el tono de llamada.

¡Enhorabuena! Has completado el tutorial sobre controladores de audio personalizados para iOS.
Puedes seguir probando y modificando el código que has creado aquí, o echar un vistazo a la Próximos pasos abajo.

Próximos pasos

Cuando hayas terminado aquí, sigue desarrollando y mejorando tu aplicación de OpenTok con estos útiles recursos: