Xcode のビルドエラー、再生の問題、シーク動作、キャッシングなど、iOS 向け ApsaraVideo Player SDK に関するよくある問題のソリューションを紹介します。
ライセンス関連の問題
無効または期限切れのライセンスに関する問題は、ライセンスのよくある質問を参照して解決してください。
プラットフォーム共通の問題
-
プラットフォームに依存しない問題については、「クロスプラットフォームプレーヤーの FAQ」をご確認ください。
-
経験豊富な開発者は、「再生エラーのトラブルシューティング」を独自に行うこともできます。
開発上の問題
Xcode 14 でアプリをパッケージ化して App Store にレビューを提出する際のエラー
ビットコード関連のエラー
現象:Xcode 14 のビルドを App Store に提出する際に、ビットコード関連のエラーが発生します。
ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.解決策:xcrun bitcode_strip コマンドを実行して、フレームワークからビットコードを削除してください。${framework_path} は、フレームワークのバイナリのパスです。
xcrun bitcode_strip ${framework_path} -r -o ${framework_path}cURL 関連のエラー
現象:Xcode 14 のビルドを App Store に提出する際に、cURL 関連のエラーが発生します。
ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/AliyunPlayer.framework/AliyunPlayer: _curl_multi_poll, _curl_multi_wakeup. If method names in your source code match the private Apple APIs listed above, altering your method names will help prevent this app from being flagged in future submissions. In addition, note that one or more of the above APIs may be located in a static library that was included with your app. If so, they must be removed. For further information, visit the Technical Support Information at http://developer.apple.com/support/technical/解決策:
プロジェクトに ApsaraVideo Player SDK (AliPlayerSDK_iOS) のみを統合している場合は、SDK を 5.4.9.2 より後のバージョンにアップグレードしてください。
プロジェクトに ApsaraVideo Player SDK (AliPlayerPartSDK_iOS) とショートビデオ SDK の両方を統合している場合は、ApsaraVideo Player SDK を 5.4.9.2 より後のバージョンに、alivcffmpeg (QuCore-ThirdParty) をバージョン 4.3.6 に、ショートビデオ SDK を 3.26 より後のバージョンにアップグレードしてください。
非公開 API に関するエラー
症状: Xcode 14 ビルドを App Store に提出すると、Xcode でのアプリ配布時に [警告ありで配布完了] ダイアログボックスが表示され、アプリが AliyunMediaDownloader.framework/AliyunMediaDownloader 内の非公開セレクター onCompletion: を参照しているという [App Store Connect 操作エラー] が発生します。
解決策:これは Xcode 14 のビルドで発生する警告であり、通常、プロジェクトが正常にビルドされればリリースに影響はありません。 アプリをリリースできない場合は、Xcode 13 を使用してください。
フレーム補間・シャープ化用の後処理プラグイン (mpf_filter.framework、vfi_filter.framework など) に関するエラー
症状: Xcode 14 ビルドを App Store に送信すると、フレーム補間およびシャープ化用の後処理プラグイン (mpf_filter.framework、vfi_filter.framework) に関連するエラーが発生します。 Xcode でアプリを配布すると、Payload/xxx.app/Frameworks/mpf_filter.framework の CFBundleIdentifier com.alibaba.AliyunPlayer.mpf_filter と vfi_filter.framework の CFBundleIdentifier com.alibaba.AliyunPlayer.vfi_filter に無効な文字 (アンダースコア) が含まれていることを示す 2 つの Asset validation failed エラーが原因で、[Distribution failed with errors] エラーが発生します。 CFBundleIdentifier には、英数字、ドット (.)、ハイフン (-) のみを含めることができます。
解決策:
エラーメッセージで言及されているプラグインをプロジェクトで使用していない場合は、そのプラグインを削除してください。 これにより、プレーヤーの機能に影響を与えることなく、パッケージサイズを削減できます。
プロジェクトでエラーに記載されているプラグインを使用する必要がある場合は、フレームワークパス配下の
"Bundle identifier"ファイルにある Info.plist キーの値の文字列から、一時的に"_"を削除し、プロジェクトをコンパイルしてビルドできます。命名が修正されたバージョン 5.5.2.0 以降にアップグレードすることもできます。
iOS デモをコンパイルして実行する際に、「Xcode Error: PhaseScriptExecution failed with a nonzero exit code」エラーが発生した場合はどうすればよいですか。
次の手順に従ってください: 1. プロジェクトディレクトリに移動してください。 2. pod deintegrate を実行してください。
3. pod install を実行してください。
ApsaraVideo Player SDK for iOS 統合後の Xcode エミュレーターでのデバッグおよび実行
ApsaraVideo Player SDK for iOS はエミュレーターをサポートしていません。iPhone 実機でアプリをデバッグおよび実行してください。
現在の再生進捗の取得方法
ApsaraVideo Player SDK は、デフォルトで 500 ms ごとに再生進捗を通知します。より高い頻度で更新するには、間隔を短くします。
AVPConfig *config = [self.player getConfig];
config.positionTimerIntervalMs = 100; // コールバック間隔を変更します (単位:ms)。
[self.player setConfig:config];
/**
@brief: 現在の再生位置のコールバック。
@param player: プレーヤーのポインター。
@param position: 現在の再生位置。
*/
- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// 現在の再生進捗。
long currentPosition = position;
}ビデオの幅と高さの取得方法
3 つのメソッドがあります:
メソッド 1:プレーヤーの準備が完了 (AVPEventPrepareDone) したら、AliPlayer インスタンスから幅と高さを読み取ります。
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType { if (eventType == AVPEventPrepareDone) { NSLog(@"Video width: %d, height: %d", player.width, player.height); } }メソッド 2:ビデオサイズの変更コールバックをリッスンします。このコールバックは幅と高さを直接返します。
- (void)onVideoSizeChanged:(AliPlayer*)player width:(int)width height:(int)height rotation:(int)rotation { NSLog(@"Video width: %d, height: %d", width, height); }メソッド 3:トラック情報のコールバックをリッスンし、info 配列内の AVPTrackInfo から videoWidth と videoHeight を読み取ります。
説明このメソッドはネットワークリクエストに依存します。信頼性を高めるには、メソッド 1 またはメソッド 2 を使用してください。
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info { for (int i=0; i<info.count; i++) { AVPTrackInfo *trackInfo = info[i]; NSLog(@"Video width: %d, height: %d", trackInfo.videoWidth, trackInfo.videoHeight); } }
シーク操作の後にプログレスバーが戻る
原因:プレーヤーはデフォルトで不正確なシークを使用します。シーク操作の後、プレーヤーはシークポイント付近のキーフレームから再生を開始します。
解決策:正確なシークモードに切り替えてください。
正確なシークモードと不正確なシークモードの切り替え方法
例:
// 不正確なシークに切り替える
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_INACCURATE];
// 正確なシークに切り替える
[self.player seekToTime:1000 seekMode:AVP_SEEKMODE_ACCURATE];正確なシークモードに切り替えてもプログレスバーが戻る
原因:正確なシークは、不正確なシークよりも時間がかかります。シークポイントから最も近いキーフレームまでの距離が大きく、正確なシークの最大間隔を超える場合、ApsaraVideo Player SDK は自動的に不正確なシークへフォールバックするため、プログレスバーが戻ります。
解決策:正確なシークの最大間隔を増やして、不正確なシークへのフォールバックを減らしてください。間隔を大きくすると精度は向上しますが、キーフレーム間隔が大きい場合はシーク時間が増加する可能性があります:
// 単位: ms
[self.player setMaxAccurateSeekDelta:10000];ビデオキャッシング中のエラー: encrypt check fail
キャッシングの動作はダウンロードと同じです。セキュアダウンロードを有効にしている場合、暗号化検証ファイルはアプリ情報と一致している必要があります。オフラインダウンロードからファイルをダウンロードし、SDK に追加してください。ビデオダウンロードの手順に従ってください。従わない場合、キャッシングまたはダウンロードに失敗します。
オーディオおよびビデオソースデータの取得
次のコードは、オーディオおよびビデオソースデータを取得する例です。
// レンダリングコールバックを設定します。
self.player.renderingDelegate = self;
// レンダリングコールバックをリッスンします。
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
if (frameInfo.frameType == Cicada_FrameType_Video) { // 元となるビデオデータ
} else if (frameInfo.frameType == Cicada_FrameType_Audio) { // 元となるオーディオデータ
}
return NO;
}プレーヤーでの各ビデオフレームのピクセル取得方法
iOS 向け ApsaraVideo Player SDK :onRenderingFrame コールバックをリッスンすると、ピクセルを取得できます。
player.renderingDelegate = self;
#pragma mark CicadaRenderingDelegate
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo{
if(frameInfo.frameType==Cicada_FrameType_Video){
// ビデオ
NSLog(@"receive HW frame:%p pts:%ld foramt %d", frameInfo.video_pixelBuffer, frameInfo.pts, CVPixelBufferGetPixelFormatType(frameInfo.video_pixelBuffer));
} else if (frameInfo.frameType==Cicada_FrameType_Audio){
// オーディオ
}
return NO;
}アダプティブビットレートスイッチングのロジック
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO]; API を使用してアダプティブビットレートスイッチングを有効にすると、SDK はネットワーク速度を監視します。速度が 10 秒以内に次のビットレートレベルに達すると、プレーヤーは切り替わります。それ以外の場合は、現在のビットレートのままになります。
高ビットレートから低ビットレート:キャッシュされた高ビットレートコンテンツの再生が完了した後、プレーヤーは切り替えます。
低ビットレートから高ビットレート:プレーヤーは直ちに切り替えます。
カスタム再試行ロジック
SDK は、デフォルトで、失敗したネットワーク操作を 15 秒のタイムアウトで 2 回再試行します。すべての再試行が失敗した場合、エラーコールバックが呼び出されます。
再試行ロジックをカスタマイズするには、再試行回数を 0 に設定し、外部で再試行イベントを処理します。
AVPConfig *config = [self.player getConfig];
config.networkRetryCount = 0; // 再試行回数を設定します。この例では、0 に設定します。
[self.player setConfig:config];
/**
@brief: プレーヤーイベントのコールバック。
@param player: プレーヤーのポインター。
@param eventWithString: プレーヤーのイベントタイプ。
@param description: プレーヤーイベントの説明。
@see AVPEventType
*/
-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
if (eventWithString == EVENT_PLAYER_NETWORK_RETRY) { // ネットワークエラー。再試行が必要です。
// TODO: 処理ロジックを追加します。
}
}ローカルキャッシュ設定後、HLS ストリームの再生が 403 エラーで失敗する
症状: VidAuth とローカルキャッシュを有効にした状態で HLS (M3U8) ストリームを再生すると、403 エラーで失敗します。
原因:ビデオが完全にキャッシュされる前に終了すると、次の再生試行時にプレーヤーが有効期限切れの VidAuth 認証情報を再利用するため、403 エラーが発生します。
解決策: SDK V5.5.4.0 以降では、AVPConfig.enableStrictAuthMode フィールドを設定して、認証パラメータを持つ HLS ストリームの認証モードを制御できます。デフォルト値は false です。
非厳密認証 (
false):認証情報はメディアコンテンツと共にキャッシュされます。以前にメディアの一部のみがキャッシュされていた場合、プレーヤーはキャッシュされた認証情報を使用してキャッシュされていない部分をリクエストします。URL 認証の有効期間が短い場合や、長時間の休止後に再生を再開した場合、認証が期限切れになる可能性があります。これを処理するには、ソースの自動リフレッシュ機能を実装する必要があります。厳密認証 (
true):認証情報はキャッシュされません。認証は各再生セッションの開始時に行われます。これにより、ネットワーク接続がない場合に再生が失敗する可能性があります。
オーディオの横取りによって ApsaraVideo Player SDK for iOS で動画が再生されない問題
現象:プロジェクトで ApsaraVideo Player SDK と他のオーディオコントロールの両方を使用すると、音が出ない、または動画のコマ落ちなどの再生の問題が発生します。
原因:iOS の AVAudioSession はシングルトンです。複数のオーディオコントロール間で一元的に設定されていない場合、オーディオの横取りによって動画の再生が妨げられる可能性があります。
解決策:プロジェクトの適切な場所で AVAudioSession を一元的に設定できます。たとえば、アプリのオーディオセッションを再生カテゴリとして設定し、他のアプリとのミキシングを許可できます。また、録音と再生のシナリオ向けに、アプリのオーディオセッションを PlayAndRecord カテゴリとして設定することもできます。操作中にエラーが発生した場合、エラーメッセージは err 変数に格納されます。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];また、SDK 側でカスタム AVAudioSession プロキシを設定して、SDK 内部の AVAudioSession ロジックをバイパスし、横取りを防ぐこともできます:
プロキシを設定します。
[AliPlayer setAudioSessionDelegate:self];プロキシのリスナーを設定します。
return YESは、SDK が内部でAVAudioSessionを設定しなくなることを示します。#pragma mark CicadaAudioSessionDelegate - (BOOL)setActive:(BOOL)active error:(NSError **)outError { return YES; } - (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; } - (BOOL)setCategory:(AVAudioSessionCategory)category mode:(AVAudioSessionMode)mode routeSharingPolicy:(AVAudioSessionRouteSharingPolicy)policy options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError { return YES; }
ApsaraVideo Player SDK for iOS の実行中に SDK を指すスタッククラッシュ
ApsaraVideo Player SDK for iOS の使用中に SDK を指すスタッククラッシュが発生した場合は、次の手順に従ってください。
最新の ApsaraVideo Player SDK for iOS にアップグレードしてください。最新の SDK では、安定性が継続的に向上しています。最新の SDK は「SDK の概要」からダウンロードできます。
アップグレード後もクラッシュが続く場合は、完全なクラッシュ情報を Alibaba Cloud テクニカルサポートに提供してください。詳細については、「テクニカルサポートへのお問い合わせ」をご参照ください。
ApsaraVideo Player SDK for iOS は、再生中のダウンロードに対応していますか?
いいえ。この SDK はローカルキャッシュに対応しており、再生中に動画をダウンロードすることで、後からオフラインで再生できます。ただし、別のファイルディレクトリに保存されたキャッシュされたファイルの再生には対応していません。
ApsaraVideo Player SDK for iOS は動画のバッファリング速度を取得できますか?
はい。ApsaraVideo Player SDK for iOS では、バッファリング速度、リアルタイムレンダリングのフレームレート、オーディオとビデオのビットレート、ネットワークダウンロードのビットレートを取得できます。詳細については、再生情報を取得をご参照ください。
プレーヤー実行中のクラッシュ
原因を特定するには、次の手順に従ってください。
ApsaraVideo Player SDK でクラッシュが発生しているかどうかを確認してください。
クラッシュスタックに
AliyunPlayerプレフィックスが含まれているかどうかを確認してください。含まれている場合、ApsaraVideo Player SDK に起因する問題です。ApsaraVideo Player SDK を最新バージョンにアップグレードし、問題が解決されるかどうかを確認してください。
問題が解決しない場合は、ログの取得方法に記載されているように、クラッシュファイル (すべてのスレッド)、クラッシュログ、およびクラッシュシナリオをご準備ください。
ApsaraVideo Player SDK V5.4.6.0 の実行中におけるプログラムの初期化またはプリロードに関連するクラッシュ
ApsaraVideo Player SDK を V5.4.6.1 以降のバージョンにアップグレードしてください。V5.4.6.0 の安定性を維持するには、ホットフィックスバージョン pod 5.4.6.0-25587639 を使用することもできます。
フルスクリーン再生を有効にする方法
ApsaraVideo Player SDK for iOS は、フルスクリーン再生用の API を提供していません。 システム側でこの機能を実装する必要があります。 バージョン 5.5.0.0 以降のApsaraVideo Player SDK for iOS のデモは、iOS 16.0 以降のフルスクリーン表示に対応しています。
次のコードは、この機能を実装する方法の例です。
システムのフルスクリーン表示に切り替えた後、Aliplayer インスタンスに設定された playerView のフレームも画面に合わせて調整する必要があります。
UIInterfaceOrientation orientation = UIInterfaceOrientationLandscapeLeft; // フルスクリーンへ回転
......
// iOS 16.0 以降
if (@available(iOS 16.0, *)) {
@try {
NSArray *array = [[[UIApplication sharedApplication] connectedScenes] allObjects];
UIWindowScene *ws = (UIWindowScene *)array[0];
Class GeometryPreferences = NSClassFromString(@"UIWindowSceneGeometryPreferencesIOS");
id geometryPreferences = [[GeometryPreferences alloc]init];
UIInterfaceOrientationMask orientationMask = UIInterfaceOrientationMaskLandscapeRight;
if (orientation == UIInterfaceOrientationPortrait) {
orientationMask = UIInterfaceOrientationMaskPortrait;
}
[geometryPreferences setValue:@(orientationMask) forKey:@"interfaceOrientations"];
SEL sel_method = NSSelectorFromString(@"requestGeometryUpdateWithPreferences:errorHandler:");
void (^ErrorBlock)(NSError *err) = ^(NSError *err){
NSLog(@"画面回転エラー:%@", [err debugDescription]);
};
if ([ws respondsToSelector:sel_method]) {
(((void (*)(id, SEL,id,id))[ws methodForSelector:sel_method])(ws, sel_method,geometryPreferences,ErrorBlock));
}
} @catch (NSException *exception) {
NSLog(@"画面回転エラー:%@", exception.reason);
} @finally {
}
} else { // iOS 16.0 未満のシステム
if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {
SEL selector = NSSelectorFromString(@"setOrientation:");
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];
[invocation setSelector:selector];
[invocation setTarget:[UIDevice currentDevice]];
[invocation setArgument:&orientation atIndex:2];
[invocation invoke];
}
[[UIApplication sharedApplication]setStatusBarOrientation:orientation animated:YES];
}動画再生中に黒帯が表示される場合
原因を特定するには、次を確認します。
動画ソース自体に黒帯があるかどうかを確認します。
次の API を呼び出して、プレーヤーのスケーリングモードを調整できます。
/* AVP_SCALINGMODE_SCALEASPECTFILL :動画は画面いっぱいに拡大されます。 動画がトリミングされる場合があります。 AVP_SCALINGMODE_SCALEASPECTFIT :動画は画面に合わせて拡大縮小されます。 黒帯が表示される場合があります。 AVP_SCALINGMODE_SCALETOFILL :アスペクト比を維持せずに、動画を画面いっぱいに拡大します。 動画が歪む場合があります。 */ self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;スケーリングモードが要件を満たさない場合は、
self.player.playerViewのframeを変更することで、self.player.playerViewのカスタムビューの幅と高さを調整できます。
音声は再生されるが動画が表示されず、ログに「log[AFVTBDecoder] :IOS8VT: throw frame」と報告される場合
原因を特定するには、次を確認します。
別のプレーヤーを使用して動画を再生し、音声のみのファイルであるかどうかを確認します。
別のプレーヤーで動画が正常に再生され、動画の解像度が変更される場合は、ソフトウェアデコードに切り替えることができます。 次のコードで、ソフトウェアデコードに切り替えることができます。
player.enableHardwareDecoder = NO
iOSプレーヤーでソフトウェアデコードに切り替えた場合の影響
player.enableHardwareDecoder = NO を設定してソフトウェアデコードに切り替えた場合の主な影響は次のとおりです。
CPU 使用率が増加し、デバイスが発熱したり、バッテリー消費が速くなったりする可能性があります。
ハードウェアデコードの互換性の問題を効果的に回避できます。特に、動画の解像度が動的に変化するシーンや、デバイスの負荷が高いシーンでは、再生の安定性が向上します。
この記事の「音声は再生されるが動画が表示されず、ログに『log[AFVTBDecoder] :IOS8VT: throw frame』と報告される場合」の項では、この問題を解決するためにplayer.enableHardwareDecoder = NO を設定してソフトウェアデコードに切り替えることを提案しました。ここでは、この設定を有効化する前に比較検討できるよう、そのコストとメリットを補足説明します。
iOSクライアントでRTSストリームをプルする際にカクつきや音ズレが発生する場合
解決策:プレーヤーの最新の超低レイテンシーコンポーネントを統合してください。 詳細については、「iOSクライアントでのRTSストリームのプルを実装する」をご参照ください。
iOSアプリがバックグラウンドにあるか起動していない状態で、ユーザーが通知からアプリを開くと、音声は再生されるが動画は表示されない場合
解決策:UIApplicationStateActive == [[UIApplication sharedApplication] applicationState] を削除します。
- (AliPlayer *)aliPlayer{
if (!_aliPlayer && UIApplicationStateActive == [[UIApplication sharedApplication] applicationState]) {
_aliPlayer = [[AliPlayer alloc] init];
_aliPlayer.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
_aliPlayer.rate = 1;
_aliPlayer.delegate = self;
_aliPlayer.playerView = self.playerView;
}
return _aliPlayer;
}ライブストリームの再生時に、ログに標準エラー「-5, IO error (Input/Output (I/O))」が報告される場合
ライブストリームを再生する場合、キャッシュとレイテンシー制御の設定 (AVPConfig のstartBufferDuration、highBufferDuration、およびmaxBufferDuration) にはデフォルト値を使用してください。 これらの設定はカスタマイズしないでください。 「キャッシュとレイテンシー制御の設定」を参照して設定を確認してください。
再生を一時停止し、別の画面に遷移してから再生を再開すると、ログに「Deactivating an audio session that has running I/O.」または「All I/O should be stopped or paused prior to deactivating the audio session.」という音声関連のエラーが報告される場合
現象:動画再生ページで再生を一時停止し、音声のある別のページに移動してから戻ると、再生を再開できず、ログに「Deactivating an audio session that has running I/O.」や「All I/O should be stopped or paused prior to deactivating the audio session.」のような音声関連のエラーが報告されます。
解決策:音声設定 (オーディオセッションのプロパティ) の競合を確認してください。 たとえば、音声のある別のページを終了する際に、音声リソースが適時に解放されていない (関連する録音や音声再生が速やかに停止されていない) 可能性があります。
AliListPlayerを使用してHLS (m3u8) 動画を再生する際にエラーが発生する場合
ApsaraVideo Player SDK V5.4.5.0 未満は、リストプレーヤーAliListPlayer を使用した HLS (m3u8) 動画の再生をサポートしていません。 V5.4.5.0 以降では HLS (m3u8) 動画の再生をサポートしていますが、ローカルキャッシュを有効にする必要があります。
バックグラウンドで動画を再生できない場合
現象:ApsaraVideo Player SDK for iOS は、デフォルトではバックグラウンド再生をサポートしていません。 デモでもバックグラウンドで動画は再生されません。
解決策:
Xcode でバックグラウンド再生機能を有効にします。 Xcode で、ターゲットを選択し、[Capabilities] タブを開き、[Background Modes] トグルを [ON] に設定し、展開されたモードリストで [Audio, AirPlay, and Picture in Picture] を選択します。
アプリのフォアグラウンド/バックグラウンド監視メソッドを実装している場合は、関連する一時停止および開始メソッドをコメントアウトしてください。
// アプリがバックグラウンドに入ることを検出するオブザーバーを追加 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationEnterBackground) name: UIApplicationWillResignActiveNotification object:nil]; // アプリがバックグラウンドからフォアグラウンドに戻ったときに呼び出されるメソッド [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name: UIApplicationDidBecomeActiveNotification object:nil]; // コメントアウトする必要がある一時停止メソッド - (void)applicationEnterBackground { // [self.player pause]; } // コメントアウトする必要がある開始メソッド - (void)applicationDidBecomeActive { // [self.player start]; }
動画再生中に「Redirect to a url」エラーが時々発生する場合
このエラーは、動画ソースがハイジャックされているために発生する可能性があります。 これを解決するには、プレーヤーで HTTPDNS を有効にしてください。 詳細については、「iOSクライアントでHTTPDNSを設定する」をご参照ください。
ARTC ストリーム再生時の サポートされていないプロトコル エラー
原因 1: ApsaraVideo Player SDK は統合されていますが、プレーヤーと RTS コンポーネント (AlivcArtc) 間のブリッジレイヤーおよび RTS コンポーネント (RtsSDK) が統合されていません。
解決策: コンポーネントの統合方法については、「iOS クライアントでの RTS ストリームプル実装」をご参照ください。
原因 2: プレーヤーと RTS コンポーネント (AlivcArtc) 間のブリッジレイヤーのバージョンが、プレーヤーのバージョンと一致していません。
解決策: ブリッジレイヤー (AlivcArtc) とプレーヤーは、同じバージョン番号である必要があります。詳細については、「iOS クライアントで RTS ストリームプリングを実装する」をご参照ください。
複数の画質にトランスコードされた動画のデフォルト再生画質
SDK は、FD、LD、SD、HD、2K、4K、OD の順序で、最初に見つかった有効な画質を再生します。 詳細については、「画質」をご参照ください。
動画再生におけるデフォルト画質の指定方法
例:
// 次のコードは、VidSts を使用した再生の例です。
AVPVidStsSource *stsSource = [[AVPVidStsSource alloc] init];
stsSource.vid = @"<vid>";
stsSource.accessKeyId = @"<accessKeyId>";
stsSource.securityToken = @"<securityToken>";
stsSource.accessKeySecret = @"<accessKeySecret>";
stsSource.quality = @""; // 再生する画質。 有効な値:FD、LD、SD、HD、2K、4K、OD。
stsSource.forceQuality = NO; // 指定の画質で動画を強制的に再生するかどうかを指定します。 NO:指定の画質で動画を強制的に再生しません。プレーヤーはデフォルトの順序で画質を検索し、最初に見つかった画質で動画を再生します。 YES:指定の画質で動画を強制的に再生します。指定の画質が見つからない場合、動画は再生されません。1つの画質に複数のストリームがある場合の再生ストリーム
1 つの画質に複数のストリームがある場合、ApsaraVideo Player SDK は最新のストリームを再生します。
ウォーターマークなしでの動画再生とウォーターマーク付きでのダウンロード設定
動画を複数の画質にトランスコードします。 ウォーターマークなしの画質を再生し、ウォーターマーク付きの画質をダウンロードします。
ランドスケープモードが有効にならない
iOS 向け ApsaraVideo Player SDK は、ランドスケープモードを実装するためのメソッドを提供していません。この機能は、iOS システム API に基づいて実装する必要があります。ランドスケープモードを実装する際は、aliplayer.playerView の frame を正しく設定してください。
ログの取得方法
Alibaba Cloud テクニカルサポートにお問い合わせの際は、迅速な問題解決のため、ログをご提出ください。
ログを取得します。
ログを取得する前に、ログレベルを
LOG_LEVEL_TRACEに設定してください。詳細については、「SDK ログの取得」をご参照ください。生成されたログを Alibaba Cloud テクニカルサポートにご提供ください。
「テクニカルサポートを受ける」からお問い合わせいただけます。
ローカルキャッシュ有効時におけるマルチビットレート (HLS) 動画のキャッシュミス
現象:ドキュメントのとおりローカルキャッシュを有効にしてプリロードしたにもかかわらず、再生中にシークバックするとキャッシュミスが発生したり、ネットワーク切断後に再生を継続できなくなったり、キャッシュファイルのチェックで「存在しない」と返されたり、プリロードを無効にするとキャッシュディレクトリが空になったりします。
問題の原因: マルチビットレート (HLS) のシナリオでは、再生中に特定のストリームが明示的に選択されない場合、プレーヤーは ABR (アダプティブビットレート) モードで再生します。ABR モードのデータはディスクに保存されないため、ローカルキャッシュは生成されません。selectTrack を明示的に呼び出して特定のストリームを選択した後にのみ、選択したデータがローカルにキャッシュされます。selectTrack が呼び出されない (または SELECT_AVPTRACK_TYPE_VIDEO_AUTO が渡される) 場合は、ABR に従って処理されます。
解決策:プリロードと再生で同じ解像度と同じ再生アドレスを使用し、再生中にコードストリームを明示的に選択してください。
プリロード段階では、ローカルキャッシュを有効にし、指定した解像度のコードストリームのプリロードを開始します。
再生フェーズでは、
onPlayerEventが準備完了イベント (AVPEventPrepareDone) を受信した後にselectTrackを呼び出してプリロードと同じ解像度を選択し、setUrlSource(AVPUrlSource) でプリロードと同じ再生アドレスを使用した後に、prepareとstartを呼び出します。開始ビットレートがデフォルトビットレートと一致しない場合、バッファリングが発生します。切り替え時のカクつきを抑えるため、開始ビットレートを設定することを推奨します。
ローカルにダウンロードした HLS (m3u8) ファイルの再生における「No such file or directory」エラー
問題の現象:HLS をオフラインダウンロードした後、ローカルアドレスで再生すると No such file or directory (ファイルが見つからない) というエラーが表示されます。この問題は常に発生するわけではありませんが、複数ページの高速切り替え (高速スライド) などのシナリオで再現しやすくなります。
原因:HLS のオフラインダウンロードでは通常、容量を節約するために、いずれか 1 つの解像度 (例: 540p) の TS セグメントと m3u8 のみをダウンロードします。一方、ローカルに保存されたマスター m3u8 には、すべての解像度 (例: 1080p/720p/540p/360p) のレコードがそのまま残っています。再生時に prepare の前にダウンロードした解像度を指定しない場合、プレーヤーはデフォルトまたはアダプティブロジックに従って、ローカルに存在しない別解像度の TS セグメントをリクエストしようとするため、「ファイルが見つかりません」というエラーが報告されます。よくある原因として、解像度を指定する呼び出しが漏れていること、または呼び出しのタイミングが prepare より後になっていることが挙げられます。
解決策:
setDefaultResolution は prepare の前に呼び出され、オフラインダウンロードと同じ定義を指定します。
高速スライド、マルチインスタンス多重化、プリロード切り替えなど、すべての再生パスでデフォルト解像度が設定されていることを確認し、いずれかのパスで設定漏れを防ぎます。
getCurrentTrack を使用して、実際に再生されている解像度がダウンロードされた解像度であるかどうかを確認できます。
動画の切り替え後の音ズレ、または繰り返し再生時のキャッシュミス
問題:ローカルキャッシュを有効にした後、動画を切り替える (セット数の切り替えなど) と、音ズレ (画面は新しい動画だが、音声は前の動画のまま) が発生する、または同じ動画を繰り返し再生してもキャッシュにヒットしません。キャッシュをクリアすると、正常に戻ります。
原因:ローカルキャッシュを有効にすると、プレーヤーは setCacheUrlHashCallback コールバックが返すハッシュを、各再生アドレスの一意なキャッシュ識別子として使用します (iOS は C 関数ポインターを介してこのコールバックを実装します)。コールバックが「同じ再生アドレスは常に同じハッシュを返し、異なるコンテンツは異なるハッシュを返す」ことを保証しない場合、キャッシュキーの不一致が発生します。その結果、異なるコンテンツが同じキャッシュにヒットする (音ズレとして現れる)、または同じアドレスでも毎回ハッシュが異なるためキャッシュにヒットしない、といった問題が発生します。
解決策:
コールバックは、同じ再生アドレスに対して安定して同じハッシュを返し、異なるメディアには異なるハッシュを返す必要があります。
たとえば、認証パラメーターを削除してヒット率を高める場合は、再生アドレス (m3u8/mp4) から認証パラメーターを削除してからハッシュを計算します。暗号化された m3u8 の
keyURLは認証不要であるため、認証してしまうと異なる動画のキーが同じキャッシュにヒットし、再生失敗の原因になります。コールバック内でドメイン名に基づいて処理を分けることもできます。同じファイルに HTTP と HTTPS のアドレスがある場合は、プロトコルを統一するか、プロトコルヘッダーを削除してからハッシュを計算します。
詳細については、「高度な機能」をご参照ください。
Alibaba Cloud プライベート暗号化動画の再生における認証失敗
問題の現象:Alibaba Cloud 動画 (プライベート暗号化) で暗号化された動画を再生する際に、認証に失敗するか、再生できません。
原因:Alibaba Cloud 動画暗号化 (プライベート暗号化) は、プレーヤーとサーバー間の通信によって復号されるため、VID を用いて再生を開始する必要があります。オンデマンドの AVPUrlSource を使用して再生アドレスで直接再生する場合 (一般的なプライベート暗号化) 、認証と復号が完了できず、再生に失敗します。
解決策:
プライベート暗号化動画は、iOS ではオンデマンドの
AVPVidAuthSource(VidAuth) またはAVPVidStsSource(VidSts) を通じて再生する必要があります。出力ストリームに暗号化されていないストリームが混在している場合は、暗号化タイプをAliyunVoDEncryptionに設定して、プライベート暗号化ストリームをフィルターできます。注:「ライセンスプライベート暗号化」のみがオンデマンドの
AVPUrlSource再生をサポートしています (MP4 の場合は URL の末尾にetavirp_nuyila=1を付加する必要があり、HLS の場合は対応するサポートバージョンで元の URL を直接使用できます) 。通常のプライベート暗号化には適用されません。
詳細については、「暗号化された動画の再生」をご参照ください。