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

ApsaraVideo VOD:高度な機能

最終更新日:Jan 24, 2026

このトピックでは、ApsaraVideo Player SDK for iOS の高度な機能の使用方法の例を説明します。すべての機能に関する完全なガイドについては、「API リファレンス」をご参照ください。

重要

デモを実行するには、デモをダウンロードし、「デモの実行」の指示に従ってプロジェクトをコンパイルして実行してください。

専門的能力の検証

説明

ApsaraVideo Player の一部の機能には、Professional Edition ライセンスが必要です。詳細については、「ApsaraVideo Player SDK の機能」をご参照ください。これらの機能を使用するには、「ApsaraVideo Player SDK のライセンスを取得する」の説明に従ってライセンスを取得する必要があります。

アプリケーションの起動時、またはプレーヤーの API 操作を呼び出す前にリスナーを設定できます。

void premiumVeryfyCallback(AVPPremiumBizType biztype, bool isValid, NSString* errorMsg) {
    NSLog(@"onPremiumLicenseVerifyCallback: %d, isValid: %d, errorMsg: %@", biztype, isValid, errorMsg);
}

[AliPrivateService setOnPremiumLicenseVerifyCallback:premiumVeryfyCallback];

AVPPremiumBizType は Professional Edition 機能の列挙です。関連機能が使用されると、プレーヤーはその機能のライセンスを検証し、このコールバックを通じて結果を返します。isValid が `false` の場合、errorMsg には失敗の理由が含まれます。

再生

リスト再生

ApsaraVideo Player SDK for iOS は、リスト再生シナリオ向けに包括的なリスト再生機能を提供します。これらの機能は、プリロードなどのメカニズムと組み合わせることで、短編動画の初回フレームの読み込み速度を大幅に向上させます。

操作手順

  1. プレーヤーの作成

    `AliListPlayer` インスタンスを作成します。以下のコードは一例です。

    self.listPlayer = [[AliListPlayer alloc] init];
    [self.listPlayer setTraceID:@"xxxxxx"];  // TraceID は、IMEI や IDFA などのデバイスまたはユーザーの一意の識別子です。

  2. 任意: リスナーの設定

    リストプレーヤーを作成する際にリスナーを設定する必要はありません。ただし、リスナーを設定しない場合、再生失敗や再生進捗などのプレーヤーからのイベント通知を受け取ることができません。リスナーを設定することを推奨します。

    プレーヤーには複数のリスナーを設定できます。onPlayerEventonError のリスナーを設定することを推奨します。

    /**
     @brief エラーコールバック。
     @param player プレーヤーポインター。
     @param errorModel エラーの説明。詳細については、AliVcPlayerErrorModel をご参照ください。
     */
    - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
        // エラーを報告し、再生を停止します。
    }
    /**
     @brief プレーヤーイベントコールバック。
     @param player プレーヤーポインター。
     @param eventType プレーヤーイベントタイプ。@see AVPEventType
     */
    -(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
        switch (eventType) {
            case AVPEventPrepareDone: {
                // 準備完了。
            }
                break;
            case AVPEventAutoPlayStart:
                // 自動再生開始。
                break;
            case AVPEventFirstRenderedStart:
                // 最初のフレームがレンダリングされました。
                break;
            case AVPEventCompletion:
                // 再生完了。
                break;
            case AVPEventLoadingStart:
                // バッファリング開始。
                break;
            case AVPEventLoadingEnd:
                // バッファリング完了。
                break;
            case AVPEventSeekEnd:
                // シーク完了。
                break;
            case AVPEventLoopingStart:
                // ループ再生開始。
                break;
            default:
                break;
        }
    }
    /**
     @brief 現在の再生位置のコールバック。
     @param player プレーヤーポインター。
     @param position 動画の現在の再生位置。
     */
    - (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // プログレスバーを更新します。
    }
    /**
     @brief バッファリングされた位置のコールバック。
     @param player プレーヤーポインター。
     @param position 動画の現在のバッファリングされた位置。
     */
    - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // バッファリングの進捗を更新します。
    }
    /**
     @brief トラック情報のコールバック。
     @param player プレーヤーポインター。
     @param info トラック情報の配列。詳細については、AVPTrackInfo をご参照ください。
     */
    - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // マルチビットレート情報を取得します。
    }
    /**
     @brief 字幕表示のコールバック。
     @param player プレーヤーポインター。
     @param trackIndex 字幕トラックのインデックス。
     @param subtitleID 字幕 ID。
     @param subtitle 字幕として表示する文字列。
     */
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
        // 字幕表示のコールバック。
    }
    /**
     @brief 字幕非表示のコールバック。
     @param player プレーヤーポインター。
     @param trackIndex 字幕トラックのインデックス。
     @param subtitleID 字幕 ID。
     */
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID {
        // 字幕非表示のコールバック。
    }
    /**
     @brief スナップショットのコールバック。
     @param player プレーヤーポインター。
     @param image イメージ。
     */
    - (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
        // スナップショットをプレビューして保存します。
    }
    /**
     @brief トラック切り替え完了のコールバック。
     @param player プレーヤーポインター。
     @param info 切り替え後の情報。詳細については、AVPTrackInfo をご参照ください。
     */
    - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
        // ビットレート切り替え結果の通知。
    }
    //...
  3. プリロード数を設定できます。

    プリロードする動画の数を指定できます。これにより、初回フレームの読み込み速度が向上します。以下のコードは一例です。

    self.listPlayer.preloadCount = 2;
  4. 複数の動画ソースを追加または削除します。

    リスト再生は、`VidSts` と `UrlSource` の 2 種類の動画ソースをサポートしています。`UrlSource` は動画の再生 URL です。`VidSts` は ApsaraVideo VOD のオーディオまたはビデオファイルの ID です。以下のコードは一例です。

    • UrlSource: 再生 URL は、サードパーティの VOD URL または ApsaraVideo VOD の再生 URL にすることができます。

      `GetPlayInfo` 操作を呼び出して、Alibaba Cloud の再生 URL を取得できます。URL 署名の複雑さを回避するために、ApsaraVideo VOD サーバーサイド SDK を統合して再生 URL を取得することを推奨します。API 操作を呼び出して再生 URL を取得する方法の詳細については、開発者ポータルをご参照ください。

    • VidSts: オーディオまたはビデオ ID。ID は、ApsaraVideo VOD コンソールの [メディアライブラリ] > [オーディオ/ビデオ] から、またはオーディオ/ビデオファイルがアップロードされた後にサーバーサイド API 操作 (SearchMedia) を呼び出すことで取得できます。

    // VID ベースの動画ソースを追加します。
    [self.listPlayer addVidSource:videoId uid:UUIDString];
    // URL ベースの動画ソースを追加します。
    [self.listPlayer addUrlSource:URL uid:UUIDString];
    // ソースを削除します。
    [self.listPlayer removeSource:UUIDString];
    説明
    • `uid` は動画の一意の識別子であり、異なる動画を区別するために使用されます。動画が同じ `uid` を持つ場合、それらは同じ動画と見なされます。再生中にストリームが混在する問題が発生した場合は、異なる動画に一意の `uid` 値が使用されていることを確認してください。`uid` は任意の文字列にすることができます。

  5. 表示ビューを設定します。

    動画ソースにビデオトラックが含まれている場合は、動画を表示するためにプレーヤーにビューを設定する必要があります。以下のコードは一例です。

    self.listPlayer.playerView = self.simplePlayScrollView.playView;
  6. 動画ソースを再生します。

    1 つ以上の動画ソースを追加した後、moveTo を呼び出して動画ソースを再生できます。以下のコードは一例です。

    // UrlSource 再生にはこの API 操作を使用します。
    - (BOOL) moveTo:(NSString*)uid;
    // VidSts 再生にはこの API 操作を使用します。一時的な STS 認証情報と AccessKey ペアを渡す必要があります。事前に取得してください。詳細については、「RAM ロールを作成し、STS トークンに一時的なアクセス権限を付与する」をご参照ください。
    - (BOOL) moveTo:(NSString*)uid accId:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
  7. 前または次の動画を再生します。

    moveTo を呼び出して動画ソースを再生した後、moveToPrev および moveToNext API 操作を呼び出して、前または次の動画を再生できます。moveTo 呼び出しで指定された動画ソースが参照点として機能します。以下のコードは一例です。

    説明

    同じ view を使用し、movetomoveToNext などの操作を呼び出して動画ソースを切り替えると、黒い画面がちらつくことがあります。この問題を解決するには、listPlayer を初期化する際に PlayerConfigclearShowWhenStop フィールドを false に設定し、その後 setConfig を呼び出して設定を適用します。

    UrlSource 再生ソース

    // 次の動画に移動します。
    - (BOOL) moveToNext;
    // 前の動画に移動します。
    - (BOOL) moveToPre;

    VidSts 再生ソース

    // 次の動画に移動します。
    - (BOOL) moveToNext:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
    // 前の動画に移動します。
    - (BOOL) moveToPre:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
説明

より良いリスト再生体験のために、当社の短編動画ドラマソリューションを使用することを推奨します。詳細については、「短編動画ドラマのクライアントサイド開発」をご参照ください。

透明度のある動画の再生

機能説明

ApsaraVideo Player SDK は、アルファチャンネルのレンダリングをサポートし、バーチャルギフトなどの透明なオーバーレイの動的効果を作成します。ライブチャンネルなどのシナリオでは、ライブチャンネルのコンテンツをブロックすることなく、透明なオーバーレイの動的効果を再生できます。これにより、ユーザーの視聴体験とインタラクション体験が大幅に向上します。

制限事項

透明レンダリング機能は、All-in-One SDK V6.8.0 以降または ApsaraVideo Player SDK V6.9.0 以降でサポートされています。

利点

バーチャルギフトなどの効果に透明度情報を持つ MP4 動画を使用すると、アニメーション品質の向上、ファイルサイズの縮小、互換性の向上、開発効率の向上など、いくつかの利点があります。これらの利点は、より良いユーザー体験に貢献します。

  1. より良いアニメーション品質: MP4 動画は、詳細や色を含む元のアニメーション品質を保持できます。APNG や IXD などの他のフォーマットと比較して、MP4 はデザイナーの元のアニメーション効果をより正確に復元できます。

  2. より小さいファイルサイズ: MP4 動画ファイルは、APNG や IXD などの他のフォーマットよりも効果的に圧縮できます。これにより、読み込み速度が向上し、ネットワーク帯域幅の消費が削減されます。

  3. より高い互換性: MP4 は、さまざまなデバイスやブラウザで広くサポートされているユニバーサルな動画フォーマットです。これにより、ギフト効果をほとんどの主流デバイスで再生および表示できます。

  4. より高い開発効率: 効果に MP4 動画を使用することは、比較的単純な技術的ソリューションです。開発者は、複雑な解析およびレンダリングロジックを研究および実装する必要がありません。これにより、開発者は他の機能に集中し、開発効率を向上させることができます。

コード例

アルファモードを設定するための新しい API 操作が利用可能です。これにより、動画素材内のアルファチャンネルの位置 (上、下、左、または右) を指定します。デフォルト値は `None` です。

説明
  • 素材内のアルファチャンネルの位置は、`setAlphaRenderMode` パラメータの設定と一致する必要があります。

  • プレーヤービューのサイズは、素材の解像度に比例する必要があります。

/**
 @brief アルファレンダリングモード。右、左、上、下のアルファをサポートします。デフォルト値は none です。
 @see AVPAlphaRenderMode
 */
@property(nonatomic) AVPAlphaRenderMode alphaRenderMode;
//--------------ビューの使用法-------------
// View の場合、clearColor を設定する必要があります。
@property (weak, nonatomic) IBOutlet UIView *mediaPlayerView;
[self.aliplayerview setBackgroundColor:UIColor.clearColor];

//-----------AliPlayer の使用法-----------
// アルファモードを設定します。
[self.player setAlphaRenderMode:AVP_RENDERMODE_ALPHA_AT_LEFT];
// アルファモードに対応する素材を設定します。
AVPUrlSource *source = [[AVPUrlSource alloc] urlWithString:@"https://alivc-player.oss-cn-shanghai.aliyuncs.com/video/%E4%B8%9A%E5%8A%A1%E9%9C%80%E6%B1%82%E6%A0%B7%E6%9C%AC/alpha%E9%80%9A%E9%81%93/alpha_left.mp4"];
[self.player setUrlSource:source];

// 任意: 単一インスタンスの再生が完了した後に接続の問題がある場合は、画面をクリアできます。
#pragma mark -- AVPDelegate
- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventCompletion:
        {
            [player clearScreen];
        }
            break;
        //...
    }
}

[self.player setAutoPlay: YES];
[self.player prepare];

Metal レンダリング

ApsaraVideo Player SDK for iOS は、Metal フレームワークを使用した動画レンダリングをサポートしています。

説明

現在、背景色、スケーリングモード、ピクチャーインピクチャー (PiP) 機能のみがサポートされています。

構成項目

/**
 @brief 動画レンダリングタイプ。0 はデフォルトのレンダラーを示します。1 は混合レンダラーを示します。デフォルト値: 0。
 */
@property(nonatomic, assign) int videoRenderType;

使用例

AVPConfig *config = [self.player getConfig];
// Metal レンダリングメソッドを使用します。
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];

外部字幕

説明

詳細なコード例については、API-ExampleExternal Subtitle Demo and Switching (ExternalSubtitle) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C サンプルプロジェクトであり、コア SDK 機能を迅速に統合する方法を示しています。

ApsaraVideo Player SDK for iOS は、外部字幕の追加と切り替えをサポートしています。SDK は SRT、SSA、ASS、VTT の字幕フォーマットをサポートしています。

以下のコードは一例です。

  1. 字幕を表示するためのビューを作成します。

    異なる字幕フォーマットに対して異なるビューを作成できます。

    // カスタム subTitleLabel を初期化します。
    UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame];
    // カスタム superView に字幕を追加します。superView はカスタムインターフェイスに存在する親ビューです。
    [superView addSubview:subTitleLabel];
  2. 字幕関連のリスナーを設定します。

    // 外部字幕が追加されました。
    - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {}
    // 字幕ヘッダー情報のコールバック。
    - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{}
    // 字幕表示のコールバック。
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
     subTitleLabel.text =subtitle;
     subTitleLabel.tag =subtitleID;
    }
    // 字幕非表示のコールバック。
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{
      [subTitleLabel removeFromSuperview];
    }
  3. 字幕を追加します。

    [self.player addExtSubtitle:URL];
  4. 字幕を切り替えます。

    [self.player selectExtSubtitle:trackIndexenable:YES];

音声のみの再生

動画再生を無効にして、音声のみの再生を実現できます。プレーヤーを準備する前に `PlayerConfig` を設定する必要があります。

AVPConfig *config = [self.player getConfig];
config.disableVideo = YES;
[self.player setConfig:config];

ソフトウェアデコードとハードウェアデコードの切り替え

ApsaraVideo Player SDK for iOS は、H.264 と H.265 のハードウェアデコードを提供します。この機能は enableHardwareDecoder スイッチによって制御され、デフォルトで有効になっています。ハードウェアデコードの初期化に失敗した場合、プレーヤーは自動的にソフトウェアデコードに切り替わり、通常の動画再生を保証します。以下のコードは一例です。

// ハードウェアデコードを有効にします。これはデフォルトで有効です。
self.player.enableHardwareDecoder = YES;

プレーヤーがハードウェアデコードからソフトウェアデコードに自動的に切り替わった場合、onPlayerEvent コールバックが呼び出されます。以下のコードは一例です。

-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
    if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
        // ソフトウェアデコードに切り替わりました。
    }
}

H.265 のアダプティブ再生

現在のデバイスモデルがクラウドベースの H.265 ブラックリストにある場合、または H.265 ストリームのハードウェアデコードに失敗した場合、アダプティブフォールバックがトリガーされます。フォールバック中に H.264 バックアップストリームが利用可能な場合は、自動的に再生されます。それ以外の場合、プレーヤーは H.265 ソフトウェアデコードにフォールバックします。

説明
  • この機能は、クラウドとクライアントを組み合わせたアダプティブデコードの付加価値サービスを有効にした後にのみ有効になります。ライセンスを申請するために Yida フォームを提出する必要があります。

  • クラウドとクライアントを組み合わせたアダプティブデコードの付加価値サービスには、主に次のものが含まれます。1. クラウドベースのハードウェアデコード互換性データの動的配信。2. H.265 ストリームから H.264 ストリームへのアダプティブフォールバック。

  • SDK は、付加価値サービスが有効になっていなくても、ハードウェアデコードが失敗した場合に自動的にソフトウェアデコードに切り替えることができます。

以下のコードは、バックアップストリームを設定する方法を示しています。

// アプリケーション層は、元の URL とバックアップ URL のすべてのキーと値のペアを格納するマップを維持します。切り替え時に、元の URL に基づいてマップ内のバックアップ URL をクエリします。
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
    NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
    NSString *backupUrl = globalMap[oriurl];
    return backupUrl; 
}

[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];

ネットワーク状況に応じた動画解像度のアダプティブ切り替え

説明
  • ApsaraVideo VOD のビデオパッケージングトランスコーディングテンプレートグループを使用してトランスコードすることにより、HLS マルチビットレートアダプティブビデオストリームを生成できます。詳細については、「ApsaraVideo VOD のアダプティブビットレートストリーミングを設定する」をご参照ください。

  • ApsaraVideo VOD によってトランスコードされたアダプティブストリームを Vid メソッドで再生する場合、アダプティブビデオストリームを取得して再生するには、デフォルトの再生解像度リストを AUTO に設定する必要があります。そうしないと、プレーヤーはデフォルトのロジックに基づいて低解像度のビデオストリームを選択して再生します。解像度のデフォルトの再生順序の詳細については、「動画が複数の解像度にトランスコードされた場合、プレーヤー SDK はデフォルトでどの解像度を再生しますか?」をご参照ください。以下のコードは、VidAuth 再生の解像度リストを指定する方法を示しています。

    AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
    authSource.definitions = @"AUTO";

ApsaraVideo Player SDK for iOS は、マルチビットレートアダプティブ HLS および DASH ビデオストリームをサポートしています。prepare が成功した後、getMediaInfo を呼び出して各ビットレートストリームの情報 (つまり TrackInfo) を取得できます。以下のコードは一例です。

AVPMediaInfo *info = [self.player getMediaInfo];
NSArray<AVPTrackInfo*>* tracks = info.tracks;

再生中に、プレーヤーの selectTrack メソッドを呼び出して再生ビットレートストリームを切り替えることができます。値が SELECT_AVPTRACK_TYPE_VIDEO_AUTO の場合、ストリームはマルチビットレートアダプティブになります。以下のコードは一例です。

// ビットレートを切り替えます。
[self.player selectTrack:track.trackIndex];
// アダプティブビットレートストリーミングを有効にします。
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];

切り替えの結果は、onTrackChanged リスナーコールバックで返されます。以下のコードは一例です。

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
    if (info.trackType == AVPTRACK_TYPE_VIDEO) {
        // 動画が変更されました。
    }
    // など
}

任意: プレーヤーの selectTrack メソッドを呼び出して再生ビットレートストリームを ABR に切り替える前に、config を通じて ABR 切り替えの解像度の上限を設定できます。これにより、プレーヤーが予期しないビットレートに自動的に切り替わるのを防ぎます。プレーヤーが prepare メソッドを呼び出す前、またはリストプレーヤーが moveTo メソッドを呼び出す前に、以下のコードを呼び出して有効にすることを推奨します。以下のコードは一例です。

AVPConfig *config = [self.player getConfig];
config.maxAllowedAbrVideoPixelNumber = 921600;// ABR 解像度の最大ピクセル数を 921600 (幅 × 高さ = 1280 × 720) に設定し、ABR が切り替え可能な解像度のピクセル数がこの値以下になるようにします。
[self.player setConfig:config];

スナップショットの取得

ApsaraVideo Player SDK for iOS は、現在の動画のスナップショットを取得する機能を提供します。この機能は snapShot API 操作によって実装されます。この操作は生の動画データをキャプチャし、それを bitmap に変換して結果を返します。コールバックインターフェイスは onCaptureScreen です。以下のコードは一例です。

// スナップショットコールバック。
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // スナップショットを処理します。
}
// 現在の再生画面のスナップショットを取得します。
[self.player snapShot];
説明

スナップショットにはインターフェイスは含まれません。

プレビュー

ApsaraVideo Player SDK for iOS は、ApsaraVideo VOD の構成と併用することでプレビュー機能を実現できます。VidSts と VidAuth (ApsaraVideo VOD に推奨) の両方の再生方法をサポートしています。プレビュー機能の設定と使用方法の詳細については、「動画のプレビュー」をご参照ください。

プレビュー機能を設定した後、VidPlayerConfigGen インターフェイスの setPreviewTime メソッドを使用して、プレーヤーのプレビュー時間を設定できます。以下のコードは、VidSts 再生の例を示しています。

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20];// 20 秒のプレビュー。
source.playConfig = [vp generatePlayerConfig];// 再生ソースに設定します。
...

プレビュー時間を設定して ApsaraVideo Player SDK for iOS で動画を再生すると、サーバーは完全な動画コンテンツを返さず、代わりにプレビュー期間のコンテンツを返します。

説明

`VidPlayerConfigGen` は、サーバーがサポートするリクエストパラメーターの設定をサポートしています。詳細については、「リクエストパラメーター」をご参照ください。

Referer の設定

ApsaraVideo Player SDK for iOS では、Referer を設定できます。コンソールの Referer ブラックリストおよびホワイトリストと連携して、アクセス権限を制御できます。AVPConfig メソッドを使用して、リクエスト Referer を設定できます。以下のコードは、ApsaraVideo Player SDK for iOS の例を示しています。

// まず、構成を取得します。
AVPConfig *config = [self.player getConfig];
// Referer を設定します。
config.referer = referer;
....// その他の設定。
// プレーヤーの構成を設定します。
[self.player setConfig:config];

User-Agent の設定

ApsaraVideo Player SDK for iOS は、AVPConfig を提供して、リクエストの User-Agent (UA) を設定します。UA を設定すると、プレーヤーのリクエストに UA 情報が含まれます。以下のコードは一例です。

// まず、構成を取得します。
AVPConfig *config = [self.player getConfig];
// User-Agent を設定します。
config.userAgent = userAgent;
....// その他の設定。
// プレーヤーの構成を設定します。
[self.player setConfig:config];

ネットワークリトライ時間と回数の設定

ApsaraVideo Player SDK for iOS のネットワークタイムアウトとリトライ回数は、AVPConfig メソッドを使用して設定できます。以下のコードは一例です。

// まず、構成を取得します。
AVPConfig *config = [self.player getConfig];
// ネットワークタイムアウトをミリ秒単位で設定します。
config.networkTimeout = 5000;
// タイムアウト時のリトライ試行回数を設定します。各リトライの間隔は networkTimeout です。networkRetryCount=0 はリトライなしを意味し、リトライポリシーはアプリによって決定されます。デフォルト値は 2 です。
config.networkRetryCount = 2;
....// その他の設定。
// プレーヤーの構成を設定します。
[self.player setConfig:config];
説明
  • `networkRetryCount` を設定すると、ネットワークの問題で読み込み状態になった場合に、プレーヤーは指定された回数リトライします。リトライの間隔は `networkTimeout` によって決まります。

  • 複数回のリトライ後も読み込み状態が続く場合、onError イベントが呼び出されます。この場合、`AVPErrorModel.code` は `ERROR_LOADING_TIMEOUT` になります。

  • `networkRetryCount` が 0 に設定されている場合、ネットワークリトライがタイムアウトすると、プレーヤーは `eventWithString` パラメータを `EVENT_PLAYER_NETWORK_RETRY` に設定して `onPlayerEvent` を呼び出します。この時点で、プレーヤーの reload メソッドを呼び出してネットワークを再読み込みするか、他のアクションを実行できます。

キャッシュと遅延制御の設定

キャッシュ制御は、プレーヤーのパフォーマンスにとって重要です。適切な構成により、初回フレームの読み込みを高速化し、カクつきを減らすことができます。ApsaraVideo Player SDK for iOS は、AVPConfig を通じてキャッシュと遅延制御を設定するためのインターフェイスを提供します。以下のコードは一例です。

// まず、構成を取得します。
AVPConfig *config = [self.player getConfig];
// 最大遅延時間。注意: これはライブストリーミングで有効です。遅延が大きい場合、プレーヤー SDK はフレーム同期を実行して、遅延がこの範囲内に収まるようにします。
config.maxDelayTime = 5000;
// 最大バッファ時間 (ミリ秒)。プレーヤーは毎回最大でこの時間のバッファデータを読み込みます。
config.maxBufferDuration = 50000;
// 高バッファ時間 (ミリ秒)。ネットワーク状況が悪いためにデータが読み込まれている場合、読み込まれたバッファ時間がこの値に達すると、読み込み状態が終了します。
config.highBufferDuration = 3000;
// 開始バッファ時間 (ミリ秒)。この時間を短く設定するほど、初回フレームの読み込みが速くなります。また、再生開始直後にプレーヤーが読み込み状態になる原因にもなります。
config.startBufferDuration = 500;
// その他の設定。
// プレーヤーの構成を設定します。
[self.player setConfig:config];
重要
  • 3 つのバッファ時間の関係は、`startBufferDuration` ≤ `highBufferDuration` ≤ `maxBufferDuration` でなければなりません。

  • 最大バッファ時間 (`mMaxBufferDuration`) が 5 分を超える場合、システムはデフォルトで 5 分に設定し、過度に大きなバッファによるメモリエラーを防ぎます。

HTTP ヘッダーの設定

AVPConfig メソッドを使用して、プレーヤーのリクエストに HTTP ヘッダーパラメータを追加できます。以下のコードは一例です。

// まず、構成を取得します。
AVPConfig *config = [self.player getConfig];
// ヘッダーを定義します。
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// たとえば、HTTPDNS を使用する場合、Host を設定する必要があります。
[httpHeaders addObject:@"Host:example.com"];
// ヘッダーを設定します。
config.httpHeaders = httpHeaders;
....// その他の設定。
// プレーヤーの構成を設定します。
[self.player setConfig:config];

ピクチャーインピクチャー (PiP)

説明

詳細なコード例については、API-ExamplePicture-in-Picture (PictureInPicture) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C サンプルプロジェクトであり、コア SDK 機能を迅速に統合する方法を示しています。

説明
  • PiP 機能には、iOS 15 以降と ApsaraVideo Player SDK for iOS V5.4.9.0 以降が必要です。

  • ApsaraVideo Player SDK for iOS の 5.5.2.0 より前のバージョンでは、PiP を有効または無効にするメソッドと、アプリがバックグラウンドにあるときに PiP ウィンドウを表示するメソッドのみが提供されていました。バージョン 5.5.2.0 以降、SDK は外部から PiP デリゲートを設定することをサポートし、よりパーソナライズされた PiP 機能の開発が可能になりました。

  • PiP 機能を有効にするには、スマートフォンの設定 ([設定] > [一般] > [ピクチャ・イン・ピクチャ]) で PiP 機能が有効になっていることを確認してください。

PiP の有効化

PiP 機能を有効にすると、アプリケーションがバックグラウンドに移動したときに、動画は小さな PiP ウィンドウで再生を続けます。アプリケーションがフォアグラウンドに戻ると、動画は元の再生形式に戻ります。PiP 機能は setPictureInPictureEnable スイッチによって制御されます。PiP 機能を有効にするには、AVPEventPrepareDone 状態で有効にする必要があります。以下のコードは、PiP 機能を有効にする方法の例を示しています。

- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventPrepareDone:
        {
            [self.player setPictureInPictureEnable:YES];
        }
            break;
        default:
            break;
    }
}
説明

プレーヤーが stop を呼び出して再生を停止すると、PiP ウィンドウは不要になります。まず setPictureInPictureEnable スイッチを使用して PiP を無効にし、次に stop を呼び出す必要があります。

PiP デリゲートの設定

次のセクションでは、ピクチャーインピクチャー (PiP) ウィンドウとプレーヤーウィンドウ間の相互作用に関する一般的なコード例を示します。これらの例には、PiP ウィンドウでの一時停止、再生、早送り、早戻しの各ボタン、および再度の再生のためのロジックが含まれます。デリゲートメソッドの詳細については、「プレーヤー SDK デモ」の SDK フォルダにある `AliyunPlayer.framework` 内の AliPlayerPictureInPictureDelegate.h ヘッダーファイルの内容をご参照ください。

  1. PiP デリゲートを設定します。

    /**
    * @brief PiP デリゲートを設定します。
    */
    -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate;
    
    
    // PiP デリゲートを設定します。
    [self.player setPictureinPictureDelegate:self];
  2. 変数を追加し、デリゲートインターフェイスを実装します。

    1. プレーヤーの状態変化を制御するためのグローバル変数を追加します。

      #import "YourUIViewController.h"
      #import <AliyunPlayer/AliyunPlayer.h>
      
      @interface YourUIViewController () <AVPDelegate, AliPlayerPictureInPictureDelegate>
      // プレーヤーインスタンス。
      @property (nonatomic, strong) AliPlayer *player;
      // プレーヤービューコンテナー。
      @property (nonatomic, strong) UIView *playerView;
      // PiP が現在一時停止しているかどうかをリッスンします。
      @property (nonatomic, assign) BOOL isPipPaused;
      // プレーヤーの現在の再生ステータスをリッスンし、再生イベントステータス変更リスナーの newStatus コールバックを通じて設定します。
      @property (nonatomic, assign) AVPStatus currentPlayerStatus;
      // PiP コントローラーを設定します。PiP が開始される前に呼び出されるコールバックメソッドで設定します。ページが破棄される直前にアクティブに nil に設定する必要があります。これを設定することを推奨します。
      @property (nonatomic, weak) AVPictureInPictureController *pipController;
      // プレーヤーの現在の再生進捗をリッスンします。currentPosition を現在のビデオ再生位置のコールバックの position パラメータの値に設定します。
      @property (nonatomic, assign) int64_t currentPosition;
      
      @end
      説明

      `pipController` は `weak` または `assign` で修飾する必要があります。`assign` を使用する場合は、変数がいつ null に設定されるかに注意してください。

    2. 再生イベントステータス変更コールバックインターフェイスをリッスンする場合、PiP コントローラーの関連ステータスを更新するために、以下のメソッドをアクティブに呼び出す必要があります。

      - (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
          self.currentPlayerStatus = newStatus;
      
        if (_pipController) {
           [self.pipController invalidatePlaybackState];
         }
      }
    3. 再生イベントコールバックインターフェイスをリッスンする場合、PiP コントローラーの関連ステータスを更新するために、以下のメソッドをアクティブに呼び出す必要があります。

      - (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
          if (eventType == AVPEventCompletion) {
            if (_pipController) {
             self.isPipPaused = YES; // 再生終了後、PiP ステータスを一時停止に変更します。
             [self.pipController invalidatePlaybackState];
          }
        } else if (eventType == AVPEventSeekEnd) {
          // シークが完了しました。
            if (_pipController) {
             [self.pipController invalidatePlaybackState];
          }
        }
      }
    4. リスナーを設定します。

      • PiP が開始される前に呼び出されるコールバックをリッスンします。

        /**
         @brief PiP がまもなく開始されます。
         @param pictureInPictureController PiP コントローラー。
         */
        - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            if (!_pipController) {
             self.pipController = pictureInPictureController;
          }
            self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted);
          [pictureInPictureController invalidatePlaybackState];
        }
      • PiP が停止する前に呼び出されるコールバックをリッスンします。

        /**
         @brief PiP がまもなく停止されます。
         @param pictureInPictureController PiP コントローラー。
         */
        - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            self.isPipPaused = NO;
          [pictureInPictureController invalidatePlaybackState];
        }
      • PiP が停止する前にユーザーインターフェイスを復元するために呼び出されるコールバックをリッスンします。

        /**
         @brief PiP が停止する前にユーザーインターフェイスを復元するようにデリゲートに指示します。
         @param pictureInPictureController PiP コントローラー。
         @param completionHandler YES を渡して呼び出すと、システムがプレーヤーのユーザーインターフェイスの復元を完了させることができます。
         */
        - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler {
            if (_pipController) {
              _pipController = nil;
          }
          completionHandler(YES);
        }
      • PiP モードで再生可能な時間範囲を設定するコールバックをリッスンします。

        /**
         @brief 現在の再生可能な時間範囲を PiP コントローラーに通知します。
         @param pictureInPictureController PiP コントローラー。
         @return 現在の再生可能な時間範囲。
         */
         - (CMTimeRange)pictureInPictureControllerTimeRangeForPlayback:(nonnull AVPictureInPictureController *)pictureInPictureController layerTime:(CMTime)layerTime{
            Float64 current64 = CMTimeGetSeconds(layerTime);
        
            Float64 start;
            Float64 end;
        
            if (currentPosition <= self.player.duration) {
                double curPostion = self.currentPosition / 1000.0;
                double duration = self.player.duration / 1000.0;
                double interval = duration - curPostion;
                start = current64 - curPostion;
                end = current64 + interval;
                CMTime t1 = CMTimeMakeWithSeconds(start, layerTime.timescale);
                CMTime t2 = CMTimeMakeWithSeconds(end, layerTime.timescale);
                return CMTimeRangeFromTimeToTime(t1, t2);
            } else {
                return CMTimeRangeMake(kCMTimeNegativeInfinity, kCMTimePositiveInfinity);
            }
        }
      • PiP モードで動画が一時停止しているかどうかを示すコールバックをリッスンします。

        /**
         @brief UI 上で一時停止または再生状態を反映します。
         @param pictureInPictureController PiP コントローラー。
         @return 一時停止または再生中。
         */
        - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{
            return self.isPipPaused;
        }
        説明

        このコールバックは PiP が開始される前にトリガーされます。この時点でこのコールバックの戻り値が `false` であることを確認してください。そうしないと、PiP をアクティブ化できません。

      • ユーザーが PiP モードで早送りまたは巻き戻しボタンをタップしたときに呼び出されるコールバックをリッスンし、プレーヤーのステータスを同期します。

        /**
         @brief ユーザーが早送りまたは巻き戻しボタンをタップします。
         @param pictureInPictureController PiP コントローラー。
         @param skipInterval 早送りまたは巻き戻しの時間間隔。
         @param completionHandler シーク操作が完了したことを示すために呼び出す必要があるクロージャ。
         */
         - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController skipByInterval:(CMTime)skipInterval completionHandler:(nonnull void (^)(void))completionHandler {
            int64_t skipTime = skipInterval.value / skipInterval.timescale;
            int64_t skipPosition = self.currentPosition + skipTime * 1000;
            if (skipPosition < 0) {
                skipPosition = 0;
            } else if (skipPosition > self.player.duration) {
                skipPosition = self.player.duration;
            }
            [self.player seekToTime:skipPosition seekMode:AVP_SEEKMODE_INACCURATE];
            [pictureInPictureController invalidatePlaybackState];
        }
      • ユーザーが PiP モードで一時停止または再生ボタンをタップしたときに呼び出されるコールバックをリッスンします。

        /**
         @brief ユーザーが PiP モードで一時停止ボタンをタップします。
         @param pictureInPictureController PiP コントローラー。
         @param playing 動画が再生中かどうか。
         */
        - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing {
            if (!playing){
              [self.player pause];
              self.isPipPaused = YES;
            } else {
              // 推奨: PiP 再生が完了し、リプレイが必要な場合は、以下の if 文のコードをさらに実行できます。
              if (self.currentPlayerStatus == AVPStatusCompletion) {
                 [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE];
              }
        
              [self.player start];
              self.isPipPaused = NO;
          }
          [pictureInPictureController invalidatePlaybackState];
        }

アプリ内ピクチャーインピクチャー

PiP 機能を使用する場合、デフォルトではアプリ外 PiP になります。アプリ内 PiP を実装するには、まず以下の API 操作を使用して PiP 機能が有効になっているかどうかを判断できます。

/**
 @brief PiP が有効になっているかどうかを示します。
 @param pictureInPictureController PiP コントローラー。
 @param isEnable PiP が有効かどうか。
 */
- (void)pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *)pictureInPictureController isEnable:(BOOL)isEnable;

PiP 機能が有効になっている場合、PiP の自動開始を無効にし、機能のアクティベーションを手動で制御できます。以下のコードは一例です。

- (void) pictureInPictureControllerIsPictureInPictureEnable:(nullable AVPictureInPictureController *) pictureInPictureController isEnable:(BOOL) isEnable
{
    if (isEnable && pictureInPictureController) {
        _pipController = pictureInPictureController;
        // PiP の自動開始を閉じます。
        if (@available(iOS 15.0, *)) {
            _pipController.canStartPictureInPictureAutomaticallyFromInline = false;
        }
    } else {
        _pipController = NULL;
    }
}

- (void) switchPip:(bool) enable {
    if (_pipController == nil) {
        return;
    }
    if (enable) {
        // PiP を開始します。
        [_pipController startPictureInPicture];
    } else {
        // PiP を閉じます。
        [_pipController stopPictureInPicture];
    }
}

RTS ライブストリーミングのフォールバック

説明

詳細なコード例については、API-ExampleRTS Live Stream (RtsLiveStream) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C サンプルプロジェクトであり、コア SDK 機能を迅速に統合する方法を示しています。

詳細については、「RTS ライブストリーミング」をご参照ください。

左右のサウンドチャンネルの切り替え

ApsaraVideo Player SDK for iOS は、outputAudioChannel プロパティを使用して出力オーディオチャンネルを設定します。入力ソースがデュアルチャンネルの場合、左または右チャンネルに切り替えることができます。入力ソースがシングルチャンネルの場合、この設定は効果がありません。

説明

出力サウンドチャンネルの設定は、オーディオレンダリングと PCM データコールバックの両方に影響します。

// AVPOutputAudioChannel 列挙値を設定してサウンドチャンネルを切り替えます。
// AVP_AUDIO_CHANNEL_NONE: サウンドチャンネルを指定しません。入力ソースのサウンドチャンネルで再生します。これがデフォルト値です。
// AVP_AUDIO_CHANNEL_LEFT: 左サウンドチャンネルに切り替えて再生します。
// AVP_AUDIO_CHANNEL_RIGHT: 右サウンドチャンネルに切り替えて再生します。
self.player.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;

動画の背景色の設定

ApsaraVideo Player SDK for iOS では、プレーヤーレンダリングの背景色を設定できます。以下のセクションでは、API 操作と使用方法を示します。

API の例

/**
 @brief 動画の背景色を設定します。
 @param color  色
 */
-(void) setVideoBackgroundColor:(UIColor *)color;

使用方法

// パラメータは 8 ビットの 16 進数データです。8 ビットのデータは 2 つずつのグループに分割され、A (アルファ透明度)、R (赤)、G (緑)、B (青) を順に表します。
// たとえば、0x0000ff00 は緑を表します。
[self.player setVideoBackgroundColor:0x0000ff00]

VidAuth の再生ドメイン名の指定

VidAuth メソッドを使用すると、VID に対応するドメイン名などのフィールドを指定できます。サポートされているフィールドの詳細については、「GetPlayInfo リクエストパラメーター」をご参照ください。以下のセクションでは、API 操作と使用方法を示します。

API の例

/**
 @brief VID + PlayAuth を使用して再生します。詳細については、https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos をご参照ください。
 @param source AVPVidAuthSource の入力タイプ。
 @see AVPVidAuthSource
 */
- (void)setAuthSource:(AVPVidAuthSource*)source;

使用方法

`VidPlayerConfigGenerator` インターフェイスの `addVidPlayerConfigByStringValue` を通じて `playDomain` フィールドを追加できます。

VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// playDomain フィールドを追加します。追加できるフィールドについては、
// https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo をご参照ください。
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.xxx.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:

バックグラウンドデコード

V6.12.0 以降、ApsaraVideo Player SDK はバックグラウンドデコードをサポートしています。この機能を有効にすると、プレーヤーがバックグラウンドにある場合でも、ビデオストリームをデコードして再生し、コールバックをトリガーできます。以下のコードは使用例です。

// 値 1 はバックグラウンドデコードを有効にします。値 0 はバックグラウンドデコードを無効にします。デフォルト値は 0 です。
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];

H.266 デコードプラグイン

H.266 は、Versatile Video Coding (VVC) とも呼ばれ、同じ画質を維持しながら大幅なビットレート削減を実現する次世代のビデオエンコーディング標準です。パフォーマンスを最適化し、メイン SDK のサイズを制御するために、H.266 の付加価値デコード機能は、オンデマンド統合をサポートするプラグインとして独立してパッケージ化されています。

前提条件

  1. ApsaraVideo Player SDK または All-in-One SDK が V7.6.0 以降であること。

  2. Professional Edition ライセンスを取得していること。詳細については、「ApsaraVideo Player SDK のライセンスを取得する」をご参照ください。

  3. H.266 デコードプラグインを備えた ApsaraVideo Player は、Alibaba Cloud Transcoding によってトランスコードされた H.266 動画のみを再生できます。

プラグインの統合

Player SDK

CocoaPods 統合 (推奨)

Podfile ファイルに、指定されたバージョンのプラグインの依存関係を追加します。

説明

ApsaraVideo Player SDK for iOS の最新バージョンについては、「ApsaraVideo Player SDK for iOS のリリースノート」をご参照ください。

// x.x.x は ApsaraVideo Player SDK のバージョン番号と一致する必要があります。
pod 'AliPlayerSDK_iOS_VVC_CODEC_PLUGIN', 'x.x.x'

ローカル統合

最新の iOS プレーヤー SDK を ダウンロードし、vvcCodecPlugin.framwork[フレームワーク、ライブラリ、および埋め込みコンテンツ] に追加し、[埋め込み][埋め込みと署名] に設定し、対応する [フレームワーク検索パス] を設定できます。 詳細については、「ローカル統合」をご参照ください。

All-in-One SDK

CocoaPods 統合 (推奨)

Podfile ファイルに、指定されたバージョンのプラグインの依存関係を追加します。

// x.x.x は、使用している All-in-One SDK のバージョン番号と一致する必要があります。
pod 'AliVCSDK_Standard/AliPlayerSDK_iOS_VVC_CODEC', 'x.x.x'

ローカル統合

iOS オールインワンパッケージの最新バージョンをダウンロードして解凍できます。 プロジェクトの[Frameworks, Libraries, and Embedded Content] セクションに plugins/vvcCodecPlugin.framework を追加し、[Embed][Embed & Sign] に設定して、[Framework Search Paths] を設定します。 詳細については、「ローカルファイルを追加して SDK を統合する」をご参照ください。

プラグインのアクティベーション

説明

ApsaraVideo Player SDK for iOS V7.7.0 以降、プラグインはデフォルトで有効になっており、手動でアクティベートする必要はありません。

[AliPlayerGlobalSettings enableCodecPlugin:@"vvc" valid:true];

関連するエラーコード

H.266 デコードプラグインに関連するエラーコードの詳細については、「さまざまなクライアント上のプレーヤーに関するよくある質問」をご参照ください。

再生ソースの自動更新

再生ソースの自動更新機能を有効にすると、URL 署名の有効期限切れによる再生の中断を防ぐことができます。この機能は、ソースが無効になったときにリスナーをトリガーして新しいアドレスを取得します。これにより、継続的でスムーズな動画再生が保証されます。

前提条件

  1. ApsaraVideo Player SDK または All-in-One SDK が V7.9.0 以降であること。

  2. VidAuth ソースを再生に使用しているか、サービスにURL 署名が設定されていること。

VidAuth ソース

API の例

/**
 @brief VidAuth ソースの有効期限切れ通知のコールバックを設定します。

 このメソッドは、プレーヤーが現在の VidAuth ソースの有効期限が切れていることを検出したときにトリガーされます。
 コールバック内で VidAuth ソースを更新し、`callback` を使用して更新された VidAuth ソースを返すことができます。
 これにより、中断のないスムーズな動画再生が保証されます。

 @param callback VidAuth ソースの有効期限が切れたときにトリガーされるコールバックブロック。
 このコールバックを使用して、有効な `VidAuth` オブジェクトを提供し、プレーヤーを更新します。
 */
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;

機能コンポーネント

コンポーネント

/**
 @protocol AVPSourceRefreshCallback
 @brief 開発者が実装する必要がある、再生ソースの更新結果を処理するためのプロトコル。

 このプロトコルは、リソースの有効期限が切れたり更新が必要になったりした場合など、プレーヤーが再生ソースの更新を要求したときに開発者に通知します。
 このプロトコルのメソッドは、成功または失敗を含む更新結果を開発者に提供するために呼び出されます。

 @note このプロトコルは、URL ソース、VidAuth ソース、および更新ロジックを必要とする同様のシナリオに適用されます。
 */
@protocol AVPSourceRefreshCallback <NSObject>

/**
 @brief 更新操作が成功したときにプレーヤーによって呼び出されます。
 
 @param newSource 更新された情報を含む新しい再生ソースオブジェクト。

 このメソッドは、更新操作が正常に完了したことを示します。開発者は、更新された `newSource` をプレーヤーに返し、
 最新のリソースを読み込めるようにする必要があります。
 */
- (void)onSuccess:(id)newSource;

/**
 @brief 更新操作が失敗したときにプレーヤーによって呼び出されます。
 
 @param errorMsg 失敗の理由を説明する文字列。

 このメソッドは、更新操作が失敗したことを示します。開発者は `errorMsg` を使用して失敗の詳細をキャプチャし、
 それに応じて後続の処理を処理できます。
 */
- (void)onError:(NSString *)errorMsg;

@end

使用方法

GetVideoPlayAuth API 操作を呼び出すことで、オーディオまたはビデオの再生認証情報を取得できます。自己署名を避けるために、ApsaraVideo VOD サーバーサイド SDK を統合して認証情報を取得することを推奨します。詳細については、「OpenAPI Portal」をご参照ください。

[self.player setOnVidAuthExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
    // AVPVidAuthSource を取得します。
    if ([expiredSource isKindOfClass:[AVPVidAuthSource class]]) {

        // ------------------- ユーザー実装の開始 -------------------
        // アプリサーバーから新しい PlayAuth を取得する自己実装関数を呼び出します。
        // clinetGetPlayAuthFunction はサンプル関数名です。独自の実装に置き換えてください。
        [self clinetGetPlayAuthFunction:vid success:^(NSString* newPlayAuth){
            // 1. 新しい認証情報を正常に取得した場合のコールバック。
            [vidAuth setPlayAuth:newPlayAuth];
            // 2. 更新されたオブジェクトを SDK のコールバックを通じてプレーヤーに返します。
            [callback onSuccess:vidAuth];
        } failure:^(NSString* errorMsg) {
            // 新しい認証情報の取得に失敗した場合のコールバック。
            // errorMsg には詳細なエラー情報が含まれます。
            [callback onError:errorMsg];
        }];
        // ------------------- ユーザー実装の終了 -------------------
    }
}];

UrlSource ソース

API の例

/**
 @brief URL ソースの有効期限切れ通知のコールバックを設定します。

 このメソッドは、プレーヤーが現在の URL ソースの有効期限が切れていることを検出したときにトリガーされます。
 コールバック内で URL ソースを更新し、`callback` を使用して更新された URL ソースを返すことができます。
 これにより、中断のない動画再生が保証されます。

 @note URL 署名メカニズムの設定については、Alibaba Cloud の公式ドキュメントをご参照ください:
 https://www.alibabacloud.com/help/zh/vod/user-guide/configure-url-signing?spm=a2c4g.11186623.0.0.560c4140fGh8MW
 
 @param callback URL ソースの有効期限が切れたときにトリガーされるコールバックブロック。
 このコールバックを使用して、有効な `URLSource` オブジェクトを提供し、プレーヤーを更新します。
 */
-(void)setOnURLSourceExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;

機能コンポーネント

コンポーネント

/**
 @protocol AVPSourceRefreshCallback
 @brief 開発者が実装する必要がある、再生ソースの更新結果を処理するためのプロトコル。

 このプロトコルは、リソースの有効期限が切れたり更新が必要になったりした場合など、プレーヤーが再生ソースの更新を要求したときに開発者に通知します。
 このプロトコルのメソッドは、成功または失敗を含む更新結果を開発者に提供するために呼び出されます。

 @note このプロトコルは、URL ソース、VidAuth ソース、および更新ロジックを必要とする同様のシナリオに適用されます。
 */
@protocol AVPSourceRefreshCallback <NSObject>

/**
 @brief 更新操作が成功したときにプレーヤーによって呼び出されます。
 
 @param newSource 更新された情報を含む新しい再生ソースオブジェクト。

 このメソッドは、更新操作が正常に完了したことを示します。開発者は、更新された `newSource` をプレーヤーに返し、
 最新のリソースを読み込めるようにする必要があります。
 */
- (void)onSuccess:(id)newSource;

/**
 @brief 更新操作が失敗したときにプレーヤーによって呼び出されます。
 
 @param errorMsg 失敗の理由を説明する文字列。

 このメソッドは、更新操作が失敗したことを示します。開発者は `errorMsg` を使用して失敗の詳細をキャプチャし、
 それに応じて後続の処理を処理できます。
 */
- (void)onError:(NSString *)errorMsg;

@end

使用方法

[self.player setOnURLSourceExpiredCallback:^(id expiredSource, id<AVPSourceRefreshCallback> callback) {
    // AVPUrlSource を取得します。
    if ([expiredSource isKindOfClass:[AVPUrlSource class]]) {
        AVPUrlSource *expiredUrlSource = (AVPUrlSource *)expiredSource;
        NSString *expiredUrl = [expiredUrlSource.playerUrl absoluteString];

        // auth_key が含まれているか確認します。
        if (![expiredUrl containsString:@"auth_key="]) {
            return;
        }

        // 1. 期限切れの URL から元の URL を抽出します。
        NSRange authKeyQuestionRange = [expiredUrl rangeOfString:@"?auth_key="];
        NSRange authKeyAmpersandRange = [expiredUrl rangeOfString:@"&auth_key="];

        NSInteger authKeyIndex = NSNotFound;
        if (authKeyQuestionRange.location != NSNotFound) {
            authKeyIndex = authKeyQuestionRange.location;
        } else if (authKeyAmpersandRange.location != NSNotFound) {
            authKeyIndex = authKeyAmpersandRange.location;
        }

        NSString *originalUrl = nil;
        if (authKeyIndex != NSNotFound) {
            originalUrl = [expiredUrl substringToIndex:authKeyIndex];
        } else {
            // auth_key が見つからない場合、URL 全体を元の URL と見なします。
            originalUrl = expiredUrl;
        }

        // 2. 新しい署名パラメータを準備します: authKey と有効期限。
        // クラスメンバーの authKey が有効な場合は、authKey を使用します。
        NSString *key = (self.authKey.length > 0) ? self.authKey : @"";
        if (!NOT_EMPTY(key)) {
            [callback onError:@"REFRESH_ERROR:key fail"];
            return;
        }       
        
        // クラスメンバーの validTime が有効な場合は validTime を使用し、それ以外の場合はデフォルト値を使用します。
        NSTimeInterval validTime = (self.validTime > 0) ? self.validTime : 3600; // デフォルトは 3600 秒です。
        NSTimeInterval newExpireTime = [[NSDate date] timeIntervalSince1970] + validTime;

         // 3. CdnAuthUtil を使用して新しい署名付き URL (タイプ A) を生成します。
        NSString *newAuthUrl = [CdnAuthUtil aAuthWithUri:originalUrl key:key exp:newExpireTime];
        AVPUrlSource *resultSource = [[AVPUrlSource alloc] urlWithString:newAuthUrl];

        // 4. コールバックを処理します。
        if (newAuthUrl) {
            [callback onSuccess:resultSource];
        } else {
            [callback onError:@"REFRESH_ERROR:refresh fail"];
        }
    }
}];

補足ユーティリティ関数

この例では、タイプ A 署名を使用しています。

補足ユーティリティ関数

#import "CdnAuthUtil.h"
#import <CommonCrypto/CommonDigest.h>

@implementation CdnAuthUtil

#pragma mark - Auth Method A
+ (NSString *)aAuthWithUri:(NSString *)uri key:(NSString *)key exp:(NSTimeInterval)exp {
    NSDictionary *components = [self matchUri:uri];
    if (!components) return nil;

    NSString *scheme = components[@"scheme"];
    NSString *host = components[@"host"];
    NSString *path = components[@"path"];
    NSString *args = components[@"args"];

    NSString *rand = @"0";
    NSString *uid = @"0";

    NSString *sstring = [NSString stringWithFormat:@"%@-%lld-%@-%@-%@", path, (long long)exp, rand, uid, key];
    NSString *hashvalue = [self md5sum:sstring];
    NSString *authKey = [NSString stringWithFormat:@"%lld-%@-%@-%@", (long long)exp, rand, uid, hashvalue];

    if (args.length > 0) {
        return [NSString stringWithFormat:@"%@%@%@%@&auth_key=%@", scheme, host, path, args, authKey];
    } else {
        return [NSString stringWithFormat:@"%@%@%@%@?auth_key=%@", scheme, host, path, args, authKey];
    }
}

#pragma mark - Private Helper: MD5
+ (NSString *)md5sum:(NSString *)src {
    const char *cStr = [src UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(cStr, (unsigned int)strlen(cStr), result);

    NSMutableString *hexString = [NSMutableString string];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [hexString appendFormat:@"%02x", result[i]];
    }
    return hexString.copy;
}

#pragma mark - Private Helper: Regex Match
+ (NSDictionary *)matchUri:(NSString *)uri {
    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^(https?://)?([^/?]+)(/[^?]*)?(\\?.*)?$"
                                  options:0
                                  error:&error];
    if (error) {
        NSLog(@"Regex error: %@", error.localizedDescription);
        return nil;
    }

    NSTextCheckingResult *match = [regex firstMatchInString:uri
                                   options:0
                                   range:NSMakeRange(0, uri.length)];
    if (!match) return nil;

    __block NSString *scheme = nil, *host = nil, *path = nil, *args = nil;

    void (^setStringFromRange)(NSInteger, NSString**) = ^(NSInteger idx, NSString **outStr) {
        NSRange range = [match rangeAtIndex:idx];
        if (range.location != NSNotFound && range.length > 0) {
            *outStr = [uri substringWithRange:range];
        } else {
            *outStr = nil;
        }
    };

    setStringFromRange(1, &scheme);
    setStringFromRange(2, &host);
    setStringFromRange(3, &path);
    setStringFromRange(4, &args);

    // デフォルト値を処理します。
    if (!scheme) scheme = @"http://";
    if (!path) path = @"/";

    return @{
        @"scheme": scheme,
        @"host": host,
        @"path": path,
        @"args": args ?: @""
        };
}
@end

パフォーマンス

再生シナリオの設定

再生シナリオを設定すると、バッファ設定や機能の切り替えなど、シナリオに基づいて最適なパラメータが自動的に構成されます。この設定は、setConfig インターフェイスを使用して構成されたカスタムパラメータ設定とも互換性があります。カスタム設定が優先されます。

説明
  • 再生シナリオを設定した後、getConfig インターフェイスを使用してパラメータ設定を表示できます。

API の例

/**
 @brief プレーヤーシーンを設定します。
 @param scene プレーヤーシーン。
 @see AVPScene
 */
-(void) setPlayerScene:(AVPScene)scene;

再生シナリオ

typedef enum _AVPScene {
    /**
     * シーン: なし
     */
    SceneNone,
    /**
     * 長編動画シーン: 30 分以上の動画に適用
     */
    SceneLong,
    /**
     * 中編動画シーン: 5 分から 30 分の動画に適用
     */
    SceneMedium,
    /**
     * 短編動画シーン: 0 秒から 5 分の動画に適用
     */
    SceneShort,
    /**
     * ライブストリーミングシーン
     */
    SceneLive,
    /**
     * RTS ライブシーン
     */
    SceneRTSLive
} AVPScene;

使用方法

// 短編動画シーンを設定します。
[self.player setPlayerScene:SceneShort];

// 中編動画シーンを設定します。
[self.player setPlayerScene:SceneMedium]; 

// 長編動画シーンを設定します。
[self.player setPlayerScene:SceneLong];  

// ライブストリーミングシーンを設定します。
[self.player setPlayerScene:SceneLive];   

プリレンダリング

ApsaraVideo Player SDK for iOS は、再生開始前に最初のフレームを高速にレンダリングすることをサポートしており、これにより初回フレームの読み込み速度が向上します。

説明
  1. この機能はデフォルトで無効になっています。

  2. この機能を有効にすると、準備成功イベントと初回フレームレンダリングイベントのトリガー順序に影響します。この機能が無効の場合、準備成功イベントは初回フレームレンダリングイベントの前にコールバックされます。この機能が有効の場合、デコードとレンダリングの速度が異なるため、初回フレームレンダリングが準備成功イベントの前にトリガーされる可能性があります。ただし、これは再生には影響しません。

例:

[self.player setOption:ALLOW_PRE_RENDER valueInt:1];

ローカルキャッシュ

説明

詳細なコード例については、API-ExampleVideo Preload (PreloadUrl) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C サンプルプロジェクトであり、コア SDK 機能を迅速に統合する方法を示しています。

ApsaraVideo Player SDK for iOS は、ローカルキャッシュ機能を提供します。この機能は、ユーザーが動画を複数回再生する際の初回フレームの読み込み速度、シーク速度を向上させ、カクつきを減らします。また、ネットワークトラフィックの節約にも役立ちます。

ローカルキャッシュの有効化

デフォルトでは、ローカルキャッシュ機能は無効になっています。この機能を使用するには、手動で有効にする必要があります。この機能は、enableLocalCacheAliPlayerGlobalSettings を使用して制御できます。以下は一例です。

/**
 * ローカルキャッシュを有効にします。有効にすると、動画はローカルファイルにキャッシュされます。
 * @param enable: ローカルキャッシュ機能のスイッチ。true: 有効、false: 無効。デフォルトは false です。
 * @param maxBufferMemoryKB: V5.4.7.1 以降非推奨、効果なし。
 * @param localCacheDir: 設定必須。ローカルキャッシュファイルのディレクトリ、絶対パスである必要があります。
 */
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];

/**
 @brief ローカルキャッシュファイルの自動クリア設定。
 @param expireMin: V5.4.7.1 以降非推奨、効果なし。
 @param maxCapacityMB: 最大キャッシュ容量 (メガバイト)。デフォルトは 20 GB です。クリーンアップ中、合計キャッシュ容量がこのサイズを超えた場合、キャッシュアイテムの最終アクセス時間でソートされた最も古いキャッシュファイルが、合計容量が最大容量以下になるまで 1 つずつ削除されます。
 @param freeStorageMB: 最小空きディスク領域 (メガバイト)。デフォルトは 0 です。クリーンアップ中、最大キャッシュ容量と同様に、現在のディスク領域がこの値より小さい場合、ルールに従ってキャッシュファイルも 1 つずつ削除され、空きストレージがこの値以上になるか、すべてのキャッシュがクリアされるまで続きます。
 */
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];

/**
 * 読み込まれた URL のハッシュ値を取得するためのコールバック。URL の一意の ID として使用されます。各 URL が一意であることが保証されている必要があります。
 */

// この関数を自分で実装し、関数ポインタを setCacheUrlHashCallback に渡す必要があります。
static NSString *CaheUrlHashHandle(NSString *url) {
    return @"xxx";
}

[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];
説明
  • 動画再生 URL に認証パラメータがある場合、ローカルキャッシュと再生中に認証パラメータが変更されます。異なる認証を持つ同じ URL のキャッシュヒット率を向上させるために、setCacheUrlHashCallback インターフェイスを通じてハッシュ値 (例: MD5) を計算する前に URL から認証パラメータを削除できます。たとえば、認証パラメータ付きの動画再生 URL が http://****.mp4?aaa の場合、読み込み時にハッシュ値を計算するために http://****.mp4 を使用します。ただし、動画が暗号化された m3u8 動画であり、その keyURL がハッシュ値を計算する前に認証パラメータを削除して処理される場合、異なる動画のキャッシュが同じキーにヒットし、再生に失敗する可能性があります。解決策: setCacheUrlHashCallback のコールバックで、ドメイン名チェックを実行し、再生ドメイン (http(s)://xxxxx.m3u8?aaaa) の認証パラメータのみを削除し、keyURL に対応するドメイン (http(s)://yyyyy?bbbb) の認証パラメータは削除しません。进阶功能-本地缓存.png

  • サーバーが HTTP と HTTPS の両方のプロトコルをサポートしているが、異なるプロトコルが同じメディアファイルを指している場合、MD5 値を計算する前にリクエストヘッダーを削除または統一できます。例:

    • 動画再生 URL が https://****.mp4http://****.mp4 の場合、読み込み時に MD5 値を計算するために ****.mp4 を使用できます。

    • 動画再生 URL が https://****.mp4 の場合、読み込み時に MD5 値を計算する前に http://****.mp4 に統一できます。

  • ApsaraVideo Player SDK V5.5.4.0 以降、動画再生 URL に署名パラメータがあり、再生プロトコルが HLS の場合、AVPConfig.enableStrictAuthMode フィールドを設定して異なる署名モードを選択できます。バージョン 5.5.4.0 から 6.21.0 までのデフォルト値は `false` です。バージョン 7.0.0 以降のデフォルト値は `true` です。

    • 非厳密署名 (`false`): 署名もキャッシュされます。前回メディアの一部のみがキャッシュされた場合、プレーヤーは次回キャッシュされていない部分を再生する際にキャッシュされた署名を使用してリクエストを開始します。URL 署名の有効期間が非常に短い場合、これにより再生例外が発生します。

    • 厳密署名 (`true`): 署名はキャッシュされません。再生が開始されるたびに署名が実行されます。これにより、ネットワーク接続がないと再生に失敗します。

単一 URL のローカルキャッシュの有効化または無効化

単一 URL のローカルキャッシュを無効にしたい場合は、player config で設定できます。以下のコードは一例です。

// まず、構成を取得します。
AVPConfig *config = [self.player getConfig];
// 再生 URL のローカルキャッシュを有効にするかどうか。デフォルト値は true です。AliPlayerGlobalSettings でローカルキャッシュが有効になっており、ここでもローカルキャッシュが有効になっている (true に設定されている) 場合、この URL のローカルキャッシュが有効になります。ここで false に設定すると、この URL のローカルキャッシュは無効になります。
config.enableLocalCache = false;
....// その他の設定。

// プレーヤーの構成を設定します。
[self.player setConfig:config];

デフォルトのキャッシュパスの使用

キャッシュにデフォルトのパスを使用したい場合は、AliPlayerGlobalSettings を通じて以下の設定を行うことができます。

[AliPlayerGlobalSettings enableLocalCache:true];

プリロード

ApsaraVideo Player SDK for iOS は、ローカルキャッシュ機能をアップグレードしたプリロード機能を提供します。動画キャッシュが占有するメモリサイズを設定することで、動画の初回フレームの読み込み速度をさらに向上させることができます。

プリロード機能の制限は次のとおりです。

  • 現在、MP4、MP3、FLV、HLS などの単一メディアファイルの読み込みをサポートしています。

説明

デフォルトでは、ApsaraVideo Player SDK for iOS は、プリロード中のネットワークリソースの自動スケジューリング機能を提供します。これは、プリロードのネットワークリクエストが再生中の動画のネットワークリクエストに与える影響を軽減するためです。自動スケジューリングポリシーは、再生中の動画のバッファが特定のしきい値に達した後にのみプリロードがリクエストを行うことを許可するというものです。プリロードのリアルタイムリクエストを制御するには、次のメソッドを使用してこのポリシーを無効にできます。

[AliPlayerGlobalSettings enableNetworkBalance:false];
  1. ローカルキャッシュ機能を有効にします。詳細については、「ローカルキャッシュ」をご参照ください。

  2. データソースを設定します。

    VidAuth (推奨)

    AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init];
    [vidAuthSource setVid:@"Vid 情報"]; // 必須。動画 ID。
    [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // 必須。再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth API 操作を呼び出して生成する必要があります。
    [vidAuthSource setRegion:@"アクセスリージョン"]; // プレーヤー SDK V5.5.5.0 以降、このパラメータは非推奨です。リージョンを設定する必要はありません。プレーヤーが自動的に解析します。プレーヤー SDK V5.5.5.0 より前の場合、このパラメータは必須です。ApsaraVideo VOD のアクセスリージョン、デフォルトは cn-shanghai です。
    [vidAuthSource setQuality:@"選択された解像度"]; // "AUTO" はアダプティブビットレートを表します。

    VidSts

    AVPVidStsSource* vidStsSource = [[AVPVidStsSource alloc] init];
    [vidStsSource setVid: @"Vid 情報"]; // 必須。動画 ID。
    [vidStsSource setRegion:@"アクセスリージョン"]; // 必須。ApsaraVideo VOD のアクセスリージョン、デフォルトは cn-shanghai です。
    [vidStsSource setSecurityToken: @"<yourSecurityToken>"]; // 必須。STS トークン。STS の AssumeRole API 操作を呼び出して生成する必要があります。
    [vidStsSource setAccessKeySecret: @"<yourAccessKeySecret>"]; // 必須。一時的な STS AccessKey ペアの AccessKey Secret。STS の AssumeRole API 操作を呼び出して生成する必要があります。
    [vidStsSource setAccessKeyId: @"<yourAccessKeyId>"]; // 必須。一時的な STS AccessKey ペアの AccessKey ID。STS の AssumeRole API 操作を呼び出して生成する必要があります。
    [vidStsSource setQuality:@"選択された解像度"]; // "AUTO" はアダプティブビットレートを表します。

    UrlSource

    NSString* url = @"再生 URL"; // 必須。再生 URL。サードパーティの VOD URL または ApsaraVideo VOD の再生 URL にすることができます。
    AVPUrlSource* urlSource = [[AVPUrlSource alloc]urlWithString:url];
  3. タスクパラメータを設定します。

    説明

    これはマルチビットレート動画にのみ適用されます。setDefaultBandWidthsetDefaultResolution、または setDefaultQuality のいずれか 1 つのみを設定できます。

    AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init];
    // マルチビットレートストリームのプリロードビットレートを設定します。
    [config setDefaultBandWidth:400000];
    // マルチビットレートストリームのプリロード解像度を設定します。
    [config setDefaultResolution:640 * 480];
    // マルチビットレートストリームのプリロード品質を設定します。
    [config setDefaultQuality:@"FD"];
    // プリロード時間を設定します。
    [config setDuration:1000];
  4. タスクリスナーを追加します。

    コードを展開して表示

    @interface YourViewController () <OnPreloadListener>
    
    @property(nonatomic,strong) AliMediaLoaderV2* vodMedialoader; // プリローダー
    @property(nonatomic,strong) AVPVidAuthSource* vidSource; // vidAuth データソース
    @property(nonatomic,strong) AVPUrlSource* urlSource; // url データソース
    @property(nonatomic,strong) AVPVidStsSource* vidStsSource; // vidSts データソース
    
    @end
    
    @implementation YourViewController
    
    - (void)onCompleted:(NSString *)taskId urlOrVid:(NSString *)urlOrVid {
        NSLog(@"現在のタスク (%@) が完了しました:%@", taskId,urlOrVid);
    }
    
    - (void)onError:(NSString *)taskId urlOrVid:(NSString *)urlOrVid errorModel:(AVPErrorModel *)errorModel {
        NSLog(@"例外が発生しました:%@", urlOrVid);
    }
    
    - (void)onCanceled:(NSString *)taskId urlOrVid:(NSString *)urlOrVid {
        NSLog(@"タスクがキャンセルされました:%@", urlOrVid);
    }
    
    @end
  5. タスクをビルドし、MediaLoaderV2 インスタンスに追加してプリロードを開始します。

    VidAuth (推奨)

    // プリロードタスクをビルドします。
    AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidAuthSource:vidAuthSource preloadConfig:config];
    // MediaLoaderV2 インスタンスを取得します。
    AliMediaLoaderV2* vodMedialoader = [AliMediaLoaderV2 shareInstance];
    // タスクを追加してプリロードを開始します。
    NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];

    VidSts

    // プリロードタスクをビルドします。
    AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithVidStsSource:vidStsSource preloadConfig:config];
    // MediaLoaderV2 インスタンスを取得します。
    AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init];
    // タスクを追加してプリロードを開始します。
    NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];

    UrlSource

    // プリロードタスクをビルドします。
    AVPPreloadTask* mPreloadTask = [[AVPPreloadTask alloc]initWithUrlSource:urlSource preloadConfig:config];
    // MediaLoaderV2 インスタンスを取得します。
    AliMediaLoaderV2* vodMedialoader = [[AliMediaLoaderV2 alloc]init];
    // タスクを追加してプリロードを開始します。
    NSString* taskId = [vodMedialoader addTask:mPreloadTask listener:self];
  6. 任意: タスクの管理

    [vodMedialoader cancelTask:taskId]; // 指定されたタスク ID のプリロードタスクをキャンセルします。
    [vodMedialoader pauseTask:taskId]; // 指定されたタスク ID のプリロードタスクを一時停止します。
    [vodMedialoader resumeTask:taskId]; // 指定されたタスク ID のプリロードタスクを再開します。
  7. 任意: 読み込まれたファイルの削除

    必要に応じて読み込まれたファイルを削除して、スペースを節約できます。ApsaraVideo Player SDK for iOS は削除インターフェイスを提供していません。アプリの読み込みディレクトリ内のファイルを削除する必要があります。

動的プリロード

動的プリロードポリシーにより、インテグレーターは現在再生中の動画のキャッシュと、プリロードされた動画の数とキャッシュの両方を制御でき、ビジネスニーズに合わせて再生体験とコストオーバーヘッドのバランスを取ることができます。

コードを展開して表示

// 推奨構成と動的プリロードを有効にします。
[self.listPlayer setScene:AVP_SHORT_VIDEO];

// ベースラインのプリロード時間を構成します。
// プリロード時間を 1000 ms に設定します。
AVPPreloadConfig *config = [[AVPPreloadConfig alloc] init];
config.preloadDuration = 1000;
[self.listPlayer updatePreloadConfig:config];

// プリロード数を構成し、両方向をサポートします。
// 1 は後方へのプリロード数、3 は前方へのプリロード数です。
[self.listPlayer setPreloadCount:1 nextCount:3];

// 動的プリロードの減少オフセットを構成します。
[self.listPlayer enableStrategy:AVP_STRATEGY_DYNAMIC_PRELOAD enable:true];
[self.listPlayer setStrategyParam:AVP_STRATEGY_DYNAMIC_PRELOAD strategyParam:@"{\"algorithm\": \"sub\",\"offset\": \"200\"}"];

マルチビットレート HLS 動画のプリロード

listPlayer とマルチビットレート HLS 動画再生シナリオでは、現在の再生解像度に一致する解像度のストリームをプリロードし、必要に応じてプリロードモードを選択できます。

サポートされているプリロードモードを展開して表示

typedef enum AVPMultiBitratesMode : NSUInteger {
    /**
     * デフォルトモード、ストリームのデフォルトビットレートを再生およびプリロードします。
     */
    AVPMultiBitratesMode_Default = 0,
    /**
     * 初回フレームコスト (FC) 優先、初回フレームコストを削減します。プリロードされた HLS ストリームのビットレートのみを再生します。
     */
    AVPMultiBitratesMode_FCPrio = 1,
    /**
     * 初回フレームと再生のスムーズさのバランス、moveToNext の前後で同じビットレートを再生します。
     */
    AVPMultiBitratesMode_FC_AND_SMOOTH = 2,
    /**
     * 再生のスムーズさ優先、moveToNext の前後で同じビットレートを再生します。
     */
    AVPMultiBitratesMode_SmoothPrio = 3,
} AVPMultiBitratesMode;

統合コードを展開して表示

// マルチビットレート読み込みモードを選択します。
[self.listPlayer->SetMultiBitratesMode(preLoadMode)];

// (任意) 開始ビットレートを選択します。
[self.listPlayer setDefaultBandWidth:defaultBandWidth];

// (任意) preparedone コールバックで、ABR モードを選択します。
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventPrepareDone: {
            [self.listPlayer selectTrack:-1];
        }
            break;
        case AVPEventFirstRenderedStart: {
        }
            break;
        default:
            break;
    }
}

ダウンロード速度の取得

現在再生中の動画のダウンロード速度を取得できます。速度は `onCurrentDownloadSpeed` コールバックで取得できます。以下のコードは一例です。

- (void)onCurrentDownloadSpeed:(AliPlayer *)player speed:(int64_t)speed{
  intspeed_=speed;
}

ネットワーク機能

HTTPDNS

HTTPDNS は、特定の HTTPDNS サーバーにドメイン名の名前解決リクエストを送信して、より高速で安定したドメイン名の名前解決結果を取得し、DNS ハイジャックのリスクを軽減します。

ApsaraVideo Player SDK は、Alibaba Cloud CDN ドメイン名専用の HTTPDNS サービスを提供する拡張 HTTPDNS 機能を提供します。Alibaba Cloud CDN ネットワークの正確なスケジューリングとリアルタイム解決をサポートし、ネットワークパフォーマンスを効果的に向上させます。

拡張 HTTPDNS の使用例

拡張 HTTPDNS は、Alibaba Cloud CDN ドメイン名に対してのみ HTTPDNS サービスを提供します。構成するドメイン名が Alibaba Cloud CDN ドメイン名であり、ドメイン名の構成が完了して使用準備ができていることを確認してください。ApsaraVideo VOD で CDN ドメイン名を追加および構成する方法の詳細については、「高速化ドメイン名の追加」をご参照ください。CDN ドメイン名の詳細については、「Alibaba Cloud CDN」をご参照ください。

// 拡張 HTTPDNS を有効にします。
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
// 任意: HTTPDNS の事前解決のためにドメイン名を追加します。
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];

HTTP/2

説明

V5.5.0.0 以降、ApsaraVideo Player SDK for iOS はデフォルトで HTTP/2 を有効にします。

ApsaraVideo Player SDK for iOS は HTTP/2 プロトコルをサポートしています。このプロトコルは多重化を使用して head-of-line ブロッキングを回避し、再生パフォーマンスを向上させます。以下のコードは一例です。

[AliPlayerGlobalSettings setUseHttp2:true];

HTTP のための TCP 接続の事前確立

HTTP 動画再生リクエスト (HTTPS ではない) の場合、TCP 接続を事前に確立することで、ユーザーエクスペリエンスを大幅に向上させ、ネットワーク接続時間を短縮し、即時かつ継続的な再生を保証し、ネットワークおよびシステムリソースの使用を最適化できます。使用方法は次のとおりです。

// ドメイン形式は host[:port] で、port は任意です。複数のドメイン名はセミコロン (;) で区切ります。
// グローバル設定
// 完全なインターフェイスは、設定されるたびに現在の文字列を使用します (多い場合は追加、少ない場合は削除)。空の文字列は事前接続を停止します。
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];

動画ダウンロード

説明

詳細なコード例については、API-ExampleVideo Download and Offline Playback (Download) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C サンプルプロジェクトであり、コア SDK 機能を迅速に統合する方法を示しています。

ApsaraVideo Player SDK for iOS は、ApsaraVideo VOD の動画ダウンロード機能を提供します。この機能により、ユーザーは動画をローカルにキャッシュして、ApsaraVideo Player でオフライン視聴できます。SDK は、標準ダウンロードとセキュアダウンロードの 2 つのダウンロード方法を提供します。

  • 標準ダウンロード: ダウンロードされた動画データは Alibaba Cloud によって暗号化されません。ユーザーはサードパーティのプレーヤーで再生できます。

  • セキュアダウンロード: ダウンロードされた動画データは Alibaba Cloud によって暗号化されます。サードパーティのプレーヤーではデータを再生できません。データは ApsaraVideo Player を使用してのみ再生できます。

注意事項

  • 動画ダウンロード機能は、VidSts および VidAuth メソッドでのみサポートされています。

  • プレーヤーの動画ダウンロード機能を使用するには、ApsaraVideo VOD コンソールでダウンロードモードを有効にして構成する必要があります。詳細については、「オフラインダウンロード」をご参照ください。

  • 動画ダウンロードは、再開可能なダウンロードをサポートしています。

操作手順

  1. 任意: セキュアダウンロード用の暗号化検証ファイルを構成します。これはセキュアダウンロードにのみ必要であり、標準ダウンロードには必要ありません。

    説明

    構成された暗号化検証ファイルがアプリ情報と一致していることを確認してください。そうしないと、動画のダウンロードに失敗します。

    ダウンロード方法をセキュアダウンロードに設定した場合、動画のダウンロードと再生中に復号と検証のために、ApsaraVideo VOD コンソールで生成されたキーファイルをプレーヤー SDK に構成する必要があります。キーファイルの生成方法の詳細については、「セキュアダウンロードを有効にする」をご参照ください。

    この設定は、アプリケーションで 1 回限りの構成が必要です。以下は一例です。

    NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"];
    [AliPrivateService initKey:encrptyFilePath];
  2. ダウンローダーを作成して設定します。

    例:

    AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init];
    [downloader setSaveDirectory:self.downLoadPath];
    [downloader setDelegate:self];
  3. イベントリスナーを設定します。

    ダウンローダーは複数のイベントリスナーを提供します。以下のコードは一例です。

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        // ダウンロード項目が正常に準備されました。
    }
    -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel {
        // ダウンロードエラーが発生しました。
    }
    -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // ダウンロード進捗率。
    }
    -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // 処理進捗率。
    }
    -(void)onCompletion:(AliMediaDownloader *)downloader {
        // ダウンロードが成功しました。
    }
  4. ダウンロードソースを準備します。

    prepare メソッドを使用してダウンロードソースを準備できます。VidSts と VidAuth の両方のメソッドがサポートされています。以下のコードは一例です。

    • VidSts

      // VidSts を作成します。
      AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init];
      stsSource.region = @"アクセスリージョン"; // ApsaraVideo VOD のアクセスリージョン。デフォルトは cn-shanghai です。
      stsSource.vid = @"Vid 情報"; // 動画 ID。
      stsSource.securityToken = @"<yourSecurityToken>"; // STS トークン。STS の AssumeRole API 操作を呼び出して生成する必要があります。
      stsSource.accessKeySecret = @"<yourAccessKeySecret>"; // 一時的な STS AccessKey ペアの AccessKey Secret。STS の AssumeRole API 操作を呼び出して生成する必要があります。
      stsSource.accessKeyId = @"<yourAccessKeyId>"; // 一時的な STS AccessKey ペアの AccessKey ID。STS の AssumeRole API 操作を呼び出して生成する必要があります。
      
      // VOD コンソールで HLS 標準暗号化パラメータのパススルーを有効にしており、デフォルトのパラメータ名が MtsHlsUriToken の場合、以下のように config を設定して vid に渡す必要があります。
      // VOD コンソールで HLS 標準暗号化パラメータのパススルーを有効にしていない場合、以下のコードを統合する必要はありません。
      VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
      [vp setHlsUriToken:yourMtsHlsUriToken];
      stsSource.playConfig = [vp generatePlayerConfig];
      // ダウンロードソースを準備します。
      [downloader prepareWithVid:stsSource];
    • VidAuth

      // VidAuth を作成します。
      AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
      authSource.vid = @"Vid 情報"; // 動画 ID。
      authSource.playAuth = @"<yourPlayAuth>"; // 再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth API 操作を呼び出して生成する必要があります。
      authSource.region = @"アクセスリージョン"; // プレーヤー SDK V5.5.5.0 以降、このパラメータは非推奨です。リージョンを設定する必要はありません。プレーヤーが自動的に解析します。プレーヤー SDK V5.5.5.0 より前の場合、このパラメータは必須です。ApsaraVideo VOD のアクセスリージョン、デフォルトは cn-shanghai です。
      // VOD コンソールで HLS 標準暗号化パラメータのパススルーを有効にしており、デフォルトのパラメータ名が MtsHlsUriToken の場合、以下のように config を設定して vid に渡す必要があります。
      // VOD コンソールで HLS 標準暗号化パラメータのパススルーを有効にしていない場合、以下のコードを統合する必要はありません。
      VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
      [vp setHlsUriToken:yourMtsHlsUriToken];
      authSource.playConfig = [vp generatePlayerConfig];
      // ダウンロードソースを準備します。
      [downloader prepareWithVid:authSource];
    説明

    VOD コンソールで HLS 標準暗号化パラメータのパススルーを有効にしており、デフォルトのパラメータ名が `MtsHIsUriToken` の場合 (詳細については、「HLS 標準暗号化パラメータのパススルー」をご参照ください)、上記のコードに示すように `MtsHIsUriToken` の値を VOD ソースに設定してください。

  5. 準備が成功した後、ダウンロード項目を選択します。

    準備が成功すると、onPrepared メソッドがコールバックされます。返された `TrackInfo` には、各ビデオストリームの解像度などの情報が含まれています。ダウンロードするトラックを選択できます。以下のコードは一例です。

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        NSArray<AVPTrackInfo*>* tracks = info.tracks;
        // たとえば、最初の TrackInfo をダウンロードします。
        [downloader selectTrack:[tracks objectAtIndex:0].trackIndex];
    }
  6. ダウンロードソースを更新し、ダウンロードを開始します。

    VidSts と VidAuth の有効期限が切れるのを防ぐために、ダウンロードを開始する前にダウンロードソース情報を更新することを推奨します。以下のコードは一例です。

    // ダウンロードソースを更新します。
    [downloader updateWithVid:vidSource]
    // ダウンロードを開始します。
    [downloader start];
  7. ダウンロードが成功または失敗した後、ダウンローダーを解放します。

    ダウンロードが成功した後、destroy を呼び出してダウンローダーを解放できます。

    [self.downloader destroy];
    self.downloader = nil;

暗号化された動画の再生

ApsaraVideo VOD は、HLS 暗号化、Alibaba Cloud 専用の暗号化、および DRM 暗号化をサポートしています。ライブストリーミング動画は DRM 暗号化のみをサポートしています。暗号化された再生の詳細については、「暗号化された動画の再生」をご参照ください。

ネイティブ RTS 再生

ApsaraVideo Player SDK for iOS は、ネイティブ RTS SDK を統合して、ネイティブの低遅延ライブストリーミング機能を実装します。詳細については、「iOS での RTS ストリームフェッチングの実装」をご参照ください。

参考資料