すべてのプロダクト
Search
ドキュメントセンター

ApsaraVideo VOD:iOS プレーヤーのよくある質問

最終更新日:Aug 27, 2026

ApsaraVideo Player SDK for iOS に関する一般的な問題 (Xcode のビルドエラー、再生の問題、シーク動作、キャッシュなど) の解決策について説明します。

ライセンス関連の問題

ライセンスに関するよくある質問で、無効または期限切れのライセンスの問題を解決してください。

プラットフォーム共通の問題

開発に関する問題

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 でアプリを配布する際に、[Distribution completed with warnings] ダイアログボックスが表示され、[App Store Connect Operation Error] が示されます。このエラーは、アプリが AliyunMediaDownloader.framework/AliyunMediaDownloader 内の非公開セレクター onCompletion: を参照していることを示します。

解決策:これは Xcode 14 のビルド時に表示される警告であり、通常はプロジェクトが正常にビルドされていればリリースに影響しません。アプリがリリースできない場合は、Xcode 13 を使用してください。

フレーム補間やシャープ化のための後処理プラグイン (mpf_filter.framework、vfi_filter.framework など) に関連するエラー

症状:Xcode 14 のビルドを App Store に提出する際に、フレーム補間やシャープ化のための後処理プラグイン (mpf_filter.framework、vfi_filter.framework) に関連するエラーが発生します。Xcode でアプリを配布する際に、[Distribution failed with errors] エラーが発生し、2 つの Asset 検証失敗エラーが示されます。`CFBundleIdentifier` com.alibaba.AliyunPlayer.mpf_filter of Payload/xxx.app/Frameworks/mpf_filter.framework と `CFBundleIdentifier` com.alibaba.AliyunPlayer.vfi_filter of vfi_filter.framework には無効な文字 (アンダースコア) が含まれています。`CFBundleIdentifier` には、英数字、ドット (.)、ハイフン (-) のみを含めることができます。

解決策:

  • プロジェクトがエラーメッセージで言及されているプラグインを使用していない場合は、そのプラグインを削除できます。これによりプレーヤーの機能に影響はなく、パッケージサイズを削減できます。

  • プロジェクトがエラーで言及されているプラグインを使用する必要がある場合は、フレームワークパスの下にある 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:プレーヤーの準備が完了した後 (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;
}

プレーヤー内の各ビデオフレームのピクセルを取得する方法

ApsaraVideo Player SDK for iOS: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 は、失敗したネットワーク操作をデフォルトで 2 回、15 秒のタイムアウトでリトライします。すべてのリトライが失敗した場合、Error コールバックが発行されます。

リトライロジックをカスタマイズするには、リトライ回数を 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 プロキシを設定して、内部の AVAudioSession ロジックをバイパスし、横取りを防ぐこともできます。

  1. プロキシを設定します。

    [AliPlayer setAudioSessionDelegate:self];
  2. プロキシのリスナーを設定します。

    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 を指すスタッククラッシュが発生した場合は、次の手順に従ってください。

  1. 最新の ApsaraVideo Player SDK for iOS にアップグレードしてください。これには継続的な安定性の改善が含まれています。最新の SDK は「SDK の概要」からダウンロードしてください。

  2. アップグレード後もクラッシュが続く場合は、完全なクラッシュ情報を Alibaba Cloud のテクニカルサポートに提供してください。「テクニカルサポートの利用」をご参照ください。

ApsaraVideo Player SDK for iOS は再生中のダウンロードをサポートしていますか?

いいえ。SDK はローカルキャッシュをサポートしており、再生中にビデオをダウンロードして後でオフラインで使用できます。ただし、別のファイルディレクトリに保存されたキャッシュファイルの再生はサポートしていません。

ApsaraVideo Player SDK for iOS はビデオのバッファリング進捗の取得をサポートしていますか?

はい。ApsaraVideo Player SDK for iOS は、バッファリング速度、リアルタイムのレンダリングフレームレート、オーディオとビデオのビットレート、およびネットワークダウンロードビットレートの取得をサポートしています。「再生情報の取得」をご参照ください。

プレーヤーの実行中にクラッシュが発生する

原因を特定するには:

  1. クラッシュが ApsaraVideo Player SDK で発生しているかどうかを確認します。

    クラッシュスタックに AliyunPlayer プレフィックスが含まれているかどうかを確認します。含まれている場合、問題は ApsaraVideo Player SDK で発生しています。

  2. 最新バージョンの ApsaraVideo Player SDK にアップグレードし、問題が解決されたかどうかを確認します。

  3. 問題が解決しない場合は、「ログの取得方法」で説明されているように、クラッシュファイル (すべてのスレッド)、クラッシュログ、およびクラッシュシナリオを準備してください。

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];
}

ビデオ再生中に黒帯が表示される

原因を特定するには:

  1. ビデオソース自体に黒帯があるかどうかを確認します。

  2. 次の API を呼び出して、プレーヤーのスケーリングモードを調整できます。

    /*
    AVP_SCALINGMODE_SCALEASPECTFILL: ビデオは画面いっぱいに拡大されます。ビデオがトリミングされる場合があります。
    AVP_SCALINGMODE_SCALEASPECTFIT: ビデオは画面に合わせて拡大されます。黒帯が表示される場合があります。
    AVP_SCALINGMODE_SCALETOFILL: ビデオはアスペクト比を維持せずに画面いっぱいに拡大されます。ビデオが歪む場合があります。
    */
    self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
  3. スケーリングモードが要件を満たさない場合は、frame of self.player.playerView を変更することで、self.player.playerView のカスタムビューの幅と高さを調整できます。

音声は再生されるがビデオが表示されず、ログに「log[AFVTBDecoder] :IOS8VT: throw frame」と報告される

原因を特定するには:

  1. 別のプレーヤーでビデオを再生し、音声のみのファイルかどうかを確認します。

  2. ビデオが別のプレーヤーで正常に再生され、ビデオの次元が変更された場合は、ソフトウェアデコードに切り替えることができます。次のコードは、ソフトウェアデコードに切り替える方法を示しています。

    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))」が報告される

ライブストリームを再生する場合、キャッシュと遅延制御の設定 (startBufferDurationhighBufferDuration、および 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) ビデオを再生するとエラーが発生する

ApsaraVideo Player SDK の V5.4.5.0 より前のバージョンでは、リストプレーヤー AliListPlayer を使用した HLS (m3u8) ビデオの再生はサポートされていません。 V5.4.5.0 以降のバージョンでは HLS (m3u8) ビデオの再生がサポートされていますが、ローカルキャッシュを有効にする必要があります。 ローカルキャッシュ

バックグラウンドでビデオを再生できない

症状:ApsaraVideo Player SDK for iOS はデフォルトでバックグラウンド再生をサポートしていません。デモもバックグラウンドでビデオを再生しません。

解決策:

  1. Xcode でバックグラウンドデータ収集機能を有効にします。Xcode でターゲットを選択し、[Capabilities] タブを開き、[Background Modes] トグルを [ON] に設定し、展開された Modes リストで [Audio, AirPlay, and Picture in Picture] を選択します。

  2. アプリのフォアグラウンド/バックグラウンド監視メソッドを実装している場合は、関連する一時停止および再開メソッドをコメントアウトします。

    // アプリがバックグラウンドに入ったことを検出するためのオブザーバーを追加します
    [[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) 間のブリッジレイヤーのバージョンがプレーヤーのバージョンと一致していません。

解決策:ブリッジレイヤー (AlivcArtc) とプレーヤーは同じバージョン番号である必要があります。「iOS クライアントでの RTS ストリームフェッチングの実装」をご参照ください。

ビデオが複数の解像度にトランスコードされている場合、ApsaraVideo Player SDK はデフォルトでどの解像度を再生しますか?

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 つの解像度に複数のストリームがある場合、ApsaraVideo Player SDK はどのストリームを再生しますか?

1 つの解像度に複数のストリームがある場合、ApsaraVideo Player SDK は最新のストリームを再生します。

ビデオをウォーターマークなしで再生し、ウォーターマーク付きでダウンロードするように設定する方法

ビデオを複数の解像度にトランスコードします。ウォーターマークなしの解像度を再生し、ウォーターマーク付きの解像度をダウンロードします。

横画面モードが有効にならない

ApsaraVideo Player SDK for iOS は、横画面モードを実装するためのメソッドを提供していません。この機能は iOS システム API に基づいて実装する必要があります。横画面モードを実装する際は、frame of aliplayer.playerView を適切に設定してください。

ログの取得方法

Alibaba Cloud のテクニカルサポートにリクエストする際は、問題解決を迅速化するためにログを提出してください。

  1. ログを取得します。

    ログを取得する前に、ログレベルを LOG_LEVEL_TRACE に設定します。「SDK ログの取得」をご参照ください。

  2. 生成されたログを Alibaba Cloud のテクニカルサポートに提供します。

    テクニカルサポートの利用」をご参照ください。

ローカルキャッシュを有効にした後、マルチビットレート (HLS) ビデオでキャッシュミスが発生する

問題の現象:ドキュメントに従ってローカルキャッシュを有効にし、プリロードしましたが、再生中にキャッシュされた部分までシークバックするとキャッシュミスが発生する、ネットワークを切断すると再生が続行できない、キャッシュファイルのチェックで存在しないと返される、またはプリロードをオフにするとキャッシュディレクトリが空になる。

問題の原因:マルチビットレート (HLS) のシナリオでは、再生中に特定のストリームが明示的に選択されていない場合、プレーヤーは ABR (アダプティブビットレート) モードで再生し、ABR モードのデータはディスクに書き込まれないため、ローカルキャッシュは生成されません。selectTrack を明示的に呼び出して特定のコードストリームを選択した後にのみ、選択されたデータがローカルにキャッシュされます。selectTrack が呼び出されない場合 (または SELECT_AVPTRACK_TYPE_VIDEO_AUTO が渡された場合)、ABR として処理されます。

解決策:プリロードと再生で同じ解像度と同じ再生アドレスを使用し、再生中にコードストリームを明示的に選択するようにしてください。

  1. プリロード段階では、ローカルキャッシュが有効になり、指定された解像度のコードストリームでプリロードが開始されます。

  2. 再生フェーズでは、onPlayerEvent が準備完了イベント (AVPEventPrepareDone) を受信した後に selectTrack を呼び出し、プリロードと同じ解像度を選択します。setUrlSource(AVPUrlSource) はプリロードと同じ再生アドレスを使用し、その後 preparestart を実行します。

  3. 開始ビットレートがデフォルトのビットレートと一致しない場合、バッファリングがトリガーされます。切り替え時のカクつきを減らすために、開始ビットレートを設定することを推奨します。

ローカルにダウンロードした HLS (m3u8) ファイルを再生すると、「No such file or directory」エラーが発生する

問題の現象:HLS をオフラインでダウンロードした後、ローカルアドレスを再生すると No such file or directory (ファイルが見つかりません) と報告されます。この問題は必ずしも発生するわけではなく、複数ページの高速切り替え (高速スワイプ) などのシナリオで再現しやすくなります。

問題の原因:HLS のオフラインダウンロードは通常、スペースを節約するために、いずれかの解像度 (例:540p) の ts スライスと m3u8 のみをダウンロードしますが、ローカルに保存されたマスター m3u8 は、すべての解像度 (例:1080p/720p/540p/360p) のレコードをそのまま保持します。再生中に、prepare の前にダウンロードした解像度が指定されていない場合、プレーヤーはデフォルト/アダプティブロジックに従ってローカルに存在しない他の解像度部分をリクエストしようとし、その結果ファイルが見つからないと報告されます。一般的な原因は、指定された解像度での呼び出しの省略、または prepare よりも後のタイミングでの呼び出しです。

解決策

  1. prepare の前に setDefaultResolution を呼び出し、オフラインダウンロードと同じ解像度を指定します。

  2. 高速スワイプ、複数インスタンスの多重化、プリロードの切り替えなど、すべての再生ポータルでデフォルトの解像度が設定されていることを確認し、1 つのパスも見逃さないようにします。

  3. getCurrentTrack を使用して、実際の開始解像度がダウンロードされた解像度であるかどうかを確認できます。

ビデオ切り替え後に音声と映像のズレが発生する、または同じビデオを繰り返し再生してもキャッシュにヒットしない

問題の現象:ローカルキャッシュを有効にした後、ビデオを切り替える (エピソードを切り替えるなど) と、音声と映像のズレ (画面は新しいビデオで、音声は前のビデオのまま) が発生したり、同じビデオを繰り返し再生してもキャッシュにヒットしなかったりします。キャッシュをクリアすると正常に戻ります。

問題の原因:ローカルキャッシュを有効にすると、プレーヤーは setCacheUrlHashCallback コールバックによって返されるハッシュを各再生アドレスの一意のキャッシュ識別子として使用します (iOS はこのコールバックを C 関数ポインターを介して実装します)。コールバックが「同じ再生アドレスは常に同じハッシュを返し、異なるコンテンツは異なるハッシュを返す」ことを保証しない場合、キャッシュキーの不一致につながります。つまり、異なるコンテンツが同じキャッシュにヒットしたり (音声と映像のズレとして現れる)、同じアドレスが毎回異なるハッシュを返し、キャッシュにヒットしなくなったりします。

解決策

  1. コールバックは、同じ再生アドレスに対しては常に同じハッシュを安定して返し、異なるメディアに対しては異なるハッシュを返す必要があります。

  2. たとえば、ヒット率を向上させるために認証パラメーターを削除する場合、再生アドレス (m3u8/mp4) から認証パラメーターを削除した後にのみハッシュを計算します。暗号化された m3u8 の keyURL は認証する必要はありません。そうしないと、異なるビデオのキーが同じキャッシュにヒットして再生が失敗します。これはコールバック内でドメイン名によって異なる処理ができます。

  3. 同じファイルに HTTP と HTTPS の両方のアドレスがある場合は、プロトコルを統一するか、プロトコルヘッダーを削除した後にハッシュを計算できます。

詳細については、「高度な機能」をご参照ください。

Alibaba Cloud プライベート暗号化ビデオの再生時に認証が失敗する

問題の現象:Alibaba Cloud ビデオ暗号化 (プライベート暗号化) によって暗号化されたビデオを再生すると、認証が失敗するか、再生できません。

問題の原因:Alibaba Cloud ビデオ暗号化 (プライベート暗号化) は、プレーヤーとサーバー間の相互作用によって復号され、再生は vid 再生を介して開始する必要があります。オンデマンドの AVPUrlSource を使用して再生アドレスを直接渡して再生する場合 (一般的なプライベート暗号化)、認証と復号が完了できず、失敗します。

解決策

  1. プライベート暗号化ビデオは、iOS ではオンデマンドの AVPVidAuthSource(VidAuth) または AVPVidStsSource(VidSts) を介して再生されます。出力ストリームに非プライベート暗号化ストリームが混在している場合は、暗号化タイプを AliyunVoDEncryption に設定してプライベート暗号化ストリームをフィルタリングできます。

  2. 注:「ライセンスプライベート暗号化」のみがオンデマンドの AVPUrlSource 再生をサポートします (MP4 は URL の末尾に etavirp_nuyila=1 を連結する必要があり、HLS は対応するサポートバージョンで元の URL を直接使用できます)。通常のプライベート暗号化は適用されません。

詳細については、「暗号化されたビデオの再生」をご参照ください。