このトピックでは、ApsaraVideo Player SDK for iOS の使用に関する一般的な問題とその解決策について説明します。
ライセンスに関する問題
ライセンスの無効化や期限切れなどの問題については、「ライセンスに関するよくある質問」をご参照ください。
各クライアントのプレーヤーに共通する問題
どのクライアントでも発生する可能性のある問題については、「プレーヤーに関するよくある質問」をご参照ください。
開発経験がある場合は、「再生例外の自己トラブルシューティング」も可能です。
開発に関する問題
Xcode 14 でアプリをパッケージ化し、App Store にレビュー申請する際に発生するエラー
Bitcode 関連のエラー
現象:Xcode 14 でアプリをパッケージ化し、App Store にレビュー申請する際に、Bitcode 関連のエラーが発生します。以下にエラーメッセージの例を示します。
ITMS-90482: Invalid Executable - The executable 'xxx.app/Frameworks/alivcffmpeg.framework/alivcffmpeg' contains bitcode.解決策:`xcrun bitcode_strip` コマンドを実行して、フレームワークから手動で Bitcode を削除できます。以下の例では、`${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 にレビュー申請する際に、非公開 API に関するエラーが発生します。以下の図にエラーメッセージの例を示します。
解決策:上記のエラーは Xcode 14 のビルドからの警告です。ほとんどの場合、プロジェクトがビルドできれば、この警告はリリースに影響しません。アプリをリリースできない場合は、Xcode 13 を使用してリリースしてください。
フレーム補間やシャープ化のための mpf_filter.framework や vfi_filter.framework などの後処理プラグインに関するエラー
現象:Xcode 14 でアプリをパッケージ化し、App Store にレビュー申請する際に、フレーム補間やシャープ化のための mpf_filter.framework や vfi_filter.framework などの後処理プラグインに関するエラーが発生します。以下の図にエラーメッセージの例を示します。
解決策:
プロジェクトがエラーメッセージで言及されているプラグインを使用していない場合は、そのプラグインを削除できます。これにより、プレーヤーの機能に影響を与えることなく、パッケージサイズを削減できます。
プロジェクトがエラーメッセージで言及されているプラグインを使用する必要がある場合は、一時的にフレームワークパス配下の Info.plist ファイル内の
"Bundle identifier"キーと値のペアの値の文字列から"_"を削除してから、プロジェクトをコンパイルおよびビルドしてください。バージョン 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:iOS 用の AliPlayer インスタンスに対して prepare メソッドが呼び出され、プレーヤーの準備が完了した後 (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 は自動的に不正確なシークに切り替わります。これにより、プログレスバーが逆戻りします。
解決策:API を呼び出して、正確なシークの最大間隔をより大きく設定できます。これにより、プレーヤーが正確なシークから不正確なシークに切り替わる頻度が減り、シークの精度が向上します。ただし、シークポイントから最も近いキーフレームまでの距離が大きすぎると、シーク操作に時間がかかります。必要に応じて、正確なシークの最大間隔を設定してください。以下にコード例を示します。
// 単位:ms
[self.player setMaxAccurateSeekDelta:10000];動画キャッシュ中のエラー:encrypt check fail
キャッシュはダウンロードと同じです。セキュアダウンロードが有効になっている場合は、暗号化検証ファイルがアプリ情報と一致していることを確認してください。「オフラインダウンロード」で生成された暗号化検証ファイルをダウンロードし、ApsaraVideo Player SDK に保存する必要があります。詳細については、「動画のダウンロード」をご参照ください。そうしないと、キャッシュまたはダウンロードが失敗します。
音声および動画のソースデータの取得
以下に、音声および動画のソースデータを取得する方法のコード例を示します。
// レンダリングコールバックを設定
self.player.renderingDelegate = self;
// レンダリングコールバックをリッスン
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo {
if (frameInfo.frameType == Cicada_FrameType_Video) { // 基礎となる動画データ
} else if (frameInfo.frameType == Cicada_FrameType_Audio) { // 基礎となる音声データ
}
return NO;
}プレーヤー内の各動画フレームのピクセルを取得する方法
ApsaraVideo Player SDK for iOS:onRenderingFrame コールバックをリッスンすることでピクセルを取得できます。
player.renderingDelegate = self;
#pragma mark CicadaRenderingDelegate
- (BOOL)onRenderingFrame:(CicadaFrameInfo*) frameInfo{
if(frameInfo.frameType==Cicada_FrameType_Video){
// 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){
// Audio
}
return NO;
}アダプティブビットレート切り替えのロジック
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO]; API を呼び出してアダプティブビットレート切り替えを有効にすると、ApsaraVideo Player SDK は現在のネットワーク速度の統計を収集します。ネットワーク速度が 10 秒以内に次のビットレートレベルに達した場合、プレーヤーはそのビットレートに切り替わります。ネットワーク速度が 10 秒以内に次のビットレートレベルに達しない場合、プレーヤーは切り替えません。
高ビットレートから低ビットレートに切り替える場合、ネットワーク速度が 10 秒以内に次のビットレートレベルに達すると、高ビットレートでキャッシュされたコンテンツの再生が終了した後にプレーヤーが切り替わります。
低ビットレートから高ビットレートに切り替える場合、ネットワーク速度が 10 秒以内に次のビットレートレベルに達すると、プレーヤーはすぐに切り替わります。
カスタムリトライロジック
ネットワークリトライの場合、ApsaraVideo Player SDK はデフォルトで失敗した操作を 2 回リトライします。ネットワークタイムアウト期間は 15 秒です。リトライが失敗した場合、Error コールバックがトリガーされます。
リトライロジックをカスタマイズできます。リトライがトリガーされると、リトライイベントが外部モジュールに送信され、そこで特定のリトライロジックが決定されます。以下にコード例を示します。
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 エラーが発生します。
解決策:ApsaraVideo Player SDK V5.5.4.0 以降では、動画の再生 URL に認証パラメーターが含まれ、再生プロトコルが HLS の場合、AVPConfig.enableStrictAuthMode フィールドを設定して認証モードを選択できます。デフォルト値は false です。
非厳密署名 (`false`):署名もキャッシュされます。前回メディアの一部のみがキャッシュされた場合、次回非キャッシュ部分を再生する際に、プレーヤーはキャッシュされた署名を使用してリクエストを開始します。URL 署名の有効期間が非常に短い場合、これにより再生例外が発生します。
厳密署名 (`true`):署名はキャッシュされません。再生が開始されるたびに署名が行われます。これにより、ネットワーク接続がないと再生が失敗します。
オーディオの横取りによる ApsaraVideo Player SDK for iOS の動画再生不可
現象:コードベースのプロジェクトで ApsaraVideo Player SDK for iOS と他の音声再生コントロールの両方を使用しています。ApsaraVideo Player SDK for iOS を使用して動画を再生すると、音が出ない、動画がカクつくなどの問題が発生し、動画が再生できません。
原因:iOS の AVAudioSession 音声コントロールはシングルトンです。複数の音声再生コントロールが統一的に構成されていない場合、オーディオの横取りが発生する可能性があります。これにより、ApsaraVideo Player SDK for iOS が動画を再生できなくなります。
解決策:プロジェクトの適切な場所で AVAudioSession を統一的に構成できます。たとえば、アプリのオーディオセッションを再生カテゴリとして構成し、他のアプリとのミキシングを許可できます。また、録画および再生シナリオのために、アプリのオーディオセッションを PlayAndRecord カテゴリとして構成することもできます。操作中にエラーが発生した場合、エラーメッセージは err 変数に格納されます。
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&err];同時に、ApsaraVideo Player SDK for iOS 側では、AVAudioSession のプロキシをカスタマイズし、SDK 内部で定義された AVAudioSession ロジックを使用しないようにすることができます。これにより、ApsaraVideo Player SDK for iOS が引き起こす可能性のあるオーディオの横取りのリスクを回避できます。以下に、ApsaraVideo Player SDK for iOS 側での構成例を示します。
プロキシを設定します。
[AliPlayer setAudioSessionDelegate:self];プロキシのリスナーを設定します。
return TRUEは、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 の最新バージョンを使用していない場合は、最新バージョンにアップグレードしてください。ApsaraVideo Player SDK for iOS は安定性を向上させるために継続的に更新されています。最新の SDK の入手方法については、「SDK の概要」をご参照ください。
最新バージョンにアップグレードしてもクラッシュが解決しない場合は、完全なクラッシュ情報を Alibaba Cloud のテクニカルサポートに提供してください。テクニカルサポートの入手方法については、「テクニカルサポートの利用」をご参照ください。
ApsaraVideo Player SDK for iOS は、再生中のダウンロードに対応していますか?
いいえ。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.7.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(@"Screen rotation error:%@", [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(@"Screen rotation error:%@", 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のカスタムビューの幅と高さを、self.player.playerViewのframeを変更することで調整できます。
音声は再生されるが動画は表示されず、ログに「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))」が報告される
ライブストリームを再生する際は、キャッシュと遅延制御の設定 (startBufferDuration、highBufferDuration、および AVPConfig の 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.」などの音声関連のエラーが報告されます。
解決策:音声設定 (AudioSession プロパティ) の競合を確認してください。たとえば、音声のある別のページを終了する際に、音声リソースが時間内に解放されていない (関連する録音や音声再生が速やかに停止されていない) 可能性があります。
AliListPlayer を使用して HLS (m3u8) 動画を再生する際のエラー
V5.4.5.0 より前のバージョンの ApsaraVideo Player SDK は、リストプレーヤー AliListPlayer を使用した HLS (m3u8) 動画の再生をサポートしていません。V5.4.5.0 以降のバージョンでは HLS (m3u8) 動画の再生をサポートしていますが、ローカルキャッシュを有効にする必要があります。ローカルキャッシュを有効にする方法については、「ローカルキャッシュ」をご参照ください。
バックグラウンドで動画を再生できない
現象:ApsaraVideo Player SDK for iOS はバックグラウンドでの動画再生 (ユーザーがホームボタンを押した後も動画が再生され続けること) をサポートしていません。デモでもバックグラウンドでの動画再生に失敗します。
解決策:
Xcode でバックグラウンドデータ収集機能を有効にします。以下の図に例を示します。

アプリのフォアグラウンド/バックグラウンド監視メソッドを実装している場合は、関連する一時停止および再開メソッドをコメントアウトしてください。
// アプリがバックグラウンドに入ったことを検出するためのオブザーバーを追加 [[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 ストリーム再生時に unsupported protocol エラーが発生する
原因 1:ApsaraVideo Player SDK は統合されているものの、プレーヤーと RTS コンポーネント (AlivcArtc) 間のブリッジレイヤーおよび RTS コンポーネント (RtsSDK) が統合されていません。
解決策:コンポーネントの統合方法については、「iOS クライアントでの RTS ストリームフェッチングの実装」をご参照ください。
原因 2:プレーヤーと RTS コンポーネント (AlivcArtc) 間のブリッジレイヤーのバージョンが、プレーヤーのバージョンと一致していません。
解決策:プレーヤーと RTS コンポーネント (AlivcArtc) 間のブリッジレイヤーとプレーヤーは、同じバージョン番号である必要があります。実装の詳細については、「iOS クライアントでの RTS ストリームフェッチングの実装」をご参照ください。
動画が複数の解像度にトランスコードされている場合、ApsaraVideo Player SDK はデフォルトでどの解像度を再生しますか?
解像度のデフォルトの再生順序は、FD、LD、SD、HD、2K、4K、OD です。解像度の詳細については、「解像度」をご参照ください。ApsaraVideo Player SDK はこの順序で解像度を検索し、最初に見つかった解像度で動画を再生します。
ビデオ再生のデフォルト画質を指定する方法
以下にコード例を示します。
// 以下のコードは、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:期待される解像度で動画を強制的に再生します。期待される解像度が見つからない場合、動画は再生されません。定義に複数のストリームがある場合、ApsaraVideo Player SDK はどのストリームを再生しますか?
画質定義に複数のストリームがある場合、ApsaraVideo Player SDK は最新のストリームを再生します。
ウォーターマークなしで動画を再生し、ウォーターマーク付きでダウンロードするように設定する方法
動画を複数の解像度にトランスコードします。ウォーターマークのない解像度を再生し、ウォーターマークのある解像度をダウンロードします。
横向きモードが有効にならない
ApsaraVideo Player SDK for iOS は、横向きモードを実装するためのメソッドを提供していません。この機能は iOS システム API に基づいて実装する必要があります。横向きモードを実装する際は、aliplayer.playerView の frame を適切に設定してください。
ログの取得方法
Alibaba Cloud にテクニカルサポートを依頼する際は、問題をより効率的に解決するためにログを提出してください。以下にログの取得方法を説明します。
ログを取得します。
ログを取得する前に、ログレベルを
LOG_LEVEL_TRACEに設定してください。詳細については、「SDK ログの取得」をご参照ください。生成されたログを Alibaba Cloud のテクニカルサポートに提供します。
詳細については、「テクニカルサポートの利用」をご参照ください。