カスタムオーディオドライバー(iOS)

概要

OpenTok iOS SDK を使用すると、パブリッシャーおよびサブスクライバー向けにカスタムオーディオドライバーを設定できます。 カスタムオーディオドライバーを使用すると、パブリッシャーおよびサブスクライバーのストリームオーディオをカスタマイズできます。オーディオの開始や停止、独自のオーディオファイルの再生を行う際には、このカスタムオーディオドライバーを使用します。ライブビデオチャットにおけるSDKのデフォルトの動作以外の「あらゆる操作」をオーディオに対して行いたい場合は、カスタムオーディオドライバーを使用します。

プロジェクトの設定

このセクションのコードは 着信音 サンプルの opentok-ios-sdk-samples リポジトリ. まだ行っていない場合は、リポジトリをローカルディレクトリにクローンする必要があります。これはコマンドラインから次のように実行できます:

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

Xcodeでプロジェクトを開いて、手順に沿って進めてください

コードを詳しく見ていく

このサンプルアプリケーションでは、OpenTok iOS SDK に含まれる OTDefaultAudioDevice で定義されたカスタムオーディオドライバーを使用しています。このオーディオドライバーは、パブリッシャーとサブスクライバーの両方で使用されます。このアプリでは、サブスクライバーのストリームはパブリッシャーのストリームと同じです(自己サブスクライブ型ストリーム)。 まずパブリッシュを行い、その後パブリッシャーのオーディオのキャプチャを停止することで、AppleのAVAudioPlayerで着信音を独占的に再生できるようにしています。サブスクライバーが参加すると(アプリがストリームをパブリッシュしてから10秒後)、着信音の再生が停止します。その後、カスタムオーディオドライバはオーディオのキャプチャとレンダリングに戻ります。

OTAudioDeviceRingtone クラスは OTDefaultAudioDevice を継承しています。低レベルのオーディオ処理の大部分は OTDefaultAudioDevice で行われます。このクラスは、Apple Audio Units を使用してオーディオの処理、録音、再生を行います。 OTDefaultAudioDevice は Bluetooth にも対応しており、ルーティングの変更なども処理します。このチュートリアルでは、これらの高度な機能については扱わず、OTAudioDevice のライフサイクルプロトコルを使用してオーディオの開始と停止を行う簡単な方法のみを紹介します。

CallKitの有効化、MP3ファイルや着信音の再生、オーディオフレームの処理など、デバイス(iPhone)に関連するオーディオ処理を行いたい場合は、カスタムオーディオドライバーを使用する必要があります。詳細については、opentok-ios-sdk-samples リポジトリ内の「Custom-Audio-Driver」プロジェクトを参照してください。

オーディオをフレーム単位でキャプチャ、処理、再生することのみを目的とする場合は、利便性の観点から WebRTC オーディオトランスフォーマーを使用することができます。詳細については、opentok-ios-sdk-samples リポジトリ内の Media-Transformers プロジェクトを参照してください。

着信音アプリ

着信音とは、Apple AudioのAVAudioPlayer APIを使用して再生される外部オーディオのことです。iPhoneのオーディオシステムはグローバルなシングルトンオブジェクトであるため、オーディオフローを停止せずにその上で着信音を再生すると、音が混ざり合ってしまいます。 そのため、アプリはまずパブリッシャーのオーディオのキャプチャを停止し、着信音を再生した後、サブスクライバーが参加した時点でオーディオのキャプチャとレンダリングを再開する必要があります。Ringtoneアプリは次のように初期化します:


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

着信音(URLとして指定)は、AVAudioPlayer API を使用して無期限に再生されます。以下のコードは、停止、再生、開始の流れを示しています。


- (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];
}

OTAudioDevice のライフサイクルメソッド

について [self startCapture] このメソッドは、パブリッシャーのオーディオキャプチャを開始し、 [self startRendering] このメソッドは、サブスクライバーのオーディオ再生を開始します。

同様に [self stopCapture] このメソッドは、パブリッシャーによるキャプチャを停止させ、そして [self stopRendering] このメソッドは、サブスクライバーによるオーディオのレンダリングを停止させます。サンプルアプリでは、これらのオーバーライドされたメソッドは、親メソッドを呼び出す以外にはほとんど何も行いません。

当社のカスタムオーディオでは、着信音に関連する以下の3つのヘルパーメソッドを提供しています:


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

これらの手法は、 ViewController. 動画を公開した後、その doPublish このメソッドは着信音を再生します。自己サブスクライブ型ストリームが接続されると、 subscriberDidConnectToStream メソッドは着信音を停止します。

おめでとうございます!iOS向けカスタムオーディオドライバーのチュートリアルを完了しました。
ここで作成したコードをさらに試したり調整したりすることもできますし、あるいは 次のステップ の下にある。

次のステップ

ここでの作業が終わったら、以下の役立つリソースを活用して、OpenTokアプリケーションの構築と機能強化を続けてください: