このトピックでは、Push SDK for iOSを使用するときに発生する可能性のある例外と特殊なケースについて説明します。 このトピックでは、このような例外と特殊なケースを処理する方法についても説明します。
エラーと例外の処理
Push SDKは、次のタイプのコールバックを提供します。
コールバックタイプ | クラス |
ストリーム取り込みコールバック | AlivcLivePusherInfoDelegate |
ネットワークコールバック | AlivcLivePusherNetworkDelegate |
エラーコールバック | AlivcLivePusherErrorDelegate |
バックグラウンドミュージックのコールバック | AlivcLivePusherBGMDelegate |
レタッチとフィルターに関連するコールバック | AlivcLivePusherCustomFilterDelegate |
ストリーム取り込みコールバック
プレビュー開始のコールバック、最初のフレームをレンダリングするコールバック、オーディオまたはビデオストリームの最初のフレームを送信するコールバック、ストリーム取り込み開始のコールバック、ストリーム取り込み停止のコールバックなど、SDKステータスをアプリに通知するために使用されます。
onPushStartedおよびonFirstFramePushed: ストリームの取り込みが成功したことを示します。
onPushStarted: サーバーが接続されていることを示します。
onFirstFramePushed: オーディオまたはビデオストリームの最初のフレームが送信されることを示します。
ネットワークコールバック
ネットワークコールバックは、SDKに関するネットワークステータスとリンクステータスをアプリに通知するために使用されます。
基本モード: 基本的なライブストリーミングシナリオ
onConnectFail: ストリームの取り込みが失敗したことを示します。 取り込みURLが有効かどうか (たとえば、URLに無効な文字が含まれているかどうか) 、認証の問題があるかどうか、同時に取り込まれたストリームの数の上限を超えているかどうか、およびストリームがブラックリストにあるかどうかを確認することをお勧めします。 ストリームの取り込みを試みる前に、取り込みURLが有効で利用可能であることを確認してください。 該当するエラーコードは、0x30020901〜0x30020905、0x30010900〜0x30010901です。
onConnectionLost: ネットワークが切断されていることを示します。 ネットワークが切断されると、SDKは自動的にネットワークへの再接続を試み、onReconnectStartコールバックを起動します。 再接続試行の最大許容数 (config.connectRetryCount) に達したが、ネットワークがまだ回復されていない場合、SDKはonReconnectErrorコールバックを起動します。
onNetworkPoor: ネットワーク速度が遅いことを示します。 このコールバックを受け取った場合、ストリームが中断されずに実行を続けることができても、現在のネットワークでは取り込みストリームを完全にサポートできない場合があります。 この場合、アプリのユーザーインターフェイス (UI) でユーザーに通知するなど、独自のビジネスロジックを処理できます。
onNetworkRecovery: ネットワークが回復されたことを示します。
onReconnectError: ネットワーク再接続が失敗したことを示します。 現在のネットワークを確認し、ネットワークが復旧したときにストリームを再取り込みすることを推奨します。
onSendDataTimeout: データの送信時にタイムアウトが発生することを示します。 現在のネットワークを確認し、ネットワークが復旧したときにストリームを再取り込みすることを推奨します。
onPushURLAuthenticationOverdue: 署名された取り込みURLの有効期限が近づいていることを示します。 URL署名が有効になっている場合、取り込みURLにはauth_keyフィールドが含まれ、Alibaba Cloudはこれを定期的に検証します。 このコールバックは、取り込みURLの有効期限が切れる1分前に起動されます。 コールバックが返された後、元のURLの有効期限が切れたときにストリーム取り込みが中断されないように、新しい取り込みURLを指定する必要があります。
インタラクティブモード: 共同ストリーミングシナリオ
onConnectFail: ストリームの取り込みが失敗したことを示します。 コストリーミング用の取り込みURLのトークンが有効かどうか、およびネットワークが正常かどうかを確認することをお勧めします。 ストリームの取り込みを試みる前に、取り込みURLが有効であり、ネットワークが正常であることを確認してください。
onConnectionStatusChange: 接続ステータスが変わることを示します。 コールバックでは、接続ステータスが返されます。 たとえば、ネットワークが切断され、ネットワーク接続が確立され、ネットワークが接続され、ネットワーク接続が失敗します。 コールバックでAliLiveConnectionStatusFailedが返された場合、接続を回復することはできません。 この場合、現在のネットワークを確認し、ネットワークが回復した後にストリームを再取り込みします。 接続ステータスを取得するには、このコールバックを対話モードで設定することを推奨します。
onPushURLTokenWillExpire: コストリーミングの取り込みURLのトークンの有効期限が近づいていることを示します。 このコールバックは、トークンの有効期限が切れる30秒前に起動されます。 コールバックを受け取った後、ビジネスサーバーからの新しいトークンを含むコストリーミングの取り込みURLを即座に要求し、refreshPushURLTokenを呼び出して新しいトークンをSDKに渡す必要があります。
onPushURLTokenExpired: コストリーミングの取り込みURLのトークンが期限切れになったことを示します。 このコールバックが発生した場合、ストリームを再取り込みするために新しいトークンを含む取り込みURLを使用する必要があります。
onPusherNetworkQualityChanged: アップストリームネットワーク品質が変更されることを示します。 コールバックを使用して、アップストリームネットワークの品質を評価できます。
onConnectionLost: ネットワークが切断されていることを示します。 インタラクティブモードでは、onConnectionLostコールバックが発生すると、接続を回復できません。 現在のネットワークを確認し、ネットワークの復旧後にストリームを再取り込みすることを推奨します。
エラーコールバック
onSystemError: システムデバイスの例外を示します。 あなたはエンジンを破壊し、再試行する必要があります。
onSDKError: SDKエラーを示します。 エラーコードに基づいて操作を実行する必要があります。
エラーコードが805438211場合、デバイスのパフォーマンスは低く、エンコードとレンダリングのフレームレートは低くなります。 ストリーマーにプロンプトを表示し、高度なレタッチやアニメーションなどの時間のかかるビジネスロジックをアプリ層で停止する必要があります。
マイクとカメラの権限に関連するコールバックに特別な注意を払う必要があります。 268455940エラーコードは、アプリがマイクの権限を必要とすることを示します。 268455939エラーコードは、アプリがカメラの権限を必要とすることを示します。
他のエラーコードについては、追加の操作は必要ない。 すべてのエラーコードはログに記録されます。
バックグラウンドミュージックのコールバック
onOpenFailed: バックグラウンドミュージックの開始に失敗したことを示します。 音楽ファイルが有効かどうか、および関連する方法で指定した音楽ファイルのパスが正しいかどうかを確認してください。 startBGMAsyncメソッドを呼び出して、音楽を再度再生できます。
onDownloadTimeout: バックグラウンドミュージックの再生中のタイムアウトを示します。 これは通常、バックグラウンドミュージックがURLから来るときに発生します。 この場合は、ネットワークの状態を確認し、startBGMAsyncメソッドを呼び出して音楽を再度再生してください。
レタッチSDKとの相互接続
AlivcLivePusherCustomFilterDelegateのコールバックを使用して、サードパーティのレタッチSDKと相互接続し、基本および高度なレタッチ機能を実装できます。 AlivcLivePusherCustomFilterDelegateを使用すると、Push SDKでテクスチャまたはCVPixelBufferコールバックをトリガーできます。 レタッチSDKはコールバックを処理し、処理したテクスチャまたはCVPixelBufferデータをPush SDKに返すことができます。 このようにして、レタッチ効果が実装されます。
基本モード: 基本的なライブストリーミングシナリオ
基本モードでは、AlivcLivePushConfigのlivePushModeはAlivcLivePushBasicModeに設定されます。 プッシュSDKは、CVPixelBufferデータの代わりにAlivcLivePusherCustomFilterDelegateを使用してテクスチャIDを取得します。 次のコールバックが含まれています。
onCreate: Open Graphics Library (OpenGL) コンテキストが作成されることを示します。 このコールバックを使用して、レタッチエンジンを初期化できます。
onProcess: OpenGLテクスチャが更新されたことを示します。 SDK内の生テクスチャのIDが取得されます。 このコールバックでは、レタッチメソッドを呼び出して、処理されたテクスチャのIDを返すことができます。
onDestory: OpenGLコンテキストが破棄されたことを示します。 このコールバックは、レタッチエンジンを破壊するために使用できます。
インタラクティブモード: 共同ストリーミングシナリオ
インタラクティブモードでは、AlivcLivePushConfigのlivePushModeはAlivcLivePushInteractiveModeに設定されます。 プッシュSDKはAlivcLivePusherCustomFilterDelegateを使用してCVPixelBufferデータまたはテクスチャIDを取得します。 デフォルトでは、CVPixelBufferデータが取得されます。
CVPixelBufferデータ
対話モードでは、Push SDKはonProcessVideoSampleBufferメソッドを呼び出して、デフォルトでCVPixelBufferデータを取得します。 このコールバックからCVPixelBufferデータをレタッチSDKに送信し、処理したデータをプッシュSDKに書き込むだけで済みます。 同時に、このメソッドの戻り値をYESに設定して、レタッチ効果を実装します。 戻り値がNOに設定されている場合、データはPush SDKに書き戻されず、レタッチ効果は実装されません。 CVPixelBufferデータを取得すると、AlivcLivePusherCustomFilterDelegateのonProcessVideoSampleBuffer以外のメソッドは呼び出されません。
テクスチャID
対話モードでは、Push SDKはデフォルトでCVPixelBufferデータを取得します。 AlivcLivePushConfigのenableLocalVideoTexture変数をYESに設定すると、CVPixelBufferデータの代わりにテクスチャIDが取得されます。 テクスチャIDが取得されると、onProcessVideoSampleBuffer以外のメソッドが呼び出されます。
onCreate: OpenGLコンテキストが作成されたことを示します。 このコールバックを使用して、レタッチエンジンを初期化できます。
onProcess: OpenGLテクスチャが更新されたことを示します。 SDK内の生テクスチャのIDが取得されます。 このコールバックでは、レタッチメソッドを呼び出して、処理されたテクスチャのIDを返すことができます。
onDestory: OpenGLコンテキストが破棄されたことを示します。 このコールバックは、レタッチエンジンを破壊するために使用できます。
レタッチSDKがバッファーを使用して顔認識アルゴリズムを処理する必要がある場合は、AlivcLivePusherCustomDetectorDelegateのコールバックが必要です。 すべてのレタッチ操作がこれらのコールバックを必要としません。 特定のレタッチSDKのみが顔認識を実行するためにバッファーを必要とします。 これらのSDKでは、AlivcLivePusherCustomFilterDelegateを使用してレタッチ効果を実装するテクスチャIDを取得し、AlivcLivePusherCustomDetectorDelegateを使用して顔認識を実行するバッファを取得します。 CVPixelBufferデータをレタッチSDKに渡す場合、前述の処理手順は不要です。
レタッチSDKでバッファーを使用して顔認識アルゴリズムを処理するには、onDetectorProcessコールバック関数を使用します。 コールバック関数はバッファデータを返します。 インタラクティブモードでは、テクスチャIDを取得し、バッファも必要な場合は、AlivcLivePushConfigでenableLocalVideoRawBufferを有効にして、onDetectorProcessコールバック関数をトリガーする必要があります。
特別なケースを扱う
ネットワーク切断の処理
短期間のネットワーク切断およびネットワーク切り替え: ネットワーク切断またはネットワーク切り替えが発生すると、SDKはネットワークへの再接続を試みます。 AlivcLivePushConfigクラスを使用して、再接続タイムアウト期間と再接続の最大試行回数を設定できます。 SDKがネットワークに再接続した後、ストリーム取り込みが再開されます。 ApsaraVideo Playerを使用する場合は、AliVcMediaPlayerPlaybackDidFinishNotificationタイムアウト通知を受け取ってから5秒後に再接続操作を実行することを推奨します。
長期間のネットワーク切断: 再接続要求がタイムアウトするか、再接続の試行回数が上限を超えた場合、SDKはネットワークへの再接続に失敗します。 この場合、
onReconnectError:error:
コールバックが発生します。 ネットワーク接続が回復したら、reconnectAsynを呼び出してネットワークに再接続します。 SDKをApsaraVideo Playerに再接続する必要もあります。ネットワーク接続を外部から監視することを推奨します。
サーバーを使用して、ストリーマー側とプレーヤー間の通信障害を処理します。 たとえば、ストリーマーがサーバーから切断された場合、サーバーはAlibaba Cloud CDNからストリーム取り込み割り込みのコールバックを受け取ります。 サーバーはコールバックメッセージをプレーヤーにプッシュします。 次に、プレーヤはストリーム取り込み中断を処理する。 サーバーは同じ手順を使用してストリーム取り込みを再開します。
再生を停止し、ApsaraVideo Playerを再起動して、プレーヤーをサーバーに再接続します。 これを達成するには、stop、prepareToPlayを呼び出し、順番に再生します。
[self.mediaPlayer stop]; AliVcMovieErrorCode err = [self.mediaPlayer prepareToPlay:[NSURL URLWithString:@"Streaming URL"]]; if(err != ALIVC_SUCCESS) { NSLog(@"play failed,error code is %d",(int)err); return; } [self.mediaPlayer play];
説明ApsaraVideo Playerの詳細については、「高度な機能」をご参照ください。
アプリをバックグラウンドに切り替えるか、電話に応答する
SDKは、バックグラウンドモードの組み込み設定を提供します。 アプリをバックグラウンドに切り替えると、ビデオは最後のフレームで一時停止されます。 アプリはバックグラウンドでオーディオを再生し続けます。 Xcodeでプロジェクトを開きます。 [署名と機能] タブで、[バックグラウンドモード] セクションの [オーディオ] 、[AirPlay] 、[ピクチャインピクチャ] を選択します。 これにより、アプリをバックグラウンドに切り替えたときに音声を収集できます。 次の図は、設定を示しています。
アプリをバックグラウンドに切り替えるとストリーム取り込みエンジンを破棄し、アプリをフォアグラウンドに戻すとストリーム取り込みエンジンを再作成できます。 このようにして、アプリがバックグラウンドに切り替えられたときにオーディオ収集を停止できます。
この方法を使用する場合は、アプリをバックグラウンドに切り替えたときにUIApplicationWillResignActiveNotificationとUIApplicationDidBecomeActiveNotificationをリッスンするように設定する必要があります。 そうでなければ、エラーが発生します。
外部オーディオの再生
ストリーム取り込みページで外部オーディオを再生するには、代わりにAVAudioPlayerを使用することをお勧めします。 外部オーディオ再生を設定したら、AVAudioSession設定を更新する必要があります。 サンプルコード:
- (void)setupAudioPlayer {
NSString *filePath = [[NSBundle
mainBundle] pathForResource:@"sound" ofType:@"wav"];
NSURL *fileUrl = [NSURL URLWithString:filePath];
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:nil];
self.player.volume = 1.0;
[self.player prepareToPlay];
}
- (void)playAudio {
self.player.volume = 1.0;
[self.player play];
// Configure AVAudioSession settings.
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setMode:AVAudioSessionModeVideoChat error:nil];
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker|AVAudioSessionCategoryOptionAllowBluetooth
| AVAudioSessionCategoryOptionMixWithOthers error:nil];
[session setActive:YES error:nil];
}
ストリーム取り込み中のビューのサイズの変更
startPreviewまたはstartPreviewAsyncを呼び出すときに、UIViewパラメーターの値を確認します。 プレビュー内のすべてのサブビューのフレームパラメータの値を変更します。 サンプルコード:
[self.livePusher startPreviewAsync:self.previewView];
for (UIView *subView in [self.previewView subviews]) {
// ...
}
プレビューをiPhone Xに合わせる
ほとんどの場合、すべてのプレビューは携帯電話でフルスクリーンモードで適切に表示できます。 ただし、iPhone Xの画面には特別なアスペクト比があります。 したがって、プレビューは、iPhone Xでフルスクリーンモードで表示されると歪んでいます。iPhone Xでフルスクリーンモードでプレビューを使用しないことをお勧めします。
Set the bitrate
SDKは動的ビットレート機能をサポートしています。 AlivcLivePushConfigクラスを使用して、デフォルトのビットレートを変更できます。 異なるサービスは異なるビデオ品質を必要とする。 出力ビデオの解像度、滑らかさ、および品質は、取り込まれたストリームのビットレートによって異なります。
ビデオ品質: 取り込まれたストリームのビットレートが高いほど、ビデオ品質が高いことを示します。 より高いビデオ品質を確保するために、より高いビットレートを設定することを推奨します。
ビデオの滑らかさ: 取り込まれたストリームのビットレートが高いほど、より多くのネットワーク帯域幅が必要です。 劣悪なネットワーク条件でのより高いビットレートは、ビデオ再生の滑らかさに影響し得ます。
コンパイルエラー
Building for iOSで、リンクされて埋め込まれたフレームワークXXX.framework 'がiOS + iOS Simulator用にビルドされた
場合、次の操作を実行します。
[Xcode] メニューをクリックします。
を選択して、ダイアログボックスの設定を入力します。
[Build System] で [Legacy Build System] を選択します。
クイーンの依存関係が見つかりません
手動統合の場合は、Queen_SDK_iOSのドキュメントを参照して、対応する依存関係を追加してください。
SDKと統合されたアプリをapp Storeに提出できませんでした
RtsSDKは、すべてのプラットフォームにライブラリを提供します。 app Storeにアプリを送信する場合は、シミュレータアーキテクチャを削除する必要があります。 たとえば、lipo -remove
を実行してx86_64アーキテクチャを削除できます。