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

ApsaraVideo VOD:基本的な機能

最終更新日:Nov 21, 2025

このトピックでは、iOS プレーヤーインスタンスを作成する方法について説明し、音量設定、シーク再生の有効化、再生状態のリスニング、ループ再生の有効化、再生速度の設定、オーディオトラックの切り替えなどの基本的な再生機能の使用例を示します。

重要

デモを実行するには、ダウンロードしてコンパイルし、実行します。詳細については、「デモを実行する」をご参照ください。

再生ソース (DataSource) の設定

  • ApsaraVideo Player SDK for iOS は、ビデオオンデマンド (VOD) の 4 つの再生方法をサポートしています: VidAuth (ApsaraVideo VOD ユーザーに推奨)、VidSts、UrlSource、および暗号化再生。

  • ApsaraVideo Player SDK for iOS は、ライブストリーミングの 2 つの再生方法をサポートしています: UrlSource と暗号化再生。

VOD 再生

VidAuth を使用した VOD 再生 (推奨)

VidAuth を使用して VOD ビデオを再生するには、プレーヤーの vid プロパティをビデオ ID に設定し、playauth プロパティを再生認証情報に設定します。

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

  • 再生認証情報: GetVideoPlayAuth API 操作を呼び出すことで、再生認証情報を取得できます。ApsaraVideo VOD サーバーサイド SDK を統合して再生認証情報を取得することをお勧めします。これにより、リクエストに署名する必要がなくなります。この API 操作の呼び出し例については、「API Explorer」をご参照ください。

ApsaraVideo VOD ユーザーは、この再生方法を使用することをお勧めします。STS 方式と比較して、PlayAuth 方式はより安全で使いやすいです。詳細な比較については、「認証情報ベースの方式と STS ベースの方式の比較」をご参照ください。

ApsaraVideo VOD コンソールで HLS 暗号化パラメーターパススルーを有効にすると、デフォルトのパラメーター名は MtsHlsUriToken になります。詳細については、「HLS 暗号化パラメーターパススルー」をご参照ください。この場合、次のコードに示すように、VOD ソースで MtsHlsUriToken の値を設定します。

AVPVidAuthSource *authSource = [[AVPVidAuthSource alloc] init];
authSource.vid = @"Vid information"; // 必須。ビデオ ID (VideoId)。
authSource.playAuth = @"<yourPlayAuth>"; // 必須。再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth 操作を呼び出して認証情報を生成する必要があります。
authSource.region = @"The region where ApsaraVideo VOD is activated"; // ApsaraVideo Player SDK V5.5.5.0 以降では、このパラメーターは非推奨です。プレーヤーが自動的に解析するため、リージョンを設定する必要はありません。V5.5.5.0 より前のバージョンでは、このパラメーターは必須です。ApsaraVideo VOD が有効化されているリージョン。デフォルト値: cn-shanghai。
// authSource.authTimeout = 3600; // 再生 URL の有効期間 (秒単位)。この値は、ApsaraVideo VOD コンソールで設定した URL 署名の有効期間を上書きします。このパラメーターを指定しない場合、デフォルト値の 3600 が使用されます。このパラメーターを設定する場合は、再生が完了する前に再生 URL の有効期限が切れないように、有効期間がビデオの長さを超えていることを確認してください。

// ApsaraVideo VOD コンソールで HLS 暗号化パラメーターパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken の場合は、config を設定して vid に渡す必要があります。次のコードをご参照ください。
// ApsaraVideo VOD コンソールで HLS 暗号化パラメーターパススルーを有効にしない場合は、次のコードを統合する必要はありません。
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
authSource.playConfig = [vp generatePlayerConfig];

[self.player setAuthSource:authSource];

VidSts を使用した VOD 再生

VidSts を使用して VOD ビデオを再生するには、ApsaraVideo VOD 再生認証情報の代わりに、一時的なセキュリティトークンサービス (STS) 認証情報を使用する必要があります。事前に STS トークンと一時的な AccessKey ペア (AccessKeyId と AccessKeySecret) を取得する必要があります。詳細については、「STS トークンを取得する」をご参照ください。

ApsaraVideo VOD コンソールで HLS 暗号化パラメーターパススルーを有効にすると、デフォルトのパラメーター名は MtsHlsUriToken になります。詳細については、「HLS 暗号化パラメーターパススルー」をご参照ください。この場合、次のコードに示すように、VOD ソースで MtsHlsUriToken の値を設定します。

AVPVidStsSource *source = [[AVPVidStsSource alloc] init];
source.vid = @"Vid information"; // 必須。ビデオ ID (VideoId)。
source.region = @"The region where ApsaraVideo VOD is activated"; // 必須。ApsaraVideo VOD が有効化されているリージョン。デフォルト値: cn-shanghai。
source.securityToken = @"<yourSecurityToken>"; // 必須。STS トークン。STS の AssumeRole 操作を呼び出してトークンを生成する必要があります。
source.accessKeySecret = @"<yourAccessKeySecret>"; // 必須。一時的な AccessKey ペアの AccessKey Secret。STS の AssumeRole 操作を呼び出してシークレットを生成する必要があります。
source.accessKeyId = @"<yourAccessKeyId>"; // 必須。一時的な AccessKey ペアの AccessKey ID。STS の AssumeRole 操作を呼び出して ID を生成する必要があります。
// source.authTimeout = 3600; // 再生 URL の有効期間 (秒単位)。この値は、ApsaraVideo VOD コンソールで設定した URL 署名の有効期間を上書きします。このパラメーターを指定しない場合、デフォルト値の 3600 が使用されます。このパラメーターを設定する場合は、再生が完了する前に再生 URL の有効期限が切れないように、有効期間がビデオの長さを超えていることを確認してください。
// ApsaraVideo VOD コンソールで HLS 暗号化パラメーターパススルーを有効にし、デフォルトのパラメーター名が MtsHlsUriToken の場合は、config を設定して vid に渡す必要があります。次のコードをご参照ください。
// ApsaraVideo VOD コンソールで HLS 暗号化パラメーターパススルーを有効にしない場合は、次のコードを統合する必要はありません。
VidPlayerConfigGenerator* vp = [[VidPlayerConfigGenerator alloc] init];
[vp setHlsUriToken:yourMtsHlsUriToken];
source.playConfig = [vp generatePlayerConfig];
// 再生ソースを設定します。
[self.player setStsSource:source]

UrlSource を使用した VOD 再生

UrlSource を使用して VOD ビデオを再生するには、プレーヤーの source プロパティを再生 URL に設定します。

  • ApsaraVideo VOD の再生 URL: GetPlayInfo API 操作を呼び出して URL を取得できます。ApsaraVideo VOD サーバーサイド SDK を統合して再生 URL を取得することをお勧めします。これにより、リクエストに署名する必要がなくなります。この API 操作の呼び出し例については、「API Explorer」をご参照ください。

  • ローカルビデオ URL: 必要なアクセス権限があることを確認してください。/sdcard/xxx/xxx/xxx.mp4content://xxx/xxx/xx.mp4 など、アクセス可能なローカルビデオファイルの完全なパスを取得するためにシステム API を呼び出すことができます。

AVPUrlSource *urlSource = [[AVPUrlSource alloc] urlWithString:url]; // 必須。再生 URL。URL は、サードパーティの VOD URL、ApsaraVideo VOD の再生 URL、またはローカルビデオ URL にすることができます。
[self.player setUrlSource:urlSource]; 

暗号化 VOD 再生

VOD は、HLS 暗号化、Alibaba Cloud 専用の暗号化、および DRM 暗号化をサポートしています。暗号化再生の詳細については、「iOS で暗号化されたビデオを再生する」をご参照ください。

ライブストリーム再生

詳細については、「標準ライブストリーム再生」をご参照ください。

説明
  • UrlSource は再生に URL を使用します。VidSts と VidAuth は再生にビデオ ID (VID) を使用します。

  • リージョンの設定方法については、「VOD リージョン」をご参照ください。

再生の制御

ApsaraVideo Player SDK for iOS は、開始、一時停止、シークなどの一般的な操作をサポートしています。

再生の準備

prepare インターフェイスを呼び出して、ビデオ再生の準備をします。次のコードに例を示します。

[self.player prepare];

再生を開始

start インターフェイスを呼び出して、ビデオ再生を開始します。次のコードに例を示します。

[self.player start];

特定の時間から再生を開始

seekToTime インターフェイスを呼び出して、特定の時間から再生を開始します。これは、ユーザーがプログレスバーをドラッグしたり、特定の時間から再生を再開したりするシナリオに適しています。次のコードに例を示します。

// position パラメーターは時間を指定します。単位: ミリ秒。seekMode パラメーターは、正確モードまたは不正確モードに設定できます。
// 正確なシーク
[self.player seekToTime:position seekMode:AVP_SEEKMODE_ACCURATE];
// 不正確なシーク
[self.player seekToTime:position seekMode:AVP_SEEKMODE_INACCURATE];

特定の位置から再生を開始します。これは、ユーザーが特定の時間から再生を開始するシナリオに適しています。これを有効にするには、各 prepare 呼び出しの前にこのインターフェイスを 1 回呼び出します。次のコードに例を示します。

// プレーヤーの次の prepare 呼び出しの開始時刻をミリ秒単位で設定します。この設定は、直後の prepare 呼び出しに対してのみ有効です。
// prepare が呼び出されると、この値は自動的にクリアされます。次の prepare 呼び出しの前にこのメソッドが再度呼び出されない場合、再生は通常の方法で開始されます。
// seekMode は、正確モードまたは不正確モードに設定できます。
[self.player setStartTime:time seekMode:seekMode];

再生を一時停止

pause インターフェイスを呼び出して、ビデオ再生を一時停止します。次のコードに例を示します。

[self.player pause];

再生を再開

start インターフェイスを呼び出して、動画再生を再開します。以下にコード例を示します。

[self.player start];

再生を停止

stop インターフェイスを呼び出して、ビデオ再生を停止します。次のコードに例を示します。

[self.player stop];

プレーヤーを破棄

プレーヤーインスタンスは、同期または非同期で破棄できます。次のコードに例を示します。

// 同期的な破棄。stop インターフェイスは内部で自動的に呼び出されます。
[self.player destroy];
// 非同期的な破棄。stop インターフェイスは内部で自動的に呼び出されます。
[self.player destroyAsync];
説明

同期的な破棄インターフェイスは、すべてのプレーヤーリソースが解放された後にのみ応答を返します。高いインターフェイス応答速度が必要な場合は、非同期的な破棄インターフェイスを使用することをお勧めします。次の点に注意してください。

  1. 非同期的な破棄中にプレーヤーオブジェクトに対して他の操作を実行しないでください。

  2. 破棄プロセスには非同期的な停止プロシージャが含まれているため、非同期的な破棄インターフェイスを呼び出す前にプレーヤーを手動で停止する必要はありません。

プレーヤーの状態をリスニングする

ApsaraVideo Player SDK for iOS では、プレーヤーリスナーを設定し、再生状態をリスニングできます。

プレーヤーリスナーの設定

プレーヤーは複数のリスナーをサポートしています。

  • onPlayerEventonError コールバックは重要です。これらを設定することをお勧めします。

@interface SimplePlayerViewController ()<AVPDelegate>
@end
- (void)viewDidLoad {
    self.player = [[AliPlayer alloc] init];
    self.player.playerView = self.avpPlayerView.playerView;
    self.player.delegate = self;
    //...
}
/**
 @brief エラーのコールバック。
 @param player プレーヤーポインター。
 @param errorModel エラーの説明。詳細については、AliVcPlayerErrorModel をご参照ください。
 */
- (void)onError:(AliPlayer*)player errorModel:(AVPErrorModel *)errorModel {
    // エラーを報告し、再生を停止します。
}
/**
 @brief プレーヤーイベントのコールバック。
 @param player プレーヤーポインター。
 @param eventType イベントタイプ。詳細については、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 index 表示される字幕のインデックス。
 @param subtitle 表示される字幕の文字列。
 */
- (void)onSubtitleShow:(AliPlayer*)player index:(int)index subtitle:(NSString *)subtitle {
    // 字幕を取得して表示します。
}
/**
 @brief 字幕非表示のコールバック。
 @param player プレーヤーポインター。
 @param index 表示される字幕のインデックス。
 */
- (void)onSubtitleHide:(AliPlayer*)player index:(int)index {
    // 字幕を非表示にします。
}
/**
 @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 {
    // ビットレート切り替えの結果の通知。
}

再生状態のリスニング

プレーヤーの状態をリスニングできます。onPlayerStatusChanged コールバックは、プレーヤーの現在の状態を提供します。次のコードに例を示します。

- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
    switch (newStatus) {
    case AVPStatusIdle:{
           // アイドル。
        }
 break;
        case AVPStatusInitialzed:{
           // 初期化済み。
        }
 break;
        case AVPStatusPrepared:{
           // 準備完了。
        }
 break;
        case AVPStatusStarted:{
           // 再生中。
        }
 break;
case AVPStatusPaused:{
           // 一時停止中。
        }
 break;
case AVPStatusStopped:{
           // 停止済み。
        }
 break;
case AVPStatusCompletion:{
           // 再生が完了しました。
        }
 break;
case AVPStatusError:{
           // エラー。
        }
 break;
        default:
            break;
    }
}

表示モードの設定

ApsaraVideo Player SDK for iOS は、塗りつぶし、回転、ミラーなどの表示設定をサポートしています。

塗りつぶし

アスペクトフィット、アスペクトフィル、ストレッチして塗りつぶしの 3 つの塗りつぶしモードのいずれかを設定できます。scalingMode インターフェイスを呼び出して、塗りつぶしモードを設定します。次のコードに例を示します。

// アスペクト比をフィットに設定します。ビデオは歪みなくビュー内に収まるように縮小されます。
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFIT;
// アスペクト比をフィルに設定します。ビデオは歪みなくビューを埋めるように拡大されます。
self.player.scalingMode = AVP_SCALINGMODE_SCALEASPECTFILL;
// モードをストレッチしてフィルに設定します。ビデオのアスペクト比がビューのアスペクト比と異なる場合、ビデオが歪むことがあります。
self.player.scalingMode = AVP_SCALINGMODE_SCALETOFILL;
説明

塗りつぶしモードの設定は、ピクチャーインピクチャー (PiP) には影響しません。

回転

rotateMode インターフェイスを呼び出して、指定した角度でビデオを回転させます。次のコードに例を示します。

// ビデオを時計回りに 0 度回転させます。
self.player.rotateMode = AVP_ROTATE_0;
// ビデオを時計回りに 90 度回転させます。
self.player.rotateMode = AVP_ROTATE_90;
// ビデオを時計回りに 180 度回転させます。
self.player.rotateMode = AVP_ROTATE_180;
// ビデオを時計回りに 270 度回転させます。
self.player.rotateMode = AVP_ROTATE_270;

ミラー

水平ミラーリング、垂直ミラーリング、またはミラーリングなしを有効にできます。mirrorMode インターフェイスを呼び出して、ミラーモードを設定します。次のコードに例を示します。

// ミラーリングを無効にします。
self.player.mirrorMode = AVP_MIRRORMODE_NONE;
// 水平ミラーリングを有効にします。
self.player.mirrorMode = AVP_MIRRORMODE_HORIZONTAL;
// 垂直ミラーリングを有効にします。
self.player.mirrorMode = AVP_MIRRORMODE_VERTICAL;

再生情報の取得

ApsaraVideo Player SDK for iOS では、現在の再生進行状況、再生時間、およびバッファリング進行状況を取得できます。

現在の再生進行状況の取得

現在の再生時間を取得できます。位置は onCurrentPositionUpdate コールバックで返されます。次のコードに例を示します。

- (void)onCurrentPositionUpdate:(AliPlayer*)player position:(int64_t)position {
// position パラメーターは、現在の再生進行状況をミリ秒単位で示します。
NSString *position = [NSString stringWithFormat:@"%lld, position"];
}

再生時間の取得

ビデオの合計時間を取得できます。時間は、ビデオがロードされた後、たとえば onPrepared コールバックが呼び出された後にのみ取得できます。単位: ミリ秒。次のコードに例を示します。

-(void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
  switch (eventType) {
    case AVPEventPrepareDone: {
      if (self.player.duration >= 0) {
       NSString *duration  = self.player.duration;
      }
    }
      break;
    default:
      break;
  }
}

実際の再生時間の取得

実際の再生時間をリアルタイムで取得できます。取得される時間には、再生中の一時停止やスタッタリングに費やされた時間は含まれません。次のコードに例を示します。

 NSString *duration = [player getPlayedDuration];

バッファリング進行状況の取得

ビデオの現在のバッファリング進行状況を取得できます。位置は onBufferedPositionUpdate コールバックで返されます。次のコードに例を示します。

- (void)onBufferedPositionUpdate:(AliPlayer*)player position:(int64_t)position {
    NSString *bufferPosition = position;
}

リアルタイムのレンダリングフレームレート、オーディオおよびビデオビットレート、ネットワークダウンロードビットレートの取得

次のコードに例を示します。

// 現在のレンダリングフレームレートを取得します。データ型: Float。
[self.player getOption:AVP_OPTION_RENDER_FPS]
// 再生中のビデオのビットレートを取得します。データ型: Float。単位: bps。
[self.player getOption:AVP_OPTION_VIDEO_BITRATE]
// 再生中のオーディオのビットレートを取得します。データ型: Float。単位: bps。
[self.player getOption:AVP_OPTION_AUDIO_BITRATE]
// 現在のネットワークダウンロードビットレートを取得します。データ型: Float。単位: bps。
[self.player getOption:AVP_OPTION_DOWNLOAD_BITRATE]

音量の設定

音量を調整したり、ビデオをミュートしたりできます。

音量の調整

音量を調整できます。有効な範囲は 0 から 2 です。音量を 1 より大きい値に設定すると、ノイズが発生する可能性があります。音量を 1 より大きい値に設定しないことをお勧めします。volume インターフェイスを呼び出して音量を調整します。音量を設定した後、音量情報を取得することもできます。次のコードに例を示します。

// volume の値は 0 から 2 までの実数です。
self.player.volume = 1.0f;
// 音量情報を取得します。
self.player.volume

ビデオをミュートする

muted インターフェイスを呼び出してビデオをミュートします。次のコードに例を示します。

self.player.muted = YES;

再生速度の設定

ApsaraVideo Player SDK for iOS では、再生速度を設定できます。rate メソッドを使用して、ピッチを変更せずに元の速度の 0.5 倍から 5 倍の速度でビデオを再生できます。次のコードに例を示します。

// 再生速度を設定します。再生速度は 0.5 から 5 までの値に設定できます。0.5、1、1.5 など、0.5 の倍数に設定することをお勧めします。
self.player.rate = 1.0f;

複数の定義を設定する

説明

詳細なコード例については、API-ExampleMultiResolution モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C ベースのデモです。このプロジェクトは、開発者が SDK のコア機能を迅速に統合するのに役立ちます。

UrlSource を使用したライブストリーミング

詳細については、「標準ライブストリーム再生」をご参照ください。

Vid (VidAuth または VidSts) を使用した VOD 再生

Vid 方式 (VidAuth または VidSts) を使用して再生する場合、追加の設定は必要ありません。ApsaraVideo Player SDK for iOS は、ApsaraVideo VOD から解像度リストを取得します。ApsaraVideo Player SDK for iOS では、解像度を取得して切り替えることができます。UrlSource 方式はこの設定をサポートしていません。

定義の取得

ビデオがロードされた後、ビデオの解像度を取得できます。onTrackReady リスナーは、コールバックで info オブジェクトを返します。その後、このオブジェクトから解像度の trackBitrate を取得できます。

- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    for (int i=0; i<info.count; i++) {
        AVPTrackInfo* track = [info objectAtIndex:i];
        switch (track.trackType) {
            case AVPTRACK_TYPE_VIDEO: {
                int trackBitrate = track.trackBitrate;
            }
                break;
        }
    }
}

定義の切り替え

解像度を切り替えるには、selectTrack メソッドを呼び出し、対応する TrackInfo のインデックスを渡します。

[self.player selectTrack:index];

解像度切り替えの通知

onTrackChanged コールバックは、解像度が切り替えられた後に呼び出されます。

- (void)onTrackChanged:(AliPlayer*)player info:(AVPTrackInfo*)info {
 // 解像度が切り替えられました。
}

クイック切り替え

クイック切り替えモードを有効にすると、手動で selectTrack を呼び出すたびに迅速な応答を受け取ります。

AVPConfig *config = [self.player getConfig];
config.selectTrackBufferMode = 1;
[self.player setConfig:config];

ループ再生

ApsaraVideo Player SDK for iOS は、ループ再生をサポートしています。loop プロパティを設定して、この機能を有効にできます。再生が完了すると、ビデオは自動的に最初から再開されます。例:

self.player.loop = YES;

AVPEventLoopingStart コールバックは、ループの開始時に返されます。次のコードに例を示します。

- (void)onPlayerEvent:(AliPlayer*)player eventType:(AVPEventType)eventType {
    switch (eventType) {
        case AVPEventLoopingStart:
            break;
    }
}

オーディオトラックの切り替え

ApsaraVideo Player SDK for iOS は、オーディオトラックを切り替える機能を提供します。この機能は、ユーザーが多言語オーディオのビデオを視聴する際にオーディオ言語を切り替えることができるシナリオに適しています。

説明

現在、SDK は非プレイリストストリーム (MP4 ストリームなど)、シングルビットレート混合 HLS ストリーム、およびシングルビットレート非混合 HLS ストリームのオーディオストリーム間の切り替えをサポートしています。また、マルチビットレート混合 HLS ストリームのサブストリーム間の切り替えもサポートしています。次の表に、ビデオストリームタイプを示します。

ビデオストリームタイプ

ビデオストリームのサフィックス

ビットレート数

サブ m3u8 ファイルの数

サブストリームタイプ

切り替え手順

非プレイリストストリーム (MP4 ストリームなど)

.mp4

1

-

再生ストリームには 1 つのビデオストリームが含まれ、複数のオーディオストリームと字幕ストリームが含まれる場合があります。

複数のオーディオストリーム間の切り替えがサポートされています。

シングルビットレート混合 HLS ストリーム

.m3u8

1

1

再生ストリームには 1 つのビデオストリームが含まれ、複数のオーディオストリームと字幕ストリームが含まれる場合があります。

複数のオーディオストリーム間の切り替えがサポートされています。

シングルビットレート非混合 HLS ストリーム

.m3u8

1

n

m3u8。各サブストリームは、ビデオストリーム、オーディオストリーム、または字幕ストリームのみにすることができます。

複数のオーディオストリーム間の切り替えがサポートされています。

マルチビットレート混合 HLS ストリーム

.m3u8

n

n

m3u8。各サブストリームには 1 つのビデオストリームが含まれ、複数のオーディオストリームと字幕ストリームが含まれる場合があります。異なるサブストリームは異なるビットレートを持ちます。

現在、サブストリーム間の切り替えのみがサポートされています。サブストリーム内の複数のオーディオストリーム間の切り替えはサポートされていません。

  1. コールバックを設定します。

      // onSubTrackReady コールバックは通常、prepare コールバックの前に発生します。
    - (void)onSubTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
        // getSubMediaInfo を呼び出して、MediaInfo 情報を取得します。このメソッドは、onSubTrackReady コールバックを受信した後にのみ呼び出すことができます。そうでない場合、値は空になります。
        AVPMediaInfo* subMediaInfo = [player getSubMediaInfo];
        // トラバースします。
        for (int i=0; i<subMediaInfo.tracks.count; i++) {
        	AVPTrackInfo* track = [mediaInfo.tracks objectAtIndex:i];
            // 対応するトラックを取得します。
        }
    }
  2. オーディオトラックを切り替えます。

    [self.player selectTrack:myTrack.trackIndex accurate:YES]

サムネイルの使用

説明

詳細なコード例については、API-ExampleThumbnail モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS の Objective-C ベースのデモです。このプロジェクトは、開発者が SDK のコア機能を迅速に統合するのに役立ちます。

ApsaraVideo Player SDK でサムネイルを使用する前に、ビデオにサムネイルが設定されていることを確認してください。これは、ビデオのスプライトが生成されていることを意味します。これを行うには、ApsaraVideo VOD コンソールでスプライトスクリーンショットテンプレートを作成し、ワークフローを使用してテンプレートでビデオを処理する必要があります。詳細については、「ビデオスクリーンショット」をご参照ください。次のコードは、ApsaraVideo Player SDK でサムネイルを使用する方法を示しています。

/**
 現在のトラックにサムネイルがあるかどうかを指定します。ない場合、サムネイルは表示されません。
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 サムネイルを表示するためのカスタムビューを作成します。
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
 @brief: トラック情報のコールバック。
 @param player: プレーヤーポインター。
 @param info: トラック情報の配列。詳細については、AVPTrackInfo をご参照ください。
 */
- (void)onTrackReady:(AliPlayer*)player info:(NSArray<AVPTrackInfo*>*)info {
    AVPMediaInfo* mediaInfo = [player getMediaInfo];
    if ((nil != mediaInfo.thumbnails) && (0 < [mediaInfo.thumbnails count])) {
        [self.player setThumbnailUrl:[mediaInfo.thumbnails objectAtIndex:0].URL];
        self.trackHasThumbnai = YES;
    }else {
        self.trackHasThumbnai = NO;
    }
}

/**
 プログレスバーの変更のコールバック。
 @param playerView playerView
 @param value: プログレス値。
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: サムネイル取得成功のコールバック。
 @param positionMs: 指定されたサムネイルの位置。
 @param fromPos: サムネイルの開始位置。
 @param toPos: サムネイルの終了位置。
 @param image: サムネイル画像ポインター。macOS の場合は NSImage ポインター、iOS の場合は UIImage ポインターです。
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief: サムネイル取得失敗のコールバック。
 @param positionMs: 指定されたサムネイルの位置。
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

注: URL ベースの再生を使用する場合、onTrackReady コールバックは URL ベースの再生の MediaInfo をサポートしていないため、上記のコードではサムネイルを直接表示できません。この場合、サムネイル URL を直接指定することをお勧めします。

/**
 現在のトラックにサムネイルがあるかどうかを指定します。ない場合、サムネイルは表示されません。
 */
@property (nonatomic,assign)BOOL trackHasThumbnai;

/**
 サムネイルを表示するためのカスタムビューを作成します。
 */
@property (nonatomic,strong)UIImageView *thumbnaiView;

/**
  onPrepare
 */
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus {
  if(newStatus == AVPStatusPrepared){
       [self.player setThumbnailUrl:[URL];// コンソール API に基づいて特定のサムネイル URL を生成します。
       self.trackHasThumbnai = YES;
  }
}
/**
 プログレスバーの変更のコールバック。
 @param playerView playerView
 @param value: プログレス値。
 */
- (void)AVPPlayerView:(AVPPlayerView *)playerView progressSliderValueChanged:(CGFloat)value {
    if (self.trackHasThumbnai) {
        [self.player getThumbnail:self.player.duration*value];
    }
}

/**
 @brief: サムネイル取得成功のコールバック。
 @param positionMs: 指定されたサムネイルの位置。
 @param fromPos: サムネイルの開始位置。
 @param toPos: サムネイルの終了位置。
 @param image: サムネイル画像ポインター。macOS の場合は NSImage ポインター、iOS の場合は UIImage ポインターです。
 */
- (void)onGetThumbnailSuc:(int64_t)positionMs fromPos:(int64_t)fromPos toPos:(int64_t)toPos image:(id)image {
    self.thumbnaiView.hidden = NO;
    [self.thumbnaiView setImage:(UIImage *)image];
}

/**
 @brief: サムネイル取得失敗のコールバック。
 @param positionMs: 指定されたサムネイルの位置。
 */
- (void)onGetThumbnailFailed:(int64_t)positionMs {
    self.thumbnaiView.hidden = YES;
}

SDK ログの取得

ApsaraVideo Player SDK の実行中、ネットワークリクエストの状態、システムコールの結果、権限リクエストの状態など、詳細なログ情報が生成されます。開発者はこれらのログを表示して、コードのデバッグや問題のトラブルシューティングを行い、開発効率を向上させることができます。

方法 1: 開発ツールのコンソールから SDK ログを取得する

この方法は、ローカルマシンで問題を再現し、ログをキャプチャできるシナリオに適しています。

  1. ロギングを有効にし、ログレベルを設定します。

    // ロギングを有効にします。
    [AliPlayer setEnableLog:YES];
    // ログレベルを設定します。デフォルト値: LOG_LEVEL_INFO。問題をトラブルシューティングするには、レベルを LOG_LEVEL_TRACE に設定します。
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:nil];
  2. フレームレベルのロギングを設定します。

    // フレームレベルのログ出力を設定します。
    // 値 0 は機能を無効にします。値 1 は機能を有効にします。
    [AliPlayer setLogOption:FRAME_LEVEL_LOGGING_ENABLED value:value];
    説明

    フレームレベルのロギング機能は、主にトラブルシューティングに使用されます。

  3. ログを収集します。

    1. 方法 1: コンソールでログを表示する

      問題を再現した後、Xcode などの開発ツールのコンソールからログを取得できます。

    2. 方法 2: カスタムパスのファイルにログを出力する

      1. ロギングを有効にした後、プレーヤーインスタンスを作成する前に、サンドボックスパスにログファイルのカスタムパスを指定します。

        NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        // logFilePath はパスの例です。サンドボックスパスに xxxx.log ファイルなどのカスタムファイルを作成できます。
        NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:@"xxxx.log"];
      2. カスタムファイルにログ情報を注入します。

        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
      3. 問題を再現した後、カスタムパスから生成された .log ファイルを取得できます。

方法 2: LogCallback を介して SDK 出力ログをリスニングする

この方法は、問題がユーザー側で発生し、ローカルマシンで再現してログをキャプチャできないシナリオに適しています。LogCallback を介して SDK 出力ログをリスニングし、アプリのログチャネルに自動的に出力できます。

  1. ロギングを有効にし、ログレベルを設定します。

    // ロギングを有効にします。
    [AliPlayer setEnableLog:YES];
    // ログレベルを設定します。デフォルト値: LOG_LEVEL_INFO。問題をトラブルシューティングするには、レベルを LOG_LEVEL_TRACE に設定します。
    [AliPlayer setLogCallbackInfo:LOG_LEVEL_INFO callbackBlock:^(AVPLogLevel logLevel, NSString *strLog) {
     NSLog(@"strLog:%@", strLog);
    }];
  2. ログを収集します。

    問題を再現した後、ログはアプリのログチャネルを介してアプリのログファイルに自動的に出力されます。