このトピックでは、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 は、プレミアム機能の列挙型です。関連機能が使用されると、プレーヤーはその機能を検証し、このコールバックを通じて結果を返します。isValid が false の場合、errorMsg に具体的な理由が含まれます。
再生
リスト再生
ApsaraVideo Player SDK for iOS は、一般的なリスト再生シナリオ向けに包括的なリスト再生機能を提供します。これらの機能は、プリロードなどのメカニズムと組み合わせることで、ショートビデオの初回フレームの読み込み速度を大幅に向上させます。
より良いリスト再生体験のために、当社の短編ビデオドラマソリューションを使用することを推奨します。詳細については、「短編ビデオドラマのクライアントサイド開発」をご参照ください。
透明度のある動画の再生
機能説明
ApsaraVideo Player SDK は、アルファチャンネルのレンダリングをサポートし、透明なギフトの動的効果を作成します。ライブチャンネルなどのシナリオでは、ライブチャンネルのコンテンツをブロックすることなく、透明なギフトの動的効果を再生できます。これにより、ユーザーの視聴体験とインタラクション体験が大幅に向上します。
制限事項
透明レンダリング機能は、All-in-One SDK V6.8.0 以降または ApsaraVideo Player SDK V6.9.0 以降でサポートされています。
利点
透明度情報を持つ MP4 動画をギフト効果として使用すると、アニメーション品質が向上し、ファイルサイズが小さくなり、互換性が高まり、開発効率が向上します。これにより、ギフト効果をユーザーに表示し、ユーザー体験を向上させることができます。
より良いアニメーション品質:MP4 動画は、詳細や色を含む元のアニメーション品質を保持できます。APNG や IXD などの他のフォーマットと比較して、MP4 はデザイナーが作成したアニメーション効果をより正確に復元できます。
より小さいファイルサイズ:MP4 動画ファイルは、APNG や IXD などの他のフォーマットよりも効果的に圧縮できます。これにより、読み込み速度が向上し、ネットワーク帯域幅の消費が削減されます。
より高い互換性:MP4 は、さまざまなデバイスやブラウザで広くサポートされているユニバーサルビデオフォーマットです。これにより、主流のデバイスでギフト効果を再生および視聴できます。
より高い開発効率:MP4 動画をギフト効果として使用する技術的ソリューションは比較的簡単です。開発者は、複雑な解析およびレンダリングロジックを研究および実装する必要がありません。これにより、開発者は他の機能に集中し、開発効率を向上させることができます。
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-Example」の External Subtitle Demo and Switching (ExternalSubtitle) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS 向けの Objective-C ベースのサンプルプロジェクトで、開発者がコア SDK 機能を迅速に統合するのに役立ちます。
ApsaraVideo Player SDK for iOS は、外部字幕の追加と切り替えをサポートしています。SDK は、SRT、SSA、ASS、VTT の字幕フォーマットをサポートしています。
次のコードに例を示します。
字幕を表示するビューの作成
字幕フォーマットごとに異なるビューを作成できます。
// カスタム subTitleLabel を初期化します。 UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:frame]; // カスタム superView に字幕を追加します。superView はカスタムインターフェイスに存在する親ビューです。 [superView addSubview:subTitleLabel];字幕関連のリスナーの設定
// 外部字幕が追加されました。 - (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]; }字幕の追加
[self.player addExtSubtitle:URL];字幕の切り替え
[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.264 バックアップストリームが自動的に再生されます。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 のアダプティブビットレートストリーミングを設定する」をご参照ください。
Vid メソッドを使用して ApsaraVideo VOD によってトランスコードされたアダプティブストリームを再生する場合、アダプティブビデオストリームを取得して再生するには、デフォルトの再生解像度リストを
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];
// ビットレートを切り替えます。
[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) {
// video changed
}
// etc
}(オプション) プレーヤーの 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 を設定した場合、ネットワークの問題で読み込み状態が発生すると、プレーヤーは networkRetryCount 回リトライします。各リトライの間隔は networkTimeout です。
複数回のリトライ後も読み込み状態が続く場合、
onErrorイベントが呼び出されます。この場合、AVPErrorModel.code は ERROR_LOADING_TIMEOUT です。networkRetryCount が 0 に設定されている場合、ネットワークリトライがタイムアウトすると、プレーヤーは onPlayerEvent を呼び出し、パラメーター eventWithString を EVENT_PLAYER_NETWORK_RETRY に設定します。この時点で、プレーヤーの
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-Example」の Picture-in-Picture (PictureInPicture) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS 向けの Objective-C ベースのサンプルプロジェクトで、開発者がコア SDK 機能を迅速に統合するのに役立ちます。
PiP 機能の環境要件:iOS 15 以降、ApsaraVideo Player SDK for iOS V5.4.9.0 以降。
5.5.2.0 より前のバージョンの ApsaraVideo Player SDK for iOS は、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 ウィンドウでの一時停止、再生、早送り、早戻しボタンのロジック、および再再生のロジックが含まれます。デリゲートメソッドの詳細については、Player SDK Demo の SDK フォルダにある AliyunPlayer.framework の AliPlayerPictureInPictureDelegate.h ヘッダーファイルの内容をご参照ください。
PiP デリゲートを設定します。
/** * @brief PiP デリゲートを設定します。 */ -(void) setPictureinPictureDelegate:(id<AliPlayerPictureInPictureDelegate>)delegate; // PiP デリゲートを設定します。 [self.player setPictureinPictureDelegate:self];変数を追加し、デリゲートインターフェイスを実装します。
プレーヤーの状態変化を制御するためのグローバル変数を追加します。
#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 に設定されるタイミングに注意してください。
再生イベントステータス変更コールバックインターフェイスをリッスンする場合、PiP コントローラーの関連ステータスを更新するために、次のメソッドをアクティブに呼び出す必要があります。
- (void)onPlayerStatusChanged:(AliPlayer*)player oldStatus:(AVPStatus)oldStatus newStatus:(AVPStatus)newStatus { self.currentPlayerStatus = newStatus; if (_pipController) { [self.pipController invalidatePlaybackState]; } }再生イベントコールバックインターフェイスをリッスンする場合、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]; } } }リスナーを設定します。
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-Example」の RTS 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 付加価値デコード機能は、オンデマンド統合をサポートするプラグインとして独立してパッケージ化されています。
前提条件
ApsaraVideo Player SDK または All-in-One SDK は V7.6.0 以降です。
Professional Edition のライセンスを取得済みであること。詳細については、「ApsaraVideo Player SDK のライセンスを取得する」をご参照ください。
H.266 デコードプラグインを備えた ApsaraVideo Player は、Alibaba Cloud Transcoding によってトランスコードされた H.266 ビデオのみを再生できます。
プラグインの統合
プラグインのアクティベート
ApsaraVideo Player SDK for iOS V7.7.0 以降、プラグインはデフォルトで有効になっており、手動でアクティベートする必要はありません。
[AliPlayerGlobalSettings enableCodecPlugin:@"vvc" valid:true];関連するエラーコード
H.266 デコードプラグインに関連するエラーコードの詳細については、「異なるクライアント上のプレーヤーに関するよくある質問」をご参照ください。
再生ソースの自動更新
再生ソースの自動更新機能を有効にすると、署名メカニズム下での有効期限切れによる再生の中断を防ぐことができます。この機能は、ソースが無効になったときにリスナーをトリガーして新しいアドレスを取得します。これにより、継続的でスムーズなビデオ再生が保証されます。
前提条件
ApsaraVideo Player SDK または All-in-One SDK は V7.9.0 以降です。
再生に VidAuth ソースを使用しているか、サービスにURL 署名が設定されていること。
VidAuth ソース
API の例
/**
@brief VidAuth ソースの有効期限切れ通知のコールバックを設定します。
このメソッドは、プレーヤーが現在の VidAuth ソースが期限切れであることを検出したときにトリガーされます。
コールバック内で VidAuth ソースを更新し、`callback` を使用して更新された VidAuth ソースを返すことで、
中断のないスムーズなビデオ再生を保証できます。
@param callback VidAuth ソースが期限切れになったときにトリガーされるコールバックブロック。
このコールバックを使用して、有効な `VidAuth` オブジェクトを提供し、プレーヤーを更新します。
*/
-(void)setOnVidAuthExpiredCallback:(void (^)(id expiredSource, id<AVPSourceRefreshCallback> callback))callback;コンポーネントの説明
使用方法
オーディオまたはビデオの再生認証情報は、GetVideoPlayAuth API 操作を呼び出すことで取得できます。自己署名を避けるために、ApsaraVideo VOD サーバーサイド SDK を統合して認証情報を取得することを推奨します。詳細については、「OpenAPI ポータル」をご参照ください。
[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;コンポーネントの説明
使用方法
[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 署名を使用しています。
パフォーマンス
再生シナリオの設定
再生シナリオを設定すると、バッファ設定や機能の切り替えなど、シナリオに基づいて最適なパラメーターが自動的に設定されます。この設定は、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 は、再生開始前に初回フレームを高速にレンダリングする機能をサポートしており、初回フレームの読み込み速度を向上させることができます。
この機能はデフォルトで無効になっています。
この機能を有効にすると、準備完了イベントと初回フレームレンダリングイベントのトリガー順序に影響します。機能が無効の場合、準備完了イベントは初回フレームレンダリングイベントの前にコールバックされます。機能が有効の場合、デコードとレンダリングの速度が異なるため、初回フレームレンダリングが準備完了イベントの前にトリガーされる場合があります。ただし、これは再生には影響しません。
次のコードに例を示します。
[self.player setOption:ALLOW_PRE_RENDER valueInt:1];ローカルキャッシュ
詳細なコード例については、「API-Example」の Video Preload (PreloadUrl) モジュールをご参照ください。このプロジェクトは、ApsaraVideo Player SDK for iOS 向けの Objective-C ベースのサンプルプロジェクトで、開発者がコア SDK 機能を迅速に統合するのに役立ちます。
ApsaraVideo Player SDK for iOS は、ローカルキャッシュ機能を提供します。この機能は、ユーザーがビデオを繰り返し再生する際の初回フレームの読み込み速度、シーク速度を向上させ、カクつきを減らします。また、トラフィックの節約にも役立ちます。
ローカルキャッシュの有効化
デフォルトでは、ローカルキャッシュ機能は無効になっています。この機能を使用するには、手動で有効にする必要があります。この機能は、enableLocalCache の AliPlayerGlobalSettings を使用して制御できます。以下に例を示します。
/**
* ローカルキャッシュを有効にします。有効にすると、ビデオはローカルファイルにキャッシュされます。
* @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) の認証パラメーターは削除しません。
サーバーが HTTP と HTTPS の両方のプロトコルをサポートしているが、異なるプロトコルが同じメディアファイルを指している場合、MD5 値を計算する前にリクエストヘッダーを削除または統一できます。例:
ビデオ再生 URL が
https://****.mp4とhttp://****.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];ローカルキャッシュ機能を有効にします。詳細については、「ローカルキャッシュ」をご参照ください。
データソースを設定します。
VidAuth (推奨)
AVPVidAuthSource* vidAuthSource = [[AVPVidAuthSource alloc] init]; [vidAuthSource setVid:@"Vid 情報"]; // 必須。ビデオ ID。 [vidAuthSource setPlayAuth:@"<yourPlayAuth>"]; // 必須。再生認証情報。ApsaraVideo VOD の GetVideoPlayAuth API 操作を呼び出して生成する必要があります。 [vidAuthSource setRegion:@"アクセスリージョン"]; // プレーヤー SDK V5.5.5.0 以降、このパラメーターは非推奨です。リージョンを設定する必要はありません。プレーヤーが自動的に解析します。V5.5.5.0 より前のプレーヤー SDK の場合、このパラメーターは必須です。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];タスクパラメーターを設定します。
説明これはマルチビットレートビデオにのみ適用されます。
setDefaultBandWidth、setDefaultResolution、またはsetDefaultQualityのいずれか 1 つのみを設定できます。AVPPreloadConfig *config = [[AVPPreloadConfig alloc]init]; // マルチビットレートストリームのプリロードビットレートを設定します。 [config setDefaultBandWidth:400000]; // マルチビットレートストリームのプリロード解像度を設定します。 [config setDefaultResolution:640 * 480]; // マルチビットレートストリームのプリロード品質を設定します。 [config setDefaultQuality:@"FD"]; // プリロード期間を設定します。 [config setDuration:1000];タスクリスナーを追加します。
タスクをビルドし、
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];(オプション) タスクの管理
[vodMedialoader cancelTask:taskId]; // 指定されたタスク ID のプリロードタスクをキャンセルします。 [vodMedialoader pauseTask:taskId]; // 指定されたタスク ID のプリロードタスクを一時停止します。 [vodMedialoader resumeTask:taskId]; // 指定されたタスク ID のプリロードタスクを再開します。(オプション) 読み込まれたファイルの削除
必要に応じて読み込まれたファイルを削除して、スペースを節約できます。ApsaraVideo Player SDK for iOS は削除インターフェイスを提供していません。アプリの読み込みディレクトリ内のファイルを削除する必要があります。
動的プリロード
動的プリロードポリシーにより、インテグレーターは現在再生中のビデオのキャッシュと、プリロードされたビデオの数とキャッシュの両方を制御でき、ビジネスニーズに合わせて再生体験とコストオーバーヘッドのバランスを取ることができます。
マルチビットレート HLS ビデオのプリロード
listPlayer とマルチビットレート HLS ビデオ再生シナリオでは、現在の再生解像度に一致する解像度のストリームをプリロードし、必要に応じてプリロードモードを選択できます。
ダウンロード速度の取得
現在再生中のビデオのダウンロード速度を取得できます。速度は 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-Example」の Video 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 コンソールでダウンロードモードを有効にして設定する必要があります。詳細については、「オフラインダウンロード」をご参照ください。
動画ダウンロードは、再開可能なダウンロードをサポートしています。
手順
(オプション) セキュアダウンロード用の暗号化検証ファイルを設定します。これはセキュアダウンロードにのみ必要で、標準ダウンロードには必要ありません。
説明設定された暗号化検証ファイルがアプリ情報と一致していることを確認してください。そうしないと、動画のダウンロードに失敗します。
ダウンロード方法をセキュアダウンロードに設定した場合、ApsaraVideo VOD コンソールで生成されたキーファイルをプレーヤー SDK に設定して、動画のダウンロードと再生中に復号と検証を行う必要があります。キーファイルの生成方法の詳細については、「セキュアダウンロードを有効にする」をご参照ください。
キーファイルは、Application で一度設定することを推奨します。次のコードに例を示します。
NSString *encrptyFilePath = [[NSBundle mainBundle] pathForResource:@"encryptedApp" ofType:@"dat"]; [AliPrivateService initKey:encrptyFilePath];ダウンローダーの作成と設定
次のコードに例を示します。
AliMediaDownloader *downloader = [[AliMediaDownloader alloc] init]; [downloader setSaveDirectory:self.downLoadPath]; [downloader setDelegate:self];イベントリスナーの設定
ダウンローダーは複数のイベントリスナーを提供します。次のコードに例を示します。
-(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 { // ダウンロードが成功しました。 }ダウンロードソースの準備
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 以降、このパラメーターは非推奨です。リージョンを設定する必要はありません。プレーヤーが自動的に解析します。V5.5.5.0 より前のプレーヤー SDK の場合、このパラメーターは必須です。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 ソースに設定してください。
準備が成功した後、ダウンロード項目を選択します。
準備が成功すると、
onPreparedメソッドがコールバックされます。返された TrackInfo には、各ビデオストリームの解像度などの情報が含まれています。ダウンロードするトラックを選択できます。次のコードに例を示します。-(void)onPrepared:(AliMediaDownloader *)downloader mediaInfo:(AVPMediaInfo *)info { NSArray<AVPTrackInfo*>* tracks = info.tracks; // たとえば、最初の TrackInfo をダウンロードします。 [downloader selectTrack:[tracks objectAtIndex:0].trackIndex]; }ダウンロードソースを更新し、ダウンロードを開始します。
VidSts と VidAuth の有効期限が切れるのを防ぐために、ダウンロードを開始する前にダウンロードソース情報を更新することを推奨します。次のコードに例を示します。
// ダウンロードソースを更新します。 [downloader updateWithVid:vidSource] // ダウンロードを開始します。 [downloader start];ダウンロードが成功または失敗した後、ダウンローダーを解放します。
ダウンロードが成功した後、
destroyを呼び出してダウンローダーを解放できます。[self.downloader destroy]; self.downloader = nil;
暗号化動画の再生
ApsaraVideo VOD は、HLS 暗号化、Alibaba Cloud 独自暗号化、および DRM 暗号化をサポートしています。ライブストリーミングビデオは DRM 暗号化のみをサポートしています。暗号化再生の詳細については、「暗号化動画の再生」をご参照ください。
ネイティブ RTS 再生
ApsaraVideo Player SDK for iOS は、ネイティブ RTS SDK を統合して、ネイティブの低遅延ライブストリーミング機能を実現します。詳細については、「iOS での RTS ストリームフェッチングの実装」をご参照ください。