このトピックでは、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` コマンドを実行して、framework から手動で bitcode を削除できます。次の例では、${framework_path} は framework のバイナリファイルのパスです。
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 などの後処理プラグイン関連のエラーが発生します。次の図はエラーメッセージの例です。
ソリューション:
プロジェクトがエラーメッセージで言及されているプラグインを使用していない場合は、そのプラグインを削除できます。これにより、プレーヤーの機能に影響を与えることなく、パッケージサイズを削減できます。
プロジェクトがエラーで言及されているプラグインを使用する必要がある場合は、一時的に 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 秒です。リトライが失敗した場合、エラーコールバックがトリガーされます。
リトライロジックはカスタマイズできます。リトライがトリガーされると、リトライイベントが外部モジュールに送信され、そこで具体的なリトライロジックが決定されます。次のコードは例です。
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のframeを変更することで、self.player.playerView用のカスタムビューの幅と高さを調整できます。
音声は再生されるが動画が表示されず、ログに「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、maxBufferDuration in AVPConfig) にはデフォルト値を使用してください。これらの設定をカスタマイズしないでください。詳細については、「キャッシュと遅延制御の設定」を参照して、キャッシュと遅延制御の設定をカスタマイズしたかどうかを確認してください。
再生を一時停止し、別のページに移動してから戻って再生を再開すると、ログに音声関連のエラー:「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 のテクニカルサポートに提供します。
詳細については、「テクニカルサポートの利用」をご参照ください。