ハイライト
SharePlay の調整された再生は、広告およびインタースティシャル コンテンツのシナリオをサポートします: パス
AVPlayerPlaybackCoordinatorDelegate一致する広告時間範囲をマークするsuspensionReasonsThatTriggerWaiting待機ポリシーを設定して、さまざまな参加者がさまざまな長さの広告を視聴した後に自動的に同期を再開できるようにします。
主要内容
問題: 広告により同期再生が複雑になる
あなたと友達は FaceTime で一緒に番組を見ていますが、進行状況はまったく同じです。しかし、あなたは異なる地域にいて、異なる広告が表示されます。あなたの広告は 15 秒、彼の広告は 30 秒で、広告をまったく見ない人もいます。 CMが終わった後、全員の立場が混乱した。
SharePlay の基本的な連携再生は非常に簡単です。groupSessionに関連したplaybackCoordinator、全員の再生制御命令はリアルタイムで同期されます。しかし、広告では、全員の「プレゼンテーション タイムライン」に異なるコンテンツが挿入されるため、この一貫性が崩れます。
2 つのユーザー エクスペリエンス戦略
広告の継続時間が一貫していない場合、それに対処する方法は 2 つあります。
待機戦略: 最初に広告を見終わった人は、全員が見終わるまで待ってから一緒に続けます。メリットはメインコンテンツを見逃すことがないことですが、デメリットは待っている人が一時停止画面を見つめなければならないことです。
キャッチアップ戦略: 先に広告の視聴を終えたユーザーはメイン コンテンツの視聴を続けますが、他のユーザーは広告終了後に飛びついて追いつきます。スムーズで待ち時間がないのがメリットですが、人によっては番組内容の一部を見逃してしまう可能性があるのがデメリットです。
これら 2 つの戦略は成功しますsuspensionReasonsThatTriggerWaitingアレイ構成。デフォルトの動作は待機せず (追いつき戦略)、"playingInterstitial"配列に追加すると、待機戦略が有効になります。
ステッチされた広告: 期間を手動でマークする
VOD コンテンツの場合、広告セグメントはメインの HLS プレイリストに直接結合されます (不連続タグで区切られています)。開発者は次のことを行う必要がありますAVPlayerPlaybackCoordinatorDelegateどの時間範囲が広告であるかをシステムに伝えます。
システムがこれらの時間範囲を取得した後、参加者は広告期間に入るときに設定された待機ポリシーに従って処理されます。誰かが進行状況バーを広告範囲にドラッグすると、SharePlay グループ全体がその広告の先頭にジャンプします。
重要な制約が 1 つあります。SharePlay では、メイン コンテンツ (実際の番組から広告を除いたもの) が同じ長さである必要があります。広告は異なっていてもかまいませんが、長編映画は同じ長さでなければなりません。
HLS インタースティシャル: より柔軟な広告スケジュール
WWDC21 で導入された HLS インタースティシャルは、広告をメイン コンテンツのタイムラインとは別のオブジェクトとして扱います。広告はマルチビットレートのプレイリスト URI を通じて参照され、サーバー側で挿入したり、AVFoundation API を使用してクライアント側で動的にスケジュールしたりできます。
HLS インタースティシャルを使用する場合、AVFoundation は調整された再生を自動的に処理するため、開発者は待機戦略を構成するだけで済みます。この方法は、動的なターゲットを絞った広告やライブ ブロードキャストのシナリオに適しています。
ベストプラクティス
ライブ ブロードキャストのシナリオで、広告がない人もいれば広告がある人もいる場合は、HLS インタースティシャルを使用し、デフォルトの待機ポリシーを追加することをお勧めします。広告がない人は引き続きライブ配信を視聴でき、広告がある人は終了後に自動的に追いつきます。これはスポーツ イベントのライブ ブロードキャストでは非常に実用的です。広告のないユーザーはライブ映像を視聴し、広告のあるユーザーは試合開始に間に合うように戻ってきます。
VOD シナリオでコンテンツの整合性が重要な場合は、待機戦略をお勧めします。お待ちの間もご利用いただけますGroupSessionMessenger広告スケジュールを共有して待っているユーザーに待ち時間を知らせ、別のプレーヤーを使用して予告編やその他のコンテンツを表示して、ユーザーの関心を維持します。
詳細
広告の時間範囲をマークする
(05:13)
class MyAVPlayerCoordinatorDelegate: NSObject, AVPlayerPlaybackCoordinatorDelegate {
func playbackCoordinator(
_ coordinator: AVPlayerPlaybackCoordinator,
interstitialTimeRangesFor playerItem: AVPlayerItem
) -> [NSValue] {
return interstitialTimeRanges
}
}
キーポイント:
- 成し遂げる
AVPlayerPlaybackCoordinatorDelegateプロトコル interstitialTimeRangesFor戻る[NSValue]、各要素は次のように表されます。NSValue(timeRange:)パッケージ化されたCMTimeRange- これらの時間範囲は、実際のメディアの長さに基づいて計算されたサンプル精度である必要があります。
- ステッチされた広告の場合、時間範囲は通常、HLS プレイリストを合計することによって蓄積されます。
EXTINFラベルの継続時間を取得します
待機戦略を構成する
// 启用等待策略:看完广告的人等其他人
playbackCoordinator.suspensionReasonsThatTriggerWaiting = ["playingInterstitial"]
// 默认行为(追赶策略):不等待
playbackCoordinator.suspensionReasonsThatTriggerWaiting = []
キーポイント:
suspensionReasonsThatTriggerWaitingどの一時停止理由が待機をトリガーするかを決定する"playingInterstitial"インタースティシャル コンテンツ (広告) の再生中に他の参加者が待機していることを示します- 待っている間
player.timeControlStatusなる.waitingToPlayAtSpecifiedRate player.reasonForWaitingToPlayのために.waitingForCoordinatedPlayback
待機ステータスを確認する
if player.timeControlStatus == .waitingToPlayAtSpecifiedRate,
player.reasonForWaitingToPlay == .waitingForCoordinatedPlayback {
// 用户正在等待其他参与者
showWaitingUI()
}
GroupSessionMessenger を使用して広告スケジュールを共有する
import GroupActivities
// 发送广告排期
let messenger = GroupSessionMessenger(session: groupSession)
try await messenger.send(adSchedule)
// 接收广告排期
Task {
for await (schedule, participant) in messenger.messages(of: AdSchedule.self) {
updateWaitingTime(with: schedule)
}
}
キーポイント:
GroupSessionMessengerSharePlay参加者間でカスタムデータを渡す- 広告スケジュールを共有すると、待っている人はどれくらい待たなければならないかを正確に知ることができます。
- ユーザーエクスペリエンスを向上させるために、待ち時間中に他のコンテンツを表示できます
HLS インタースティシャル プレイリストの例
HLS インタースティシャルはメイン コンテンツのプレイリストで使用されますEXT-X-DATERANGEラベルタグ広告:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:10
#EXT-X-DATERANGE:ID="ad1",CLASS="com.apple.hls.interstitial",
START-DATE="2022-06-06T12:00:00Z",
X-ASSET-URI="https://example.com/ad-variant.m3u8"
#EXTINF:10,
segment1.ts
#EXTINF:10,
segment2.ts
キーポイント:
EXT-X-DATERANGEのCLASSに設定"com.apple.hls.interstitial"X-ASSET-URI広告を指すマルチビットレートのプレイリスト- AVFoundation はこれらのタグを自動的に解析して処理するため、時間範囲を手動でマークする必要はありません
重要ポイント
1.動画アプリで一緒に視聴できるSharePlay機能を追加
- 内容: ユーザーが FaceTime 通話中にアプリ内のビデオ コンテンツを同時に視聴できるようにします
- 価値がある理由: SharePlay は一人での視聴をソーシャル体験に変えます。
AVPlaybackCoordinator複雑な同期の大部分を処理し、アクセスコストを低く抑えます。 - 開始方法: 作成する
GroupActivity何を共有できるかを定義するには、次を使用します。GroupSessionセッションを管理し、groupSessionに関連したAVPlayerのplaybackCoordinator
2.階層型サブスクリプションビデオサービスを構築する
- やるべきこと: SharePlay をサポートしながら、無料ユーザーは広告を視聴でき、有料ユーザーは広告を回避できるサブスクリプション モデルを設計します。
- 実行する価値がある理由:
suspensionReasonsThatTriggerWaitingさまざまなレベルのユーザーが一緒に視聴できるようにし、待機期間中に有料ユーザーに追加のコンテンツを表示します。 - 開始方法: HLS インタースティシャルを使用して広告をスケジュールし、デフォルトの待機ポリシーを構成し、
GroupSessionMessenger参加者間でサブスクリプションレベル情報を同期する
3.ライブ イベントのソーシャル視聴エクスペリエンス
- 対処法: スポーツ イベントがライブ配信されるときに、異なる地域のユーザーが一緒に視聴できるようにし、それぞれにローカライズされた広告が表示されるようにします。
- 実行する価値がある理由: HLS インタースティシャルとデフォルトの待機ポリシーにより、広告のないユーザーはシーンの視聴を続けることができ、広告のあるユーザーは終了後に自動的に追いつくため、重要な瞬間を見逃すことはありません
- 開始方法: サーバーを使用して HLS インタースティシャルを挿入し、地域ごとに異なる広告プレイリストを返します。クライアントは同期を処理するために追加のコードを必要としません。
4.待機期間中のインタラクティブなコンテンツ
- 内容: SharePlay で他のユーザーが広告を終了するのをユーザーが待っている間、静的な待機画面の代わりにインタラクティブなコンテンツを表示します。
- 実行する価値がある理由:
GroupSessionMessenger広告スケジュールを共有できるため、待ち時間を正確に知ることができ、2 番目のプレーヤーは予告編、アウトテイク、またはインタラクティブな投票を表示します。 - 開始方法: モニタリング
timeControlStatus変更、待機状態になったらバックアッププレイヤーに切り替え、受信GroupSessionMessenger待機中のカウントダウンは、スケジュールされたメッセージの後に更新されます
関連セッション
- 優れた SharePlay エクスペリエンスを実現する — 優れた SharePlay エクスペリエンスを構築するための設計原則とベスト プラクティス
- SharePlay でのメディア再生の連携 — SharePlay 連携再生の基本実装ガイド
- アダプティブ ビットレートの HLS バリアントを探索する — HLS マルチビットレート プレイリストと動的コンテンツ スケジューリング
- AVFoundation の最新情報 — AVFoundation の非同期 API とリアクティブ メディア処理
コメント
GitHub Issues · utterances