カスタムオーディオドライバー(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アプリケーションの構築と機能強化を続けてください: