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

ApsaraVideo VOD:高度な機能

最終更新日:Oct 29, 2024

このトピックでは、ApsaraVideo Player SDK for iOSの高度な機能について説明し、サンプルコードを提供します。 機能の詳細については、「ApsaraVideo Player SDK For iOSのAPI操作」をご参照ください。

再生の設定

短いビデオのリスト再生を有効にする

ApsaraVideo Player SDK for iOSは、ショートビデオの本格的なリスト再生機能を提供します。 SDKは、プリロードなどの機能を使用して、短いビデオの起動時間を最小限に抑えます。 長い動画ではこの機能を有効にしないことをお勧めします。

手順

  1. プレイヤーを作成します。

    AliListPlayerオブジェクトを作成します。 サンプルコード:

    self.listPlayer = [[AliListPlayer alloc] init];
    [listPlayer setTraceID:@"xxxxxx"];  // TraceID indicates the unique identifier of the device or the user. In most cases, the value is the International Mobile Equipment Identity (IMEI) or the Identifier for Advertisers (IDFA) of the device.

  2. オプション: リスナーを設定します。

    短いビデオリストプレーヤーを作成する場合、リスナーはオプションです。 リスナーを設定しないと、プレーヤーに関連するイベント (再生の失敗や進行状況など) の通知を受け取ることができません。 必要に応じてリスナーを設定することを推奨します。

    プレーヤーに複数のリスナーを設定できます。 onPlayerEventおよびonErrorのリスナーを設定することを推奨します。

    /**
     @brief The callback for an invalid delegate.
     @param player The pointer of the player.
     @param errorModel The description of player errors. For more information, see AliVcPlayerErrorModel.
     */
    - (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
        // Indicates that an error occurred and the playback is stopped.
    }
    /**
     @brief The callback for player events.
     @param player The pointer of the player.
     @param eventType The event type of the player. This parameter is similar to the AVPEventType parameter.
     */
    -(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
        switch (eventType) {
            case AVPEventPrepareDone: {
                // The preparation is complete.
            }
                break;
            case AVPEventAutoPlayStart:
                // The autoplay starts.
                break;
            case AVPEventFirstRenderedStart:
                // The first frame appears.
                break;
            case AVPEventCompletion:
                // The playback is complete.
                break;
            case AVPEventLoadingStart:
                // The buffering starts.
                break;
            case AVPEventLoadingEnd:
                // The buffering is complete.
                break;
            case AVPEventSeekEnd:
                // The seeking is complete.
                break;
            case AVPEventLoopingStart:
                // The loop playback starts.
                break;
            default:
                break;
        }
    }
    /**
     @brief The callback for the current playback position.
     @param player The pointer of the player.
     @param position The current playback position.
     */
    - (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Updates the playback progress.
    }
    /**
     @brief The callback for the buffer position.
     @param player The pointer of the player.
     @ param position The current buffer position.
     */
    - (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
        // Updates the buffering progress.
    }
    /**
     @ brief The callback for obtaining the track information.
     @param player The pointer of the player.
     @param info The array of track information. For more information, see AVPTrackInfo.
     */
    - (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // Obtains information about different bitrates.
    }
    /**
     @brief The callback for displaying the subtitle.
     @param player The pointer of the player.
     @param index The index number for the subtitle.
     @param subtitle The string of the subtitle.
     */
    - (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
        // Obtains the subtitle for display.
    }
    /**
     @brief The callback for hiding the subtitle.
     @param player The pointer of the player.
     @param index The index number of the subtitle.
     */
    - (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
        // Hides the subtitles.
    }
    /**
     @brief The callback for snapshot capture.
     @param player The pointer of the player.
     @param image The image.
     */
    - (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
        // Previews and saves the snapshot.
    }
    /**
     @brief track The callback that indicates the track is switched.
     @param player The pointer of the player.
     @param info The information about the track after the switching is complete. For more information, see AVPTrackInfo.
     */
    - (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
        // Notifies the result of track switching.
    }
    //...
  3. プリロードするビデオの数を指定します。

    ビジネス要件に基づいて、プリロードするビデオの数を指定できます。 このようにして、起動時間を短縮することができます。 サンプルコード:

    // Specify the number of videos that you want to preload. The total number of loaded videos is equal to one plus twice the specified number. 
    self.listplyer.preloadCount = 2;
  4. 複数の再生ソースを追加または削除します。

    リスト再生は、VidStsおよびUrlSource再生ソースをサポートします。 Urlは、再生URLを示す。 vidはオーディオまたはビデオIDを示します。 例:

    • Url: 再生URLは、ApsaraVideo VODまたはサードパーティのビデオオンデマンド (VOD) プラットフォームのオーディオファイルまたはビデオファイルのURLにすることができます。

      GetPlayInfo操作を呼び出して、ApsaraVideo VODのオーディオまたはビデオファイルの再生URLを取得できます。 ApsaraVideo VOD SDKを使用してメディア再生URLを取得することを推奨します。 これにより、複雑な署名計算から解放されます。 GetPlayInfo操作の詳細については、 「OpenAPI Explorer」をご参照ください。

    • Vid: オーディオまたはビデオID。 IDを取得するには、ApsaraVideo VODコンソールにログインし、左側のナビゲーションウィンドウで [メディアファイル]> [オーディオ /ビデオ] を選択します。 または、SearchMedia操作を呼び出すこともできます。

    // Add a Vid playback source.
    [self.listPlayer addVidSource:videoId uid:UUIDString];
    // Add a UrlSource playback source.
    [self.listPlayer addUrlSource:URL uid:UUIDString];
    // Remove a playback source.
    [self.listPlayer removeSource:UUIDString];
    説明
    • VidAuthはリスト再生ではサポートされません。

    • uidパラメーターは、ビデオの一意のIDを指定するために使用されます。 一意のIDを使用してビデオを識別できます。 同じ一意のIDを持つビデオは同じと見なされます。 プレーヤーが指定したビデオ以外のビデオを再生する場合は、複数のビデオに一意のIDを指定しているかどうかを確認します。 一意のIDを任意の文字列に設定できます。

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

    再生ソースにビデオ画像が含まれている場合は、プレーヤーにビデオ画像を表示するようにUIビューを設定する必要があります。 サンプルコード:

    self.listPlayer.playerView = self.simplePlayScrollView.playView;
  6. ビデオソースを再生します。

    1つ以上の再生ソースを追加した後、moveToを呼び出して、指定した再生ソースからコンテンツを再生します。 サンプルコード:

    // Call moveTo for UrlSource playback sources.
    - (BOOL) moveTo:(NSString*)uid;
    // Call moveTo for VidSts playback sources. If you want to use VidSts playback sources, you must obtain the STS token and AccessKey pair in advance. For more information, see Create a RAM role and grant temporary access permissions to the role by using STS. 
    - (BOOL) moveTo:(NSString*)uid accId:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
  7. リスト内の前または次のビデオを再生します。

    moveToを呼び出してビデオを再生した後、moveToPrevを呼び出して前のビデオを再生するか、moveToNextを呼び出して次のビデオを再生します。 サンプルコード:

    説明

    movetoまたはmoveToNextを呼び出して同じビューでビデオソースを切り替えると、画像が点滅し、画面が黒くなります。 この場合、listPlayerを呼び出してプレーヤーを初期化するときに、PlayerConfigclearShowWhenStopfalseに設定し、setConfigを呼び出して設定を適用することを推奨します。

    UrlSource

    // Play the next video. 
    - (BOOL) moveToNext;
    // Play the previous video. 
    - (BOOL) moveToPre;

    VidSts

    // Play the next video. 
    - (BOOL) moveToNext:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
    // Play the previous video. 
    - (BOOL) moveToPre:(NSString*)accId accKey:(NSString*)accKey token:(NSString*)token region:(NSString*)region;
  8. (オプション) プレレンダリング機能を有効にして、スムーズなビデオ切り替えを実現します。

    説明

    プリレンダリング機能は、ApsaraVideo Player SDK for iOS V5.5.2.0以降でのみサポートされています。 この機能を使用するには、ローカルキャッシュを有効にする必要があります。 詳細については、「ローカルキャッシュの設定」をご参照ください。

    getPreRenderPlayerおよびmoveToNextWithPrerendered操作は、ビデオ切り替えのスムーズさを向上させるために、ApsaraVideo Player SDK for iOS V5.5.2.0以降で提供されています。 次のセクションでは、さまざまなバージョンのApsaraVideo Player SDK for iOSを統合する際の操作の使用方法について説明します。

    ApsaraVideo Player SDK for iOS V5.5.2.0以降の統合

    getPreRenderPlayerを使用します。 サンプルコード:

    AliPlayer *prePlayer = [self.listPlayer getPreRenderPlayer];
    if (prePlayer != nil) {
        prePlayer.autoPlay = YES;
            prePlayer.playerView  = playerView;
            [prePlayer prepare];
    
      [self.listPlayer moveToNextWithPrerendered];
    }

    ApsaraVideo Player SDK for iOSが以前のバージョンからV5.5.2.0以降に更新されました

    以前のバージョンのApsaraVideo Player SDK for iOSでコードを変更する必要があります。 次のセクションでは、コードを変更する方法について説明します。

    1. レンダリングビューを作成します。

      • UIScrollViewを使用してレンダリングビューを管理する場合は、再生ソースごとにplayerViewを構成する必要があります。 次に、moveToNextとmoveToPreを呼び出すときにplayerViewを指定します。

      • UITableViewを使用してレンダリングビューを管理する場合は、ビジネス要件に基づいてセルを作成し、各セルにplayerViewを設定することをお勧めします。

    2. ビデオソースを切り替えるロジックを変更します。

      iOS V5.5.2.0以降のApsaraVideo Player SDKでは、preRenderPlayerが追加されます。 playerViewには個別のロジックを設定する必要があります。 moveToNext操作のロジックは、moveToPre操作のロジックとは異なります。 サンプルコード:

      • moveToNext

        // Check whether prePlayer exists before you call moveToNext.
        AliPlayer *prePlayer = [self.listPlayer getPreRenderPlayer];
        if (prePlayer) {
            prePlayer.autoPlay = YES;
            prePlayer.playerView = playerView;
            [prePlayer prepare];
        } else {
            self.listPlayer.playerView = playerView;
        }
        
        if (prePlayer) {
        [self.listPlayer moveToNextWithPrerendered];
        } else {
        [self.listPlayer moveToNext];
        }
      • moveToPre

        // Configure playerView before you call moveToPre.
        [self.listPlayer getCurrentPlayer].playerView = playerView;
        [self.listPlayer moveToPre];
    3. オプション: プレイリスト再生のロジックを変更します。

      プレイリストの再生のロジックを変更して、次のビデオのビューの半分が表示されたときに、次のビデオの再生を開始することができます。 次のビデオのビューの半分が表示されたときに、UIScrollViewDelegateコールバックをリッスンして、次のビデオの再生を開始します。 次に、グローバルパラメーターcurrentIndexを設定して、ビデオの切り替え後にインデックスファイルを変更します。 サンプルコード:

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
      CGFloat offsetY = scrollView.contentOffset.y;
      if (offsetY < 0) {
      return;
      }
      
      NSInteger index = lroundf(offsetY/[UIScreen mainScreen].bundle.size.height);
      if (self.currentIndex != index) {
      if (offsetY - CGRectGetMinY(currentPlayView.frame) >= [UIScreen mainScreen].bundle.size.height / 2.0) {
      self.currentIndex = index;
      // Call moveToNext.
      } else if (CGRectGetMinY(currentPlayView.frame) - offsetY >= [UIScreen mainScreen].bundle.size.height / 2.0) {
      self.currentIndex = index;
      // Call moveToPre.
      }
      }
      }

透明度設定のビデオを再生する

説明

ApsaraVideo Player SDKは、アルファチャンネルを使用した動画のレンダリングをサポートし、背景が透明な動的ギフト動画を再生します。 このようにして、誰かがストリーミングしているときにライブビデオコンテンツをブロックすることなく、ギフトの動的効果を表示できます。 これにより、視聴とインタラクティブな体験が大幅に向上します。

制限事項

ApsaraVideo MediaBox SDK V6.8.0以降およびApsaraVideo Player SDK V6.9.0以降を使用して、ビデオを透明にレンダリングできます。

メリット

透明度のあるMP4ビデオをギフト効果として使用できます。 これにより、動的エフェクトとビデオ互換性のパフォーマンスが向上し、ビデオサイズが縮小され、開発が簡素化されます。 これはまた、ギフト効果の視聴体験を最適化し、ユーザ体験を改善します。 透明度のあるMP4ビデオをギフト効果として使用すると、次の利点があります。

  1. より高いビデオ品質: MP4ビデオを使用して、元の画像の詳細や色など、元の品質で動的なギフト効果を表示できます。 APNやIXDなどの他のビデオフォーマットと比較して、MP4はデザイナーが意図した元の品質で動的効果を表示できます。

  2. ビデオサイズが小さい: APNGやIXDなどの他のビデオフォーマットと比較して、MP4はより効率的な方法でファイルサイズを縮小します。 これにより、負荷が加速され、ネットワーク帯域幅の消費が削減されます。

  3. より良い互换性: MP4は、さまざまなデバイスやブラウザで広くサポートされている一般的なビデオフォーマットです。 主流のデバイスでギフトエフェクトとして使用されるMP4ビデオを再生できます。

  4. 開発効率の向上: MP4ビデオをギフト効果として使用するソリューションには、簡単な開発が必要です。 複雑な解析およびレンダリングロジックを研究および開発する代わりに、開発者は他の機能の実装に集中して開発効率を向上させることができます。

サンプルコード

setAlphaRenderMode操作が追加されました。 この操作では、ビデオ素材のアルファチャンネルの位置を指定します。 たとえば、ビデオ素材の上部、下部、左側、または右側にアルファチャンネルを配置できます。 デフォルトでは、値はNoneに設定されています。

説明
  • マテリアルのアルファチャンネルの位置は、setAlphaRenderMode操作を呼び出すときに指定した位置と同じである必要があります。

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

/**
 @brief The rendering mode of the alpha channel. You can place the alpha channel at the top, bottom, left side, or right side of the video material. By default, the value is set to None.
 @see AVPAlphaRenderMode
 */
/****
 @brief Set a rendering mode. Support alpha at right, left, top and bottom. Default value is none.
 @see AVPAlphaRenderMode
 */
@property(nonatomic) AVPAlphaRenderMode alphaRenderMode;
//--------------Configure the view-------------
// Specify clearColor for the view.
@property (weak, nonatomic) IBOutlet UIView *mediaPlayerView;
[self.aliplayerview setBackgroundColor:UIColor.clearColor];

//-----------Configure AliPlayer-----------
// Set the alpha mode.
[self.aliplayer setAlphaRenderMode:AVP_RENDERMODE_ALPHA_AT_LEFT];
// Specify the material that corresponds to the alpha mode.
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.aliplayer setUrlSource:source];

// Optional. If a connection error occurs when the playback of videos in a player instance is complete, you can clear the view.
#pragma mark -- AVPDelegate
- (void)onPlayerEvent:(AliPlayer *)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventCompletion:
        {
            [player clearScreen];
        }
            break;
        //...
    }
}

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

レンダリングにMetalフレームワークを使用する

ApsaraVideo Player SDK for iOSでは、Metalフレームワークを使用してビデオをレンダリングできます。

説明

Metalフレームワークを使用して、背景色、スケーリングモード、およびピクチャーインピクチャー (PiP) 機能を設定できます。

サンプルコード

/**
 @ brief The video rendering type. 0 specifies the default renderer and 1 specifies the mixed renderer. Default value: 0.
 */
/****
 @brief video renderType, 0 means default render; 1 means mixed render.
 */
@property(nonatomic, assign) int videoRenderType;

AVPConfig *config = [self.player getConfig];
// Use the Metal framework to render videos.
config.videoRenderType = 1;
[self.player setConfig:config];
[self.player prepare];

外部字幕の設定

ApsaraVideo Player SDK for iOSでは、SubRip字幕 (SRT) 形式、SubStation Alpha (SSA) 形式、Advanced SubStation Alpha (ASS) 形式、またはWeb Video Text Track (WebVTT) 形式の外部字幕を追加、オン、オフにすることができます。 サンプルコード:

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

    異なる形式の字幕に対して異なるビューを作成する必要があります。

    // Initialize the custom subTitleLabel view.
    UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame];
    // Add the subTitleLabel view to a custom superView, which is the parent view of the custom user interface.
    [superView addSubview:subTitleLabel];
  2. 字幕のリスナーを設定します。

    // The callback is invoked when an external subtitle is added.
    - (void)onSubtitleExtAdded:(AliPlayer*)player trackIndex:(int)trackIndex URL:(NSString *)URL {}
    // The callback is invoked when the subtitle header information is obtained.
    - (void)onSubtitleHeader:(AliPlayer *)player trackIndex:(int)trackIndex Header:(NSString *)header{}
    // The callback is invoked when the subtitle is displayed.
    - (void)onSubtitleShow:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID subtitle:(NSString *)subtitle {
     subTitleLabel.text =subtitle;
     subTitleLabel.tag =subtitleID;
    }
    // The callback is invoked when the subtitle is hid.
    - (void)onSubtitleHide:(AliPlayer*)player trackIndex:(int)trackIndex subtitleID:(long)subtitleID{
      [subTitleLabel removeFromSuperview];
    }
  3. 字幕を追加します。

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

    [self.player selectExtSubtitle:trackIndexenable:YES];

オーディオのみの再生を有効にする

ビデオ画像の表示を無効にして、オーディオのみの再生を有効にすることができます。 prepareメソッドを呼び出す前に、PlayerConfigクラスを設定します。

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

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

ApsaraVideo Player SDK for iOSは、H.264標準およびH.265標準に基づくハードウェアデコードをサポートしています。 enableHardwareDecoderを呼び出して、ハードウェアデコード機能を有効または無効にすることができます。 デフォルトでは、ハードウェアデコードが有効になっています。 ハードウェアデコードの初期化に失敗した場合、ソフトウェアデコードが自動的に使用されてビデオ再生が保証されます。 サンプルコード:

// Enable hardware decoding. By default, hardware decoding is enabled.
self.player.enableHardwareDecoder = YES;

ハードウェアのデコードをソフトウェアのデコードに切り替えると、onPlayerEventコールバックが呼び出されます。 サンプルコード:

-(void)onPlayerEvent:(AliPlayer*)player eventWithString:(AVPEventWithString)eventWithString description:(NSString *)description {
    if (eventWithString == EVENT_SWITCH_TO_SOFTWARE_DECODER) {
        // Switch to software decoding.
    }
}

H.265アダプティブ再生

セカンダリH.264ストリームを設定し、H.265ストリームのハードウェアデコードに失敗すると、システムは自動的にセカンダリH.264ストリームを再生します。 セカンダリストリームを設定しない場合、ハードウェアのデコードが失敗すると、ソフトデコードがH.265再生に自動的に使用されます。

説明
  • この機能は、アダプティブ再生を有効にした後にのみ使用できます。 アダプティブ再生は付加価値サービスです。 付加価値サービスを有効にするには、Yidaでリクエストを送信してください

  • アダプティブプレイバックサービスは、ハードウェアデコードされたデータの動的データ発行とH.264の自動切り替えの機能を提供します。

  • アダプティブ再生サービスを有効にしない場合でも、ハードウェアのデコードに失敗しても、プレーヤーSDKはソフトウェアのデコードを自動的に使用できます。

次のサンプルコードでは、セカンダリストリームを設定する方法について説明します。

// Create a map on the application layer to store the primary stream URLs and secondary stream URLs as key-value pairs. The system queries the corresponding secondary URL based on the primary stream URL during switching.
NSString* getBackupUrlCallback(AVPBizScene scene, AVPCodecType codecType, NSString* oriurl){
    NSMutableDictionary *globalMap = [AliPlayerViewController getGlobalBackupUrlMap];
    NSString *backupUrl = globalMap[oriurl];
    return backupUrl; 
}

[AliPlayerGlobalSettings setAdaptiveDecoderGetBackupURLCallback:getBackupUrlCallback];

適応ビットレートストリーミング

説明
  • ApsaraVideo VODトランスコードテンプレートグループを使用して、ビデオをHTTP Live Streaming (HLS) アダプティブビットレートストリームにトランスコードできます。 詳細については、「ApsaraVideo VODでのアダプティブビットレートストリーミングの実装」をご参照ください。

  • ApsaraVideo VODによってトランスコードされるアダプティブビットレートストリームにVidベースの再生を使用する場合、デフォルトの再生定義としてAUTOを指定する必要があります。 このようにして、プレーヤーは適応ビットレートストリームを取得して再生できます。 デフォルトの再生定義としてAUTOを指定しない場合、プレーヤーは自動的にビデオストリームを低解像度で再生します。 ビデオ定義に基づく再生順序の詳細については、「ビデオ解像度に関するよくある質問」をご参照ください。 次のサンプルコードは、VidAuthベースの再生の既定の再生定義を指定する方法の例を示しています。

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

ApsaraVideo Player SDK for iOSは、HLSビデオストリームおよびDynamic adaptive streaming over HTTP (DASH) ビデオストリームのアダプティブビットレートストリーミングをサポートしています。 prepareメソッドが呼び出された後、getMediaInfoを呼び出して、TrackInfoで示されるビットレート情報を取得します。 サンプルコード:

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

再生中に、selectTrackメソッドを呼び出して、必要なビットレートに切り替えることができます。 メソッドでSELECT_AVPTRACK_TYPE_VIDEO_AUTOを指定すると、適応ビットレートストリーミングが有効になります。 サンプルコード:

// Switch to the required bitrate.
[self.player selectTrack:track.trackIndex];
// Enable adaptive bitrate streaming.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];

onTrackChangedコールバックは、切り替え結果を返します。 サンプルコード:

// Switch to the required bitrate.
[self.player selectTrack:track.trackIndex];
// Enable adaptive bitrate streaming.
[self.player selectTrack:SELECT_AVPTRACK_TYPE_VIDEO_AUTO];

スナップショットジョブの管理

ApsaraVideo Player SDK for iOSは、ビデオからスナップショットをキャプチャできるsnapshotメソッドを提供します。 スナップショットをキャプチャすると、プレーヤーはキャプチャするビデオイメージのソースデータを保存し、ソースデータをビットマップに変換します。 スナップショットがキャプチャされたら、onCaptureScreenコールバックを呼び出してビットマップを取得できます。 サンプルコード:

// Configure the callback for snapshot capture.
- (void)onCaptureScreen:(AliPlayer *)player image:(UIImage *)image {
    // Process the snapshot.
}
// Capture a snapshot of the current video image.
aliyunVodPlayer.snapshot();
説明

スナップショットにはUIが含まれていません。

ビデオプレビューの設定

ApsaraVideo Player SDK for iOSは、ApsaraVideo VODの特定の設定を統合して、ビデオのプレビューをサポートします。 VidStsソースとVidAuthソースのみをプレビューできます。 ApsaraVideo VODでVidAuthソースのみをプレビューすることを推奨します。 プレビュー機能を設定および使用する方法の詳細については、「プレビュー機能の設定」をご参照ください。

プレビュー機能を有効にした後、VidPlayerConfigGenクラスでsetPreviewTimeを呼び出して、プレビュー期間を指定できます。 次のサンプルコードでは、VidStsベースの例を示します。

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
....
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setPreviewTime:20];// Set the preview duration to 20s.
source.playConfig = [vp generatePlayerConfig];// Configure the settings for the player.
...

プレビュー期間を指定すると、ApsaraVideo Player SDK for iOSでは、ビデオ全体ではなく、指定された期間のビデオをプレビューできます。

説明

VidPlayerConfigGenを使用して、サーバーでサポートされているリクエストパラメーターを設定できます。 詳細は、「リクエストパラメーター」をご参照ください。

リファラーの設定

ApsaraVideo Player SDK for iOSには、リクエストリファラーを設定するためのAVPConfigクラスが用意されています。 ApsaraVideo VODコンソールで設定されたリファラーホワイトリストまたはブラックリストと一緒にリファラーを使用して、アクセス制御を実装できます。 サンプルコード:

// Obtain the configuration information.
AVPConfig *config = [self.player getConfig];
// Set the referer.
config.referer = referer;
....// Configure other settings.
// Configure the settings for the player.
[self.player setConfig:config];

ユーザーエージェントの指定

ApsaraVideo Player SDK for iOSには、User-Agentヘッダーを指定できるAVPConfigクラスが用意されています。 User-Agentヘッダーを指定すると、リクエストにユーザーエージェント情報が含まれます。 サンプルコード:

// Obtain the configuration information.
AVPConfig *config = [self.player getConfig];
// Specify the User-Agent header.
config.userAgent = userAgent;
....// Configure other settings.
// Configure the settings for the player.
[self.player setConfig:config];

ネットワークのタイムアウト時間とリトライ回数の指定

ApsaraVideo Player SDK for iOSには、ネットワークタイムアウト期間とリトライ回数を指定するためのAVPConfigクラスが用意されています。 サンプルコード:

// Obtain the configuration information.
AVPConfig *config = [self.player getConfig];
// Set the network timeout period. Unit: milliseconds.
config.networkTimeout = 5000;
// Specify the maximum number of retries that can be performed after a network timeout occurs. The retry interval is equal to the timeout period that is specified for the NetworkTimeout parameter. The NetworkRetryCount parameter specifies the number of retries. A value of 0 indicates no retry. The application determines the number of retries. Default value: 2.
config.networkRetryCount = 2;
....// Configure other settings.
// Configure the settings for the player.
[self.player setConfig:config];
説明
  • networkRetryCountパラメーターを0以外の値に設定した場合、ネットワークエラーによりプレーヤーがデータの読み込みを開始したときに、プレーヤーは再生を再試行します。 再試行の最大数は、networkRetryCountパラメーターの値に等しくなります。 再試行間隔は、networkTimeoutパラメーターの値に等しくなります。

  • 再試行の最大数に達しても読み込みが続く場合、onErrorメソッドによってコールバックが呼び出されます。 この場合、AVPErrrorModel. codeに対してERROR_LOADING_TIMEOUTが返されます。

  • networkRetryCountパラメーターを0に設定すると、ネットワークタイムアウトが発生すると、onPlayerEventメソッドによってコールバックが呼び出されます。 この場合、eventWithStringに対してEVENT_PLAYER_NETWORK_RETRYが返されます。 この問題を解決するには、ApsaraVideo Player SDK for iOSのreloadメソッドを呼び出して、ネットワークパケットをリロードしたり、必要に応じて他の操作を実行したりできます。

バッファとレイテンシを制御します。

バッファ制御は、プレーヤーにとって重要です。 適切な設定を使用することで、スタートアップの読み込み時間を短縮し、再生のスムーズさを向上できます。 ApsaraVideo Player SDK for iOSには、バッファーとレイテンシの設定を行うためのAVPConfigクラスが用意されています。 サンプルコード:

// Query the configuration information.
AVPConfig *config = [self.player getConfig];
// Specify the maximum latency. Note: This parameter is valid only for live streaming. If the latency exceeds the maximum limit, ApsaraVideo Player SDK synchronizes frames to ensure that the latency does not exceed the limit. 
config.maxDelayTime = 5000;
// Specify the maximum buffer duration. Unit: milliseconds. This parameter specifies the maximum buffer duration for the player to load data at a time. 
config.maxBufferDuration = 50000;
// Specify the peak buffer duration. Unit: milliseconds. This parameter specifies the peak buffer duration. After the peak buffer duration elapses, the player stops loading data if the network conditions are poor. 
config.highBufferDuration = 3000;
// Set the startup buffer duration Unit: milliseconds. A smaller value indicates a shorter startup loading duration. In this case, the player may enter the loading status soon after the playback starts. 
config.startBufferDuration = 500;
// Configure other settings.
// Configure the settings for the player.
[self.player setConfig:config];
重要
  • startBufferDurationパラメーターの値がhighBufferDurationパラメーターの値より大きくないことを確認してください。 highBufferDurationパラメーターの値がmaxBufferDurationパラメーターの値より大きくないことを確認してください。

  • mMaxBufferDurationが5分を超える場合、ピークバッファ期間は5分に設定され、過剰なバッファサイズによるメモリ例外の発生を防ぎます。 mMaxBufferDurationが50,000 ms (50秒) を超える場合、大容量キャッシュを有効にしてメモリ使用量を減らし、再生パフォーマンスを向上させることができます。 詳細については、「ラージキャッシュの設定」をご参照ください。

HTTP ヘッダーの設定

ApsaraVideo Player SDK for iOSには、リクエストにHTTPヘッダーを追加できるAVPConfigクラスが用意されています。 サンプルコード:

// Obtain the configuration information.
AVPConfig *config = [self.player getConfig];
// Define a header.
NSMutableArray *httpHeaders = [[NSMutableArray alloc] init];
// Configure a host when you use Alibaba Cloud HTTPDNS. 
[httpHeaders addObject:@"Host:example.com"];
// Configure the headers.
config.httpHeaders = httpHeaders;
....// Configure other settings.
// Configure the settings for the player.
[self.player setConfig:config];

PiPの設定

説明
  • iOS 15以降を実行するデバイスでApsaraVideo Player V5.4.9.0以降を使用する場合にのみ、ピクチャインピクチャ (PiP) 機能を使用できます。

  • V5.5.2.0より前のバージョンのApsaraVideo Player SDK for iOSを使用して、特定のメソッドを呼び出してPiP機能を有効または無効にし、アプリケーションをバックグラウンドに切り替えたときにフローティングウィンドウでビデオを再生するかどうかを指定できます。 ApsaraVideo Player SDK for iOS V5.5.2.0以降は、PiP機能のデリゲート設定をサポートしています。 これにより、PiP機能のカスタム設定を構成できます。

  • PiP設定を有効にするには、iPhoneでPiP機能を有効にする必要があります。 PiP機能を有効にするには、[設定] > [一般] > [画像の中の画像] を選択します。

PiP機能の有効化

PiP機能が有効になった後、アプリケーションがバックグラウンドに切り替えられると、ビデオはフローティングウィンドウで再生されます。 アプリケーションがフォアグラウンドに切り替えられると、ビデオはアプリケーションウィンドウで再生されます。 setPictureInPictureEnableを呼び出して、PiP機能を有効にします。 PiP機能を有効にする前に、プレーヤーが準備されていることを確認してください。 AVPEventPrepareDoneは、プレイヤーが準備されていることを示します。 サンプルコード:

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

再生を停止する場合は、setPictureInPictureEnableを呼び出してPiP機能を無効にし、stopを呼び出します。

PiPデリゲートの設定

次のサンプルコードでは、PiPモードでビデオを一時停止、再生、早送り、早送り、再生する方法と、フローティングウィンドウとプレーヤービュー間のインタラクションの例を示します。 PiPデリゲートを設定する方法の詳細については、ApsaraVideo Player SDK For iOSのデモのディレクトリにあるAliyunPlayer.frameworkのヘッダーファイルAliPlayerPictureInPictureDelegate.hを参照してください。 デモのダウンロード方法の詳細については、「SDKの概要とダウンロード」をご参照ください。

  1. イベントコールバックを受け取るようにPiPデリゲートを設定します。

    [self.player setPictureinPictureDelegate:self];
  2. PiPデリゲートを設定します。

    1. プレイヤーのステータス変更を管理するグローバル変数を追加します。

      // Listen for the PiP pause event.
      @property (nonatomic, assign) BOOL isPipPaused;
      // Listen for newStatus to determine whether the playback status of the player is changed.
      @property (nonatomic, assign) AVPStatus currentPlayerStatus;
      // Configure the PiP controller in the callback that indicates the PiP feature is enabled. Set the controller to nil before you end the playback in PiP mode. We recommend that you configure the PiP controller.
      @property (nonatomic, weak) AVPictureInPictureController *pipController;
      // Listen for the playback progress event. Set currentPosition to the position that is returned in the callback of the current playback progress.
      @property(nonatomic, assign) int64_t currentPosition;
      説明

      pipControllerにはweakまたはassign修飾子を使用する必要があります。 assign修飾子を使用する場合は、必ず正しい変数をnullに設定してください。

    2. onPlayerStatusChangedイベントをリッスンするときに、PiPコントローラのステータスを更新します。

      - (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
          self.currentPlayerStatus = newStatus;
      
        if (_pipController) {
           [self.pipController invalidatePlaybackState];
         }
      }
    3. onPlayerEventイベントをリッスンするときに、PiPコントローラのステータスを更新します。

      - (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
          if (eventType == AVPEventCompletion) {
            if (_pipController) {
             self.isPipPaused = YES; // Pause the playback in PiP mode after the playback ends.
             [self.pipController invalidatePlaybackState];
          }
        } else if (eventType == AVPEventSeekEnd) {
          // The seeking is complete.
            if (_pipController) {
             [self.pipController invalidatePlaybackState];
          }
        }
      }
    4. リスナーを設定します。

      • PiPモードでの再生が開始されようとしているときに返されるコールバックをリッスンします。

        /**
         @ brief The callback returned when the playback in PiP mode starts.
         @param pictureInPictureController indicates the PiP controller.
         */
        - (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            if (!_pipController) {
             self.pipController = pictureInPictureController;
          }
            self.isPipPaused = !(self.currentPlayerStatus == AVPStatusStarted);
          [pictureInPictureController invalidatePlaybackState];
        }
      • PiPモードでの再生が停止しようとしているときに返されるコールバックをリッスンします。

        /**
         @ brief The callback returned when the playback in PiP mode is about to stop.
         @param pictureInPictureController indicates the PiP controller.
         */
        - (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController {
            self.isPipPaused = NO;
          [pictureInPictureController invalidatePlaybackState];
        }
      • PiPモードでの再生が停止した後に返されるコールバックをリッスンし、デリゲートを使用してプレーヤーUIを有効にします。

        /**
         @ brief The callback returned after the playback in PiP mode stops.
         @param pictureInPictureController indicates the PiP controller.
         @ param Set completionHandler to YES to stop playback in PiP mode and enable the player UI.
         */
        - (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler {
            if (_pipController) {
              _pipController = nil;
          }
          completionHandler(YES);
        }
      • PiPモードで再生できるビデオの期間制限のコールバックを聞きます。

        /**
         @ brief The callback of the duration limits of videos that can be played in PiP mode.
         @param pictureInPictureController indicates the PiP controller.
         @ return The duration limits of videos that can be played in PiP mode.
         */
         - (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 The callback returned when the status of playback in PiP mode is changed. The UI changes when the playback status changes.
         @param pictureInPictureController indicates the PiP controller.
         @ return The playback status in PiP mode.
         */
        - (BOOL)pictureInPictureControllerIsPlaybackPaused:(nonnull AVPictureInPictureController *)pictureInPictureController{
            return self.isPipPaused;
        }
        説明

        このコールバックは、ビデオがPiPモードに入る前に呼び出されます。 コールバックでfalseが返された場合にのみ、ビデオはPiPモードになります。

      • PiPモードでの再生中に早送りまたは早戻し操作が実行されたときに返されるコールバックをリッスンし、再生の進行状況をプレーヤーに同期させます。

        /**
         @ brief The callback returned when a fast forward or fast backward operation is performed during playback in PiP mode.
         @param pictureInPictureController indicates the PiP controller.
         @ param skipInterval indicates the interval by which the video is skipped forward or backward.
         @ param Call completionHandler to end the fast forward or fast backward operation.
         */
         - (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 The callback that is returned when the playback in PiP mode is paused or started.
         @param pictureInPictureController indicates the PiP controller.
         @ param playing indicates whether the video is being played in PiP mode.
         */
        - (void)pictureInPictureController:(nonnull AVPictureInPictureController *)pictureInPictureController setPlaying:(BOOL)playing {
            if (!playing){
              [self.player pause];
              self.isPipPaused = YES;
            } else {
              // If you want to replay a video after the playback ends, run the following code that starts with if.
              if (self.currentPlayerStatus == AVPStatusCompletion) {
                 [self.player seekToTime:0 seekMode:AVP_SEEKMODE_ACCURATE];
              }
        
              [self.player start];
              self.isPipPaused = NO;
          }
          [pictureInPictureController invalidatePlaybackState];
        }

代替RTS URLの設定

再生劣化は、リアルタイムストリーミング (RTS) によってサポートされる。 HLSまたはFLV形式の再生URLなど、代替のRTS URLを指定できます。 RTS経由のストリームプルが失敗すると、このURLで指定されたビデオが自動的に再生されます。

// Specify downgradeUrl.
AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:downgradeUrl];
// Optional. Configure playback degradation.
AVPConfig *config = [self.player getConfig];
// Specify an alternative RTS URL.
[self.player enableDowngrade:urlSource config:config];

RTS再生の劣化を有効にする

RTS再生劣化機能を有効にしても、ブラウザがRTSをサポートしていない場合、またはRTSを介したストリームのプルが失敗した場合、システムはデフォルトのHLS URLを使用してストリームを自動的に再生します。 サンプルコード:

// 1 indicates that the RTS playback degradation feature is enabled and 0 indicates that the RTS playback degradation feature is disabled. Hardware decoding is enabled by default.
[AliPlayerGlobalSettings setOption:ALLOW_PRE_RENDER valueInt:1];

左右のオーディオチャンネルを切り替える

outputAudioChannelは、出力オーディオチャネルを指定します。 入力ファイルに2つのオーディオチャンネルが含まれている場合にのみ、左右のオーディオチャンネルを切り替えることができます。 入力ファイルにオーディオチャネルが1つしか含まれていない場合、outputAudioChannel設定は無効です。

説明

次の出力オーディオチャネル設定は、オーディオレンダリングとPCM (Pulse-Code Modulation) データコールバックに影響します。

// Specify AVPOutputAudioChannel to switch the audio channel. Default value: AVP_AUDIO_CHANNEL_NONE.
// Specify AVP_AUDIO_CHANNEL_NONE to use the audio channel settings of the input file.
// Specify AVP_AUDIO_CHANNEL_LEFT to use the left audio channel for playback.
// Specify AVP_AUDIO_CHANNEL_RIGHT to use the right audio channel for playback.
self.aliplayer.outputAudioChannel = AVP_AUDIO_CHANNEL_NONE;

プレーヤーの背景色を設定する

ApsaraVideo player SDK for iOSを使用すると、プレーヤーの背景色を設定できます。 次の内容は、プレーヤーの背景色を設定する方法とサンプルコードを示しています。

方法

/**
 @ brief Set the background color of the video.
 @param color  the color
 */
/****
 @brief Set video background color
 @param color  the color
 */
-(void) setVideoBackgroundColor:(UIColor *)color;

サンプルコード

// The value must be an 8-bit hexadecimal string, in which every 2 characters indicate a factor in the following sequence: R (red), G (green), B (blue), and A (alpha transparency).
// For example, 0x00ff00ff indicates green.
[aliPlayer setVideoBackgroundColor:0x00ff00ff]

vidAuthベースの再生のドメイン名の指定

再生にvidAuthを使用する場合は、ドメイン名などのパラメーターを指定できます。 パラメーターの詳細については、「GetPlayInfo」をご参照ください。 次のコンテンツでは、vidAuthベースの再生のドメイン名を指定する方法とサンプルコードを示します。

方法

/**
 @brief Play videos based on the VID and playAuth. For more information, visit https://www.alibabacloud.com/help/en/vod/user-guide/use-playback-credentials-to-play-videos.
 @param source The playback source type is AVPVidAuthSource.
 @see AVPVidAuthSource
 */
- (void)setAuthSource:(AVPVidAuthSource*)source;

サンプルコード

VidPlayerConfigGeneratorでaddVidPlayerConfigByStringValueを呼び出すときにplayDomainパラメーターを指定します。

VidPlayerConfigGenerator* gen = [[VidPlayerConfigGenerator alloc]init];
// Specify the playDomain parameter. For more information, visit https://www.alibabacloud.com/help/en/vod/developer-reference/api-vod-2017-03-21-getplayinfo.
//https://www.alibabacloud.com/help/zh/vod/developer-reference/api-vod-2017-03-21-getplayinfo
[gen addVidPlayerConfigByStringValue:@"playDomain" value: @"com.xxx.xxx"];
[source setPlayConfig:[gen generatePlayerConfig]];
[self.player setAuthSource:source]:

バックエンドデコード

バックエンドデコード機能は、ApsaraVideo Player SDK V6.12.0以降でサポートされています。 この機能を有効にすると、システムはビデオをデコードして再生し、バックエンドでコールバックを送信できます。 サンプルコード:

// 1 indicates that backend decoding is enabled and 0 indicates that backend decoding is not enabled. Default value: 0.
[self.player setOption:ALLOW_DECODE_BACKGROUND valueInt:1];

パフォーマンス

事前レンダリングの設定

ApsaraVideo Player SDK for iOSは、再生開始前の最初のフレームのプリレンダリングをサポートしています。 サンプルコード:

[player setOption:ALLOW_PRE_RENDER valueInt:1];

ローカルキャッシュの設定

ApsaraVideo Player SDK for iOSを使用すると、再生中にビデオをキャッシュできます。 これにより、起動時間が短縮され、シークプロセスが高速化され、再生待ち時間が短縮され、ループ再生中のトラフィックが節約されます。

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

デフォルトでは、ビデオプリロード機能は無効になっています。 この機能を使用するには、有効にする必要があります。 AliPlayerGlobalSettingsクラスでenableLocalCacheを呼び出して、ローカルキャッシュを有効にします。 サンプルコード:

/**
 * Enable local caching. After this feature is enabled, a media file is cached on your device. 
 * @param enable: specifies whether to enable the video preload feature. Valid values: true and false. true indicates that the local caching feature is enabled and false indicates that the local caching feature is disabled. Default value: false. 
 * @param maxBufferMemoryKB: This parameter is deprecated in V5.4.7.1 and later. 
 * @param localCacheDir: Required. The directory of the cached file, which is an absolute path. 
 */
[AliPlayerGlobalSettings enableLocalCache:true maxBufferMemoryKB:1024 localCacheDir:@""];

/**
 @brief Configure settings for clearing cached files. 
 @ param expireMin: This parameter is deprecated in V5.4.7.1 and later. 
 @param maxCapacityMB: the maximum cache size. Unit: MB. By default, the maximum size of cached data is 20 GB. If the specified maximum size is exceeded, the system deletes cached files based on the point in time when the file is cached until the size of the cached data is less than or equal to the specified maximum size. During this process, the system preferentially deletes the earliest files that are cached. 
 @param freeStorageMB: the minimum idle space of the disk. Unit: MB. Default value: 0. If the idle space of the disk is less than the specified minimum space, the system deletes cached files based on the point in time when the file is cached until the idle space of the disk is greater than or equal to the specified minimum space. During this process, the system preferentially deletes the earliest files that are cached. 
 */
[AliPlayerGlobalSettings setCacheFileClearConfig:0 maxCapacityMB:0 freeStorageMB:0];

/**
 * Obtain the callback for the URL hash value of the video file and use it as the unique ID of the URL. 
 */

// You must run the function and set the function pointer to setCacheUrlHashCallback.
static NSString *CaheUrlHashHandle(NSString *url) {
    return @"xxx";
}

[AliPlayerGlobalSettings setCacheUrlHashCallback:&CaheUrlHashHandle];
説明
  • ビデオファイルの再生URLに認証パラメータが含まれている場合、認証パラメータの値は、ビデオファイルのローカルキャッシュおよび再生中に変更されます。 認証パラメーターを削除した後、setCacheUrlHashCallback操作を呼び出してMD5ハッシュ値を計算できます。 たとえば、http:// ****.mp4?aaaは、認証パラメーターを含むビデオファイルの再生URLです。 この場合、URL http:// ****.mp4は、ビデオファイルがロードされるときにMD5ハッシュ値を計算するために使用されます。 ただし、暗号化されたM3U8ビデオのキーURLの認証パラメーターを削除した後にMD5ハッシュ値を計算すると、同じキーURLが異なるビデオにヒットするため、再生は失敗します。 解決策: setCacheUrlHashCallbackコールバックのキーURL http(s):// yyyy?bbbbではなく、再生URL http(s):// xxxxx.m3u8?aaaaからのみ認証パラメーターを削除します。进阶功能-本地缓存.png

  • サーバーがHTTPとHTTPSをサポートしており、同じ要素で異なるプロトコルの2つのURLを使用してビデオファイルを指定できる場合は、URLのプロトコルヘッダーを削除するか、HTTPプロトコルのURLを使用してMD5ハッシュ値を計算できます。 例:

    • ビデオファイルの再生URLがhttps:// ****.mp4およびhttp:// ****.mp4の場合、MD5ハッシュ値は、ビデオファイルのロード時に ****.mp4を使用して計算されます。

    • ビデオファイルの再生URLがhttps:// ****.mp4の場合、MD5ハッシュ値は、ビデオファイルのロード時にURL http:// ****.mp4を使用して計算されます。

  • ApsaraVideo Player SDK V5.5.4.0以降の場合、再生URLに認証パラメーターが含まれているHLSストリームを再生する場合は、AVPConfig.enableStrictAuthModeを設定して認証モードを指定します。 デフォルトでは、AVPConfig.enableStrictAuthModeはfalseに設定されています。 AVPConfig.enableStrictAuthModeの有効値:

    • false: 認証情報をキャッシュします。 ビデオが完全にキャッシュされていない場合、プレーヤーは、キャッシュされていないビデオコンテンツを再生するときに、キャッシュされた認証情報を使用してURL署名リクエストを送信します。 署名付きURLの有効期間が短い場合、再生エラーが発生します。

    • true: 認証を実行し、ビデオコンテンツをキャッシュしません。 再生ごとにURL署名が必要です。 ネットワーク接続が再生の失敗につながることはありません。

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

player configでは、単一のURLのローカルキャッシングを無効にできます。サンプルコード:

// Obtain the configuration information.
AVPConfig *config = [self.player getConfig];
// Configure whether to enable local caching for the playback URL. Default value: true. When local caching is enabled in AliPlayerGlobalSettings and the value of this parameter is true, the local caching for the URL takes effect. If the value of this parameter is false, the local caching for the URL is disabled. 
config.enableLocalCache = false;
....// Configure other settings.

// Configure the settings for the player.
[self.player setConfig:config];

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

次のサンプルコードでは、デフォルトのキャッシュパスを使用するようにAliPlayerGlobalSettingsを設定する方法について説明します。

[AliPlayerGlobalSettings enableLocalCache:true];

大容量キャッシュの設定

再生中にビデオデータをメモリにキャッシュする最大バッファ時間を設定できます。これにより、再生パフォーマンスとエクスペリエンスが向上します。 最大バッファ持続時間が大きすぎると、バッファは過剰なメモリを消費する。 大容量キャッシュ機能を使用してファイル内のビデオをキャッシュできます。これにより、メモリ使用量が削減され、プレーヤーのパフォーマンスがさらに向上します。

mMaxBufferDurationが50,000ミリ秒を超える場合、ローカルキャッシュを有効にして、大きなキャッシュを自動的にトリガーできます。 以下の手順を実行します。

  1. グローバルローカルキャッシュ機能を有効にします。

    デフォルトでは、ビデオプリロード機能は無効になっています。 この機能を使用するには、有効にする必要があります。 AliPlayerGlobalSettingsクラスでenableLocalCacheを呼び出して、ローカルキャッシュを有効にします。 サンプルコードの詳細については、高度な機能ローカルキャッシュの有効化セクションを参照してください。

  2. URLのローカルキャッシュを有効にします。

    サンプルコードの詳細については、「ローカルキャッシュの設定」の「単一URLのローカルキャッシュの有効化または無効化」をご参照ください。

  3. 大容量キャッシュを有効にします。 サンプルコード:

    [AliPlayerGlobalSettings enableBufferToLocalCache:true];

ビデオプリロードの設定

ApsaraVideo Player SDK for iOSは、ローカルキャッシング機能のアップグレードであるビデオプリロードをサポートしています。 ビデオプリロード機能を使用すると、キャッシュされたビデオが占有できるメモリの最大サイズを指定できます。 これにより、起動時間を短縮できます。

ビデオのプリロード機能には、次の制限があります。

  • 一度にプリロードできるMP4、MP3、FLV、またはHLSファイルは1つだけです。

  • URLに基づいて再生されるファイルを1つだけプリロードできます。 VidAuthまたはVidStsソースをプリロードすることはできません。

説明

デフォルトでは、ApsaraVideo Player SDK for iOSを使用してビデオをプリロードすると、ネットワークリソースのスケジューリングが有効になります。 これにより、再生中のビデオの品質が保証されます。 ネットワークリソースのスケジューリングが有効になっている場合、プリロード要求は、再生されているビデオのバッファリングされたコンテンツが特定の制限に達した後にのみ送信されます。 リアルタイムのプリロードリクエストを管理する場合は、ネットワークリソースのスケジューリングを無効にできます。 サンプルコード:

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

  2. AliMediaLoaderインスタンスを取得します。

    AliMediaLoaderインスタンスはシングルトンオブジェクトです。 インスタンスの取得回数に関係なく、作成できるAliMediaLoaderインスタンスは1つだけです。

    [AliMediaLoader shareInstance];
  3. AliMediaLoaderインスタンスを設定します。

    説明

    prepare in playermediaLoader.loadを同時に呼び出すと、Application Not Responding (ANR) エラーが発生することがあります。 これは、システムが両方の操作ですべてのローカルファイルをトラバースする必要があるためです。 playeronPreparedコールバックが起動された後、読み込みを開始することを推奨します。

    // Configure listeners and start to load video files. 
    // url: the URL of the video file.  duration: the loading duration. Unit: milliseconds. 
    [[AliMediaLoader shareInstance] load:obj.url duration:1000];
    // Configure a callback delegate.
    [[AliMediaLoader shareInstance] setAliMediaLoaderStatusDelegate:self];
    
    @protocol AliMediaLoaderStatusDelegate <NSObject>
    @optional
    
    /**
     @brief The callback that is invoked when an error occurs.
     @ param url The URL.
     @param code The error code.
     @ param msg The error description.
     */
    - (void)onError:(NSString *)url code:(int64_t)code msg:(NSString *)msg;
    
    /**
     @ brief The callback that is invoked when the loading is complete.
     @ param url The URL.
     */
    - (void)onCompleted:(NSString *)url;
    
    /**
     @ brief The callback that is invoked when the loading is canceled.
     @ param url The URL.
     */
    - (void)onCanceled:(NSString *)url;
    
    @end
  4. オプション: ロードしたビデオファイルを削除します。

    ロードしたビデオファイルを削除して、占有スペースを減らすことができます。 ApsaraVideo Player SDK for iOSは、ロードしたビデオファイルを削除する方法を提供していません。 アプリケーションの対応するディレクトリにあるビデオファイルを削除する必要があります。

動的プリロード

動的プリロード機能を使用すると、再生中のビデオとプリロードされたビデオのキャッシュを管理できます。 プリロードできるビデオの数を制御することもできます。 これは、再生経験とコストのバランスを維持するのに役立ちます。

表示コード

// Enable the dynamic preloading feature and use the default configurations.
[self.listPlayer setScene:AVP_SHORT_VIDEO];

// Configure the baseline preload duration.
// Set the preload duration to 1,000 milliseconds.
AVPPreloadConfig *config = [[AVPPreloadConfig alloc] init];
config.preloadDuration = 1000;
[self.listPlayer updatePreloadConfig:config];

Configure the number of videos that can be preloaded. Forward and backward are supported.
// 1 specifies the number of videos that can be preloaded forwards and 3 specifies the number of videos that can be preloaded backwards.
[self.listPlayer setPreloadCount:1 nextCount:3];

// Configure the decreasing offset for dynamic preloading.
[self.listPlayer enableStrategy:AVP_STRATEGY_DYNAMIC_PRELOAD enable:true];
[self.listPlayer setStrategyParam:AVP_STRATEGY_DYNAMIC_PRELOAD strategyParam:@"{\"algorithm\": \"sub\",\"offset\": \"200\"}"];

マルチビットレートHLSビデオのプリロード

マルチビットレートのHLSビデオの再生中にlistPlayerメソッドを呼び出すと、現在のビデオストリームと同じ定義でビデオをプリロードできます。 ビジネス要件に基づいて、さまざまなプリロードモードを使用できます。

プリローディングモードの表示コード

typedef enum AVPMultiBitratesMode : NSUInteger {
    /**
     * The default bitrate for playback and preloading.
     */
    /****
     * default mode, play and preload default bitrate of a stream
     */
    AVPMultiBitratesMode_Default = 0,
    /**
     * The preloading mode in which the first frame performance has a higher priority. In this case, the preloaded video is played by default.
     */
    /****
     * First frame cost (FC) priority, decrease first frame cost. only play bitrate of the hls stream which has been preloaded.
     */
    AVPMultiBitratesMode_FCPrio = 1,
    /**
     * The preloading mode in which the first frame performance and playback smoothness have the same priority. In this case, the same bitrate is used before and after you call the moveToNext method to switch videos.
     */
    /****
     * First frame and play smooth, play the same bitrate before and after moveToNext
     */
    AVPMultiBitratesMode_FC_AND_SMOOTH = 2,
    /**
     * The preloading mode in which the playback smoothness has a higher priority. In this case, the bitrate of the last video is used by default.
     */
    /****
     * Play Smooth priority, play the same bitrate before and after moveToNext.
     */
    AVPMultiBitratesMode_SmoothPrio = 3,
} AVPMultiBitratesMode;

Show integration code

// Specify the multi-bitrate preloading mode.
[self.listPlayer->SetMultiBitratesMode(preLoadMode)];

// Optional. Set the starting bitrate.
[self.listPlayer setDefaultBandWidth:defaultBandWidth];

// Optional. In the onPrepared callback, specify the abr mode.
-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventPrepareDone: {
            [self.listPlayer selectTrack:-1];
        }
            break;
        case AVPEventFirstRenderedStart: {
        }
            break;
        default:
            break;
    }
}

ダウンロード速度の照会

ApsaraVideo Player SDK for iOSでは、指定したビデオのダウンロード速度を照会できます。 onCurrentDownloadSpeedメソッドによって呼び出されるコールバックは、ダウンロード速度を返します。 サンプルコード:

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

ネットワークの設定

HTTPDNS

HTTPDNS機能は、DNS解決テクノロジを使用して、特定のHTTPDNSサーバーにドメイン名解決要求を送信し、迅速かつ安定した方法で解決結果を取得します。 これにより、DNSハイジャックが防止されます。

ApsaraVideo Player SDKは、Alibaba Cloud CDNによって高速化されるドメイン名のHTTPDNSサービスを提供します。 強化されたHTTPDNS機能を使用して、正確なスケジューリングを実装し、リアルタイムドメイン解決の結果がすぐに有効になるようにすることができます。 これにより、ネットワークのパフォーマンスが向上します。

説明

拡張されたHTTPDNS機能は、ApsaraVideo Player SDK V6.7.0以降でサポートされています。 ApsaraVideo Player SDK V6.7.0 ~ V6.11.0で拡張HTTPDNS機能を使用するには、チケットを起票するか、Alibaba Cloudアカウントマネージャーに連絡します。 ApsaraVideo Player SDK V6.12.0以降を使用する場合、拡張HTTPDNS機能はデフォルトで有効になっており、アプリケーションは必要ありません。

強化されたHTTPDNS機能を使用するためのサンプルコード

強化されたHTTPDNS機能は、高速化ドメイン名にのみ使用できます。 この機能を使用する前に、高速化ドメイン名が追加および構成されていることを確認してください。 CDNのドメイン名をApsaraVideo VODに追加および設定する方法の詳細については、「CDNのドメイン名の追加」をご参照ください。 高速化ドメイン名の詳細については、「Alibaba Cloud CDNとは」をご参照ください。

// Enable the enhanced HTTPDNS feature.
[AliPlayerGlobalSettings enableEnhancedHttpDns:YES];
// Optional. Add an HTTPDNS pre-resolved domain name.
[[AliDomainProcessor shareInstance] addPreResolveDomain:@"player.***alicdn.com"];

HTTP/2

説明

デフォルトでは、ApsaraVideo Player SDK for iOS V5.5.0.0以降でHTTP/2が有効になっています。

ApsaraVideo Player SDK for iOSはHTTP/2をサポートしています。 HTTP/2を有効にして、リクエストの多重化を実装できます。 これにより、HOL (head-of-line) ブロッキングが防止され、再生性能が向上します。 サンプルコード:

[AliPlayerGlobalSettings setUseHttp2:true];

HTTPで再生リクエストを開始する前にTCP接続を作成

再生要求がHTTP経由で開始される前に、伝送制御プロトコル (TCP) 接続を作成できます。 これにより、待ち時間が短縮され、ビデオ再生の適時性と一貫性が保証され、ユーザーエクスペリエンスが向上し、ネットワークとシステムリソースの使用が最適化されます。 サンプルコード:

// Specify the domain parameter in the host[:port] format. Separate multiple domain names with semicolons (;). The port parameter is optional.
// Specify global settings.
// Add or delete TCP connections. If you specify an empty string, no TCP connections are created.
[AliPlayerGlobalSettings setOption:SET_PRE_CONNECT_DOMAIN value: @"domain1;domain2"];

ビデオダウンロードの設定

ApsaraVideo Player SDK for iOSを使用すると、オフラインで再生するためにビデオをローカルデバイスにダウンロードできます。 通常のダウンロードモードと安全なダウンロードモードがサポートされています。

  • 通常のダウンロード: 通常のダウンロードモードでダウンロードされた動画は、Alibaba Cloudによって暗号化されず、サードパーティのプレーヤーで再生できます。

  • 安全なダウンロード: 安全なダウンロードモードでダウンロードされた動画は、Alibaba Cloudによって暗号化されます。 サードパーティのプレーヤーを使用してダウンロードしたビデオを再生することはできません。 ApsaraVideo Playerのみを使用して再生できます。

使用上の注意

  • VidStsまたはVidAuthに基づいて再生されるビデオのみをダウンロードできます。

  • ビデオダウンロード機能を使用するには、ApsaraVideo VODコンソールでこの機能を有効にし、ダウンロードモードを設定する必要があります。 詳細については、「ダウンロード設定の構成」をご参照ください。

  • 再開可能なダウンロードがサポートされています。

手順

  1. (オプション) 暗号化検証用のセキュリティファイルを設定します。 安全なダウンロードモードを使用する場合にのみ、セキュリティファイルを設定する必要があります。

    説明

    暗号化検証用セキュリティファイルの情報がアプリケーション情報と一致していることを確認してください。 それ以外の場合、ビデオのダウンロードは失敗します。

    セキュアダウンロードモードを使用する場合、ApsaraVideo VODコンソールで生成されるキーファイルをApsaraVideo Player 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 {
        // The listener for the preparation of the content to be downloaded.
    }
    -(void)onError:(AliMediaDownloader *)downloader errorModel:(AVPErrorModel *)errorModel {
        // The listener for a download error.
    }
    -(void)onDownloadingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // The listener for the download progress in percentage.
    }
    -(void)onProcessingProgress:(AliMediaDownloader *)downloader percentage:(int)percent {
        // The listener for the processing progress in percentage.
    }
    -(void)onCompletion:(AliMediaDownloader *)downloader {
        // The listener for a successful download.
    }
  4. ダウンロードソースを準備します。

    prepareメソッドを呼び出して、ダウンロードソースを準備できます。 AVPVidStsSourceとAVPVidAuthSourceがサポートされています。 サンプルコード:

    • VidSts

      // Create the VidSts download source.
      AVPVidStsSource* stsSource = [[AVPVidStsSource alloc] init];
      stsSource.region = @"Access region"; // The region in which ApsaraVideo VOD is activated. Default value: cn-shanghai. 
      stsSource.vid = @"Video ID"; // The ID of the video. 
      stsSource.securityToken = @"<Your security token>"; // The STS token. To generate an STS token, call the AssumeRole operation in STS. 
      stsSource.accessKeySecret = @"<Your AccessKey secret>"; // The AccessKey secret that is generated when the temporary STS token is issued. To generate the AccessKey secret, call the AssumeRole operation in STS. 
      stsSource.accessKeyId = @"<Your AccessKey ID>"; // The AccessKey ID that is generated when the temporary STS token is issued. To generate the AccessKey ID, call the AssumeRole operation in STS. 
      // Prepare the download source.
      [downloader prepareWithVid:stsSource];
    • VidAuth

      // Add the VidAuth download source.
      AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
      authSource.vid = @"Video ID";// The ID of the video. 
      authSource.playAuth = @"<Your playback credential>"; // The playback credential. To obtain the playback credential, call the GetVideoPlayAuth operation in ApsaraVideo VOD. 
      authSource.region = @"Access region"; // This parameter is deprecated in ApsaraVideo Player SDK V5.5.5.0 or later. If you use ApsaraVideo Player SDK V5.5.5.0 or later, the player automatically parses the region information. If you use ApsaraVideo Player SDK V5.5.5.0 or earlier, this parameter is required. Specify the ID of the region in which ApsaraVideo VOD is activated for this parameter. Default value: cn-shanghai. 
      // Prepare the download source.
      [downloader prepareWithVid:authSource];
  5. 準備したダウンロードソースからダウンロードするコンテンツを選択します。

    ダウンロードソースが準備された後、onPreparedメソッドによってコールバックが呼び出されます。 TrackInfoパラメーターの値は、ビデオ定義などのビデオトラックに関する情報を示します。 ダウンロードするトラックを選択します。 サンプルコード:

    -(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info {
        NSArray<AVPTrackInfo*>* tracks = info.tracks;
        // In this example, download the content of the first track.
        [downloader selectTrack:[tracks objectAtIndex:0].trackIndex];
    }
  6. ダウンロードソースを更新し、ダウンロードを開始します。

    VidStsまたはVidAuthは、ダウンロード前に期限切れになる場合があります。 したがって、ダウンロードを開始する前にダウンロードソースを更新することをお勧めします。 サンプルコード:

    // Update the download source.
    [downloader updateWithVid:vidSource]
    // Start the download.
    [downloader start];
  7. ダウンロードが成功または失敗した後、ダウンローダーをリリースします。

    ダウンロードが成功したら、destroyメソッドを呼び出してダウンローダーをリリースします。

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

暗号化されたビデオを再生する

ApsaraVideo Player SDK for Androidでは、HLS暗号化、Alibaba Cloud独自の暗号化、またはデジタル著作権管理 (DRM) 暗号化に基づいて暗号化されたオンデマンドビデオを再生できます。 SDKを使用すると、DRM暗号化のみに基づいて暗号化されたライブストリームを再生できます。 暗号化ビデオの再生方法の詳細については、「暗号化ビデオの再生」をご参照ください。

ネイティブRTS SDKの設定

iOS用ApsaraVideo Player SDKをネイティブRTS SDKと統合して、リアルタイムストリーミング (RTS) 機能を使用できます。 詳細については、「ネイティブRTS SDK For iOS」をご参照ください。

関連ドキュメント