WWDC Quick Look 💓 By SwiftGGTeam
Explore AirPlay with interstitials

Explore AirPlay with interstitials

元の動画を見る

ハイライト

Apple は、WWDC23 で HLS インタースティシャルと AirPlay の統合機能を拡張しました。開発者ができることAVPlayerInterstitialEventrestrictionsこのプロパティは、広告再生時のナビゲーション制限 (スキップ/ジャンプ) を制御します。これらの制限は、コードを追加で適応させることなく、AirPlay レシーバー (サードパーティのスマート TV を含む) に自動的に同期されます。

主要内容

インタースティシャルと AirPlay の問題点

ビデオ アプリケーションでは、多くの場合、メインの映画の前後、または途中に広告や予告編などの二次コンテンツを挿入する必要があります。従来のソリューションでは、これらのインタースティシャルは主要なコンテンツと混合されているため、動的に置き換えたり正確に制御したりすることが困難になります。

HLS インタースティシャルは広告を独立したアセットとして扱い、機能タイムライン上の再生ポイントをマークします。再生がマークされた位置に達すると、自動的に広告コンテンツに切り替わります。広告が終了すると、メインのクリップ ポイントに戻り、再生が継続されます。

この方法は、VOD とライブ ブロードキャストの両方のシナリオをサポートしており、機能コンテンツ自体を変更する必要はありません。広告は動的にスケジュール、キャンセルすることができ、レイト バインディング (再生が近づくまでどの広告を表示するかを決定する) もサポートしています。

ナビゲーション制限によるクロスデバイス同期の問題

広告の再生には多くの場合、契約上の制約があり、ユーザーは広告をスキップしたり、広告間を自由に移動したりすることはできません。 HLS インタースティシャルには、次の 2 つのナビゲーション制約が組み込まれています。

  • スキップ: 標準以外のレートでの広告を無効にします (早送りスキップを防止します)。
  • ジャンプ: 現在のアドバタイズメントからのジャンプを無効にします (シークのスキップを防止します)。

これら 2 つの制限は、単独で使用することも、組み合わせて使用​​することもできます。問題は、ユーザーが AirPlay 経由でスマート TV にビデオをキャストすると、TV では AVFoundation コードではなく受信機ファームウェアが実行されることです。開発者はかつて、AirPlay レシーバー用に追加の適応コードを作成する必要があるのではないかと心配していました。

Apple の答えは次のとおりです。いいえ。サーバー側 (HLS プレイリスト) を渡すだけです。X-RESTRICTプロパティ) またはクライアント (AVPlayerInterstitialEvent.restrictions)にナビゲーション制限が設定されている場合、AirPlay はこれらの制限を受信側に自動的に転送して実行します。

複数のサブスクリプション プランでのサーバーの再利用

一般的な VOD サービスには 3 つのサブスクリプション プランがあります。

  • プラン A: 広告がある場合、許可される操作は再生/一時停止のみです
  • プラン B: 広告なし
  • プラン C: 最初の広告を視聴した後、後続の広告をスキップできます

開発者は、同じ HLS プレイリストを使用してすべてのユーザーにサービスを提供できます。

  • プラン A ではクライアントの変更は必要なく、プレイリストの制限ルールが直接有効になります。
  • プラン B がクライアントに設定されているautomaticallyHandlesInterstitialEvents = false、プレイリストで設定されたすべての挿入イベントを無視します。
  • プラン C クライアント上の 2 番目のアドバタイズメントをコピーして変更するrestrictionsプロパティ、スキップ制限をクリアします

これにより、サーバー側の複雑さが大幅に軽減され、同じプレイリストが複数のビジネス モデルに適しています。

詳細

クライアントドライバー: スキップ制限の設定

09:19

let player = AVPlayer(url: movieURL) // 正片,不含广告
let controller = AVPlayerInterstitialEventController(primaryPlayer: player)

let ad1Item = [AVPlayerItem(url: ad1Url)]
let ad1event = AVPlayerInterstitialEvent(
    primaryItem: player.currentItem,
    time: CMTime(seconds: 5, preferredTimescale: 1)
)
ad1event.identifier = "ad1"
ad1event.templateItems = ad1Item

// 设置 SKIP 限制:禁止快进跳过广告
ad1event.restrictions = [.requiresPlaybackAtPreferredRateForAdvancement]

controller.events = [ad1event]

キーポイント:

  • AVPlayerInterstitialEventControllerフィーチャー プレーヤーの挿入イベントのスケジュールを担当します。 -AVPlayerInterstitialEventメインの映画タイムライン上のインタースティシャル コンテンツの位置を定義します -templateItemsブレークの内容を指定します (複数のポッドを指定できます) -restrictionsに設定.requiresPlaybackAtPreferredRateForAdvancementつまり、スキップ制限です。ユーザーは早送りやスキップができません。

サーバー側の制限を無効にする: プラン C の実装

15:44

let player = AVPlayer(url: movieURL)
let controller = AVPlayerInterstitialEventController(primaryPlayer: player)

let ad1Event = controller.events[0]
let ad2Event = controller.events[1]

let newEvent = ad2Event.copy() as! AVPlayerInterstitialEvent
// 清除 ad2 的限制
newEvent.restrictions = []

// 用原始 ad1 和修改后的 ad2 更新控制器
controller.events = [ad1Event, newEvent]

キーポイント:

  • コントローラーからディスパッチされたイベントを取得します (おそらくサーバーのプレイリストから) -copy()イベントのコピーを作成して変更するrestrictionsプロパティ
  • クリアrestrictionsその後、ad2 の再生中にユーザーは自由にスキップできます
  • 最後に、変更したイベント配列をコントローラーに再割り当てします。

AirPlay レシーバーの切り替え遅延を短縮します。

09:46

AirPlay レシーバーは、Apple TV、セットトップ ボックス、スマート TV、スピーカーなどのさまざまなデバイスをカバーしており、ハードウェアとコーデックの機能は大きく異なります。長編映画と広告のエンコード パラメータが一致しない場合、受信側でデコーダを切り替えるときに大幅な遅延が発生します。

メイン フィルムとインタースティシャル コンテンツのメディア パラメータを一貫した状態に保つことをお勧めします。

ビデオオーディオ
エンコード形式(AVC/HEVC)エンコード形式(AACなど)
フレームレートサンプリング周波数
アスペクト比ビット深度
チャンネルレイアウト

さらに、同期再生を確実に行うには、すべてのメディア コンポーネント (オーディオ、ビデオ、字幕) のタイムスタンプを正確に揃える必要があります。

オーディオトラックと字幕の自動マッチング

11:30

インタースティシャル コンテンツにメイン映画と同様のオーディオ トラックと字幕トラックがある場合、システムは再生用に一致するトラックを自動的に選択します。この動作はローカル再生セッションと AirPlay セッション全体で一貫しており、追加のコードは必要ありません。

AirPlay テストに関する提案

11:53

テスト スイートはさまざまなシンクをカバーする必要があります。

  • Apple TVから始めますが、Apple AirPlay以外の受信デバイスを少なくとも1つ選択してください
  • メディア処理機能による分類: ハイエンド (Dolby Vision をサポート) とローエンド (SDR + ステレオ AAC のみをサポート)
  • アプリが iPhone ユーザーのみを対象としている場合でも、さまざまなレベルの受信機をテストしてください

重要ポイント

1. 同じプレイリストを使用して多層サブスクリプション モードをサポートします

やるべきこと: ビデオ アプリに 3 つのサブスクリプション プランを実装します: 「広告付き無料 / 広告削除は有料 / 高度なスキップ可能」。

実行する価値がある理由: HLS インタースティシャルを使用すると、クライアントがサーバー構成をオーバーライドできます。サーバーはプレイリストを維持するだけでよく、クライアントはユーザーのサブスクリプション レベルに基づいて広告戦略を動的に調整します。

起動方法: アプリケーション起動時にユーザーの購読状況に応じて設定しますautomaticallyHandlesInterstitialEvents、またはプレーヤーの初期化後にトラバースしますcontroller.events各イベントを変更するrestrictions

2. AirPlay ユーザーの広告エクスペリエンスを最適化する

対処方法: ユーザーが AirPlay 状態であるかどうかを検出し、キャスト時にエンコード パラメータが一致するクリエイティブを自動的に選択します。

価値がある理由: AirPlay 受信機によってデコード機能は大きく異なります。長編映画と広告のエンコード パラメータを一貫して維持すると、切り替え遅延が大幅に削減され、視聴エクスペリエンスが向上します。

開始方法: パスAVPlayer.externalPlaybackActive現在の受信機の機能に基づいて AirPlay ステータスを検出します (送信可能)AVPlayerItempreferredPeakBitRateおよびその他の属性推論)を使用して、コード レートに対応するクリエイティブを選択します。

3. 視聴履歴に基づいた広告リダイレクトを実装する

機能: ユーザーがすでに視聴したクリップに巻き戻すと、自動的に新しい広告に置き換えられます。

実行する価値がある理由: HLS インタースティシャルは遅延バインディングと再バインドをサポートしています。これにより、再生が広告マークに近づいたときにどの広告を表示するかを決定でき、同じコンテンツが繰り返し表示されるのを回避できます。

開始方法: モニタリングAVPlayerInterstitialEventMonitorイベント、でinterstitialEventWillPlayコールバック内のユーザーの視聴履歴に応じて動的に更新されますtemplateItems

4. ライブ ブロードキャスト シーンにリアルタイム広告を挿入する

手順: 広告によってライブ ブロードキャストの時間を遅らせることなく、ライブ ストリームに広告を動的に挿入します。

実行する価値がある理由: HLS インタースティシャルはライブ ブロードキャスト シナリオをサポートしています。コマーシャルが終了すると、長編映画はライブ ブロードキャストの現在の時点にジャンプし、広告によるライブ ブロードキャストの遅延が蓄積されることはありません。

開始方法: ライブ プレイリストに挿入しますEXT-X-DATERANGEタグを付けるか、使用しますAVPlayerInterstitialEventresumptionOffsetプロパティは、ライブ ブロードキャストを再開する場所を制御します。

関連セッション

コメント

GitHub Issues · utterances