シーンタイプ (SceneType) は、AliPlayerKit における再生シナリオのための抽象化です。シーンを指定すると、UI 動作、ジェスチャーコントロール、およびスロットの表示/非表示が自動的に調整されます。
標準的なビデオオンデマンド (VOD) シナリオでは、SceneType をセットする必要はありません。デフォルトは SceneTypeVOD であり、完全な再生機能を提供します。ライブストリーミングや制限付き再生といった VOD 以外のシナリオに限り、SceneType を明示的に指定する必要があります。
はじめに
SceneType とは
SceneType は、プレーヤーの 現在のビジネスシナリオ を指定する列挙型です。SceneType を設定すると、AliPlayerKit は自動的に以下を実行します:
ライブストリーミングのシナリオでサムネイルを非表示にするなど、スロットの可視性を 調整 します。
ライブストリーミングや視聴制限のあるシナリオではシークや再生速度調整を無効にし、ビデオリストのシナリオでは垂直ジェスチャーを無効にするなど、ジェスチャーを フィルタリング します。
視聴制限のあるシナリオでユーザーがコンテンツを完全かつ順番に視聴するようにするなど、機能の制限に 対応 します。
列挙型の値を設定するだけで、フレームワークはこれらの適応を自動的に処理します。これにより、さまざまなビジネスシナリオに合わせてプレーヤーをカスタマイズする手間を大幅に削減できます。
コアバリュー
利点 | 説明 |
ゼロコンフィギュレーションでの対応 | シーンを設定すると、UI とインタラクティブな挙動は自動的に調整されます。各スロットとジェスチャーを個別に設定する必要はありません。 |
一貫性の保証 | 同じシナリオ内のすべてのプレーヤーインスタンスで、UI とインタラクティブな挙動の一貫性が維持されます。 |
カスタマイズコストの削減 | スロットの可視性とジェスチャーのフィルタリングに関する数十行のコードを、わずか 1 行のコードに置き換えることができます。 |
スケーラビリティ | SlotConfig と GestureControlSlotConfig を使用して、さらにファインチューニングを行うことができます。 |
機能
シナリオの概要
AliPlayerKit には、ほとんどの再生要件に対応する 5 つの組み込みシーンタイプが用意されています。
シナリオ | 列挙値 | 説明 | ユースケース | VOD との相違点 |
VOD |
| デフォルトのシナリオです。すべてのコントロール機能をサポートします。 | 標準 VOD、コース、メディアライブラリ | — |
ライブ |
| 再生時間が固定されていないリアルタイムストリームです。タイムライン操作は自動的に無効になります。 | ライブストリーミング、スポーツイベント、E コマースライブストリーミング | プログレスシークと再生速度の調整を無効にします。サムネイルを非表示にします。 |
ビデオリスト |
| リストのスクロールとの競合を避けるため、縦方向のジェスチャーを無効にします。 | フィード、ショートビデオリスト | 音量と明るさを調整するための縦方向ジェスチャーを無効にします。 |
制限付き再生 |
| ユーザーがビデオ全体を視聴するように、スキップ操作を禁止します。 | 試験監視、トレーニングコース | プログレスシークと再生速度の調整を無効にします。サムネイルを非表示にします。 |
ミニマル |
| 最小限のインターフェースです。すべてのコントロールを個別に実装する必要があります。 | バックグラウンド再生、完全カスタム UI | すべてのコントロールコンポーネントとジェスチャーを非表示にします。 |
列挙型の定義
// SceneType.h
typedef NS_ENUM(NSInteger, SceneType) {
/** VOD シナリオ (デフォルト) */
SceneTypeVOD = 0,
/** ライブストリーミングシナリオ */
SceneTypeLive = 1,
/** ビデオリストまたはショートビデオストリームシナリオ */
SceneTypeVideoList = 2,
/** 制限付き再生シナリオ */
SceneTypeRestricted = 3,
/** ミニマル再生ページシナリオ */
SceneTypeMinimal = 4,
};シナリオ別機能マトリクス
スロットの可視性
スロットシステムは、シーンタイプに基づいてコンポーネントの可視性を自動的に制御します。次のマトリクスに、DefaultSlotFactory.defaultConfigs のデフォルトルールを示します。
スロット | VOD | ライブ | ビデオリスト | 制限付き | ミニマル |
PlayerSurface | ✓ | ✓ | ✓ | ✓ | ✓ |
GestureControl | ✓ | ✓ | ✓ | ✓ | ✗ |
LandscapeHint | ✓ | ✓ | ✓ | ✓ | ✗ |
カバー | ✓ | ✗ | ✓ | ✗ | ✗ |
CenterDisplay | ✓ | ✓ | ✓ | ✓ | ✗ |
再生状態 | ✓ | ✓ | ✓ | ✓ | ✓ |
ログパネル | ✓ | ✓ | ✓ | ✓ | ✗ |
トップバー | ✓ | ✓ | ✓ | ✓ | ✗ |
ボトムバー | ✓ | ✓ | ✓ | ✓ | ✗ |
設定メニュー | ✓ | ✓ | ✓ | ✓ | ✗ |
オプションパネル | ✓ | ✓ | ✓ | ✓ | ✗ |
可視性ルールの説明:
PlayerSurfaceと再生状態は、すべてのシナリオで表示されます (excludedScenesの設定なし)。Coverは、ライブ、制限付き、またはミニマルのシナリオでは表示されません。その他のスロット (
GestureControl、LandscapeHint、CenterDisplay、LogPanel、TopBar、BottomBar、SettingMenu、OptionPanel) は、ミニマルシナリオでのみ表示されません。
ジェスチャー動作の相違点
GestureControlSlot は、currentSceneType に基づいて、各処理メソッド内でジェスチャーを内部的にフィルタリングします。
ジェスチャー | VOD | ライブ | ビデオリスト | 制限付き | ミニマル |
クリック (コントロールバーの表示/非表示) | ✓ | ✓ | ✓ | ✓ | ✗ |
ダブルクリック (再生/一時停止) | ✓ | ✓ | ✓ | ✓ | ✗ |
長押し (早送り再生) | ✓ | ✗ | ✓ | ✗ | ✗ |
水平ドラッグ (再生位置のシーク) | ✓ | ✗ | ✓ | ✗ | ✗ |
左垂直ドラッグ (明るさ) | ✓ | ✓ | ✗ | ✓ | ✗ |
右垂直ドラッグ (音量) | ✓ | ✓ | ✗ | ✓ | ✗ |
フィルターロジックの説明:
ミニマル:すべてのジェスチャー処理メソッド (
handleSingleTap:、handleDoubleTap:、handleLongPress:、およびhandlePan:) は、エントリポイントで即座にreturnを実行します。ライブ / 制限付き:長押しと水平ドラッグは無効になります。これは
handleLongPress:とtryStartDragWithCurrentPoint:でチェックされます。ビデオリスト:垂直ドラッグは無効になります。
tryStartDragWithCurrentPoint:メソッドは、SceneTypeVideoListを検出すると即座にreturnを実行します。
使用方法
基本的な使用方法
AliPlayerModel.sceneType プロパティを使用してシーンタイプを指定できます。デフォルトは SceneTypeVOD で、明示的に設定する必要はありません。
VOD シナリオ (デフォルト、設定不要):
VideoSource *source = [VideoSource urlSourceWithUrl:@"https://example.com/video.mp4"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
// model.sceneType はデフォルトで SceneTypeVOD のため、設定は不要です
[controller configure:model];ライブストリーミングシナリオ:
VideoSource *source = [VideoSource urlSourceWithUrl:@"https://live.example.com/stream.m3u8"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeLive;
model.videoTitle = @"Live Channel";
[controller configure:model];動画リストシナリオ:
VideoSource *source = [VideoSource urlSourceWithUrl:@"https://example.com/video.mp4"];
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeVideoList;
model.videoTitle = @"Video Item";
[controller configure:model];各シナリオの詳細
VOD - VOD シナリオ (デフォルト)
利用シーン:標準的な動画再生、オンラインコース、メディアライブラリの閲覧など。
機能:
11 個すべてのデフォルトスロットに対応します
6 つすべてのジェスチャーに対応します
シーク、再生速度調整、解像度切り替えに対応します
フルスクリーン切り替えに対応します
// SceneType を明示的に指定する必要はありません。デフォルトは VOD です
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.coverUrl = @"https://example.com/cover.jpg";
model.videoTitle = @"Great Video";
model.autoPlay = YES;
[controller configure:model];Live - ライブストリーミングシナリオ
利用シーン:リアルタイムのライブストリーミング、スポーツイベントのライブ配信、ライブコマースなど。
VOD との主な相違点:
無効:ライブストリームには固定の再生時間がないため、シーク (水平ジェスチャー) と再生速度調整 (長押しジェスチャー) は無効になります。
非表示:ライブストリームにはサムネイルが不要なため、サムネイルスロットは非表示になります。
維持:クリック/ダブルクリックジェスチャー、音量/明るさ調整は維持されます。
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:liveSource];
model.sceneType = SceneTypeLive;
model.videoTitle = @"Popular Live Stream";
model.autoPlay = YES;
[controller configure:model];VideoList - 動画リストシナリオ
利用シーン:フィードへの埋め込み動画、ショート動画リスト、スクロール可能な動画コレクションなど。
VOD との主な相違点:
無効:リストの
UIScrollViewスクロールとの競合を避けるため、垂直ドラッグジェスチャーは無効になります。維持:シーク、再生速度調整、クリック/ダブルクリック/長押しジェスチャーなど、他のすべての機能は維持されます。
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeVideoList;
model.autoPlay = YES;
[controller configure:model];Restricted - 制限付き再生シナリオ
利用シーン:オンライン試験の監視動画、トレーニングおよび認定コース、著作権保護シナリオなど。
VOD との主な相違点:
無効:ユーザーがコンテンツを最後まで順番に視聴するように、シーク (水平ジェスチャー) と再生速度調整 (長押しジェスチャー) は無効になります。
非表示:サムネイルスロットは非表示になります。
維持:クリック/ダブルクリックジェスチャー、音量/明るさ調整は維持されます。
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeRestricted;
model.videoTitle = @"Security Training Course";
model.autoPlay = YES;
// 通常、スクリーンショット防止機能と併用されます
model.disableScreenshot = YES;
[controller configure:model];Minimal - ミニマルモード
利用シーン:バックグラウンド再生、完全なカスタム UI、プレビューサムネイル再生など。
VOD との主な相違点:
非表示:ほぼすべての UI コントロールスロットが非表示になります。
PlayerSurfaceとPlayStateのみが維持されます。無効:すべてのジェスチャーが無効になります。
GestureControlスロットはミニマルシナリオでは表示されず、その内部のジェスチャー処理メソッドはすべて即座にreturnします。ユースケース:再生コントロール UI の完全なカスタム実装が必要なシナリオ。
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
[controller configure:model];
// すべてのコントロールは、コントローラーの API を使用して実装する必要があります
// 例:[controller play]; [controller pause]; [controller seekTo:position];カスタム開発
スロットの可視性のファインチューニング
あるシナリオにプリセットされているスロットの可視性が要件を満たさない場合、SlotConfig を使用してファインチューニングできます:
// 例: Live シナリオで TopBar を非表示にする
SlotConfig *topBarConfig = [SlotConfig configWithSlotType:SlotTypeTopBar
excludedScenes:[NSSet setWithObjects:
@(SceneTypeMinimal),
@(SceneTypeLive), nil]];
// SlotManager に登録します (このスロットタイプのデフォルト SlotConfig をオーバーライドします)
[playerView.slotManager registerSlotConfig:topBarConfig];また、hideSlot: を使用してスロット全体を直接非表示にすることもできます。このメソッドはシナリオに依存しません:
// TopBar を無条件で非表示にします (有効にするには rebuildSlots の呼び出しが必要です)
[playerView.slotManager hideSlot:SlotTypeTopBar];registerSlotConfig: はシーンレベルで可視性を制御し、hideSlot: はスロットレベルで可視性を制御します。これらは独立して動作します。スロットは、両方のチェックを通過した場合にのみビルドされます。
ジェスチャー動作のファインチューニング
ジェスチャーコントロールのファインチューニングには、2 つの方法があります:
方法 1: SlotManager の要素ビットマスク API を使用して特定のジェスチャーを無効にします。この方法を推奨します。attach を呼び出す前に設定する必要があります。
// VOD シナリオで、長押しによる早送りを無効にする
[playerView.slotManager hideElements:GestureElementLongPress
forSlot:SlotTypeGestureControl];方法 2: GestureControlSlotConfig を使用してジェスチャーを直接制御します。attach を呼び出した後にスロットインスタンスを取得する必要があります:
// ジェスチャーコントロールスロットのインスタンスを取得する
GestureControlSlot *gestureSlot = (GestureControlSlot *)[playerView.slotManager slotViewForType:SlotTypeGestureControl];
// 設定を変更します (即座に有効になります)
GestureControlSlotConfig *config = [GestureControlSlotConfig defaultConfig];
config.longPressEnabled = NO;
config.horizontalDragEnabled = NO;
gestureSlot.config = config;2 つの方法は独立して動作します。要素ビットマスクはスロットがビルドされるとき ( setupContentView フェーズ中) に適用されます。GestureControlSlotConfig はランタイムに動的に有効になります。
Minimal シナリオでのカスタムスロットの登録
Minimal シナリオでは、ほとんどのデフォルトスロットはシーン設定によって除外されます。スロットを復元するには、その SlotConfig をオーバーライドします:
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
// BottomBar のシーン設定をオーバーライドして、Minimal 除外ルールを削除します
[playerView.slotManager registerSlotConfig:
[SlotConfig configWithSlotType:SlotTypeBottomBar]]; // excludedScenes がない = すべてのシナリオで表示
[controller configure:model];動的な可視性条件
SlotConfig の visibilityCondition コールバックを使用して、ランタイムに動的な制御を実装できます:
SlotConfig *coverConfig = [SlotConfig configWithSlotType:SlotTypeCover
excludedScenes:nil
visibilityCondition:^BOOL{
// カバー URL が存在する場合にのみカバースロットを表示する
return model.coverUrl != nil;
}];
[playerView.slotManager registerSlotConfig:coverConfig];isVisibleInScene: メソッドは、まず excludedScenes をチェックします。一致が見つかった場合、スロットは表示されません。次に、メソッドは visibilityCondition をチェックします。このコールバックが NO を返すと、スロットは表示されません。スロットは、両方のチェックを通過した場合にのみ表示されます。
シーン選択ガイド
決定フロー
プレーヤーコントロール UI が必要ですか?
├── いいえ → SceneTypeMinimal
└── はい → ライブストリームですか?
├── はい → SceneTypeLive
└── いいえ → プレーヤーはスクロール可能なリストに埋め込まれていますか?
├── はい → SceneTypeVideoList
└── いいえ → ユーザーのスキップを防止する必要がありますか?
├── はい → SceneTypeRestricted
└── いいえ → SceneTypeVOD (デフォルト)シーン選択の概要表
ビジネス要件 | 推奨シナリオ | 主な理由 |
標準的なビデオ再生 |
| デフォルトのシナリオであり、すべての機能をサポートします。 |
ライブストリーム / リアルタイムのスポーツイベント |
| 該当しない進捗操作を自動的に無効化します。 |
UIScrollView に埋め込まれた動画 |
| 垂直ジェスチャーの競合を自動的に回避します。 |
トレーニング / 試験 / 著作権保護 |
| スキップと再生速度の調整を自動的に無効化します。 |
完全なカスタム UI |
| 組み込み UI の干渉がない、クリーンなキャンバスを提供します。 |
バックグラウンド / ピクチャーインピクチャー (PiP) 再生 |
| UI コントロールコンポーネントが不要です。 |
API クイックリファレンス
SceneType 列挙型
列挙値 | 整数値 | 説明 |
| 0 | VOD シナリオ (デフォルト) |
| 1 | ライブストリーミング シナリオ |
| 2 | 動画リスト/ショートビデオストリーム シナリオ |
| 3 | 制限付き再生シナリオ |
| 4 | ミニマル再生ページ シナリオ |
SlotConfig
メソッド / プロパティ | 説明 |
| 除外シーンのない設定を作成します (すべてのシナリオで表示) |
| 指定された除外シーンを持つ設定を作成します |
| 除外シーンと動的条件を持つ設定を作成します |
| スロットタイプ ( |
| 除外されたシーンのセット、 |
| 動的な可視性条件ブロック ( |
| 指定されたシナリオでスロットが表示されるかどうかを確認します |
GestureControlSlotConfig
プロパティ | タイプ | デフォルト値 | 説明 |
|
|
| クリックジェスチャーを有効または無効にします |
|
|
| ダブルクリックジェスチャーを有効または無効にします |
|
|
| 長押しジェスチャーを有効または無効にします |
|
|
| 水平ドラッグジェスチャーを有効または無効にします |
|
|
| 左垂直ドラッグジェスチャーを有効または無効にします |
|
|
| 右垂直ドラッグジェスチャーを有効または無効にします |
| クラスメソッド | — | すべてのジェスチャーが有効なデフォルト設定を作成します |
SlotManager シナリオ関連 API
メソッド | 説明 |
| スロットタイプのシーン可視性設定を登録します (デフォルト設定を上書きします) |
| 指定されたスロットタイプのシーン設定を削除します (削除後は、デフォルトで表示されるようになります) |
| 指定されたスロットタイプのシーン可視性設定を取得します |
| 指定されたスロットを非表示にします (スロットレベル、シーン設定とは独立) |
| 以前に非表示にしたスロットを表示します |
| ビットマスクを使用してスロット内の要素を非表示にするか、ジェスチャーを無効にします |
| ビットマスクを使用してスロット内の要素を表示するか、ジェスチャーを有効にします |
| マウントされたスロットのビューインスタンスを取得します |
| すべてのスロットを再構築します (シーン設定の変更後に呼び出す必要があります) |
関連ファイル
ファイル | 説明 |
| SceneType 列挙型の定義 |
| シーンタイプを設定するためのエントリーポイント ( |
| スロットの可視性設定 |
| デフォルトのスロットプロバイダーとシーン可視性ルール |
| スロットシステムの統一された管理エントリーポイント |
| ジェスチャー要素のビットマスク定義 |
| ジェスチャーコントロールスロットと |
| スロットの基底クラス ( |
詳細については、「API リファレンス」をご参照ください。
ベストプラクティス
注意事項
項目 | 説明 |
作成時に決定 |
|
リストシナリオを優先 | プレーヤーを |
|
|
組み合わせ可能なファインチューニング | プリセットの動作が要件を完全に満たさない場合、 |
ライブと | ジェスチャーフィルタリングルールは同じです (プログレスシークと再生速度の調整が無効になります)。違いはサムネイルの可視性 (両方とも非表示) とビジネスセマンティクスのみです。 |
よくある質問
ビデオオンデマンドとビデオリストの違いは何ですか?
主な違いは垂直ジェスチャーです。SceneTypeVideoList は、リストコンテナのスクロールジェスチャーとの競合を避けるため、音量と輝度の垂直ジェスチャーを無効にします。その他の機能はビデオオンデマンドと同じです。
ミニマルシナリオでカスタムコントロールを実装するにはどうすればよいですか?
AliPlayerController API を使用して、再生動作を直接制御できます。カスタムスロットを登録して UI をオーバーライドすることもできます。
AliPlayerModel *model = [[AliPlayerModel alloc] initWithVideoSource:source];
model.sceneType = SceneTypeMinimal;
[controller configure:model];
// コントローラー API を通じて直接制御
[controller play];
[controller pause];
[controller seekTo:30000]; // 30 秒にシークライブシナリオでプログレスシークを復元するにはどうすればよいですか?
ライブストリーミングシナリオがタイムシフトをサポートしている場合、SlotManager の要素制御 API を使用して、無効化されたジェスチャーを復元できます。
// 水平ドラッグジェスチャー (プログレスシーク) を復元
[playerView.slotManager showElements:GestureElementHorizontalDrag
forSlot:SlotTypeGestureControl];このメソッドは要素レベルの可視性のみを復元します。GestureControlSlot 内部のシーンフィルタリングロジックはハードコーディングされており、showElements: を使用してバイパスすることはできません。ジェスチャー動作を完全にカスタマイズするには、GestureControlSlotConfig を使用するか、GestureControlSlot を置き換えることができます。