ハイライト
iOS 16 のシステム メディア プレーヤーには、カスタマイズ可能な再生速度メニュー、インタースティシャル広告のより強力なサポート、AVPlayerViewController によって提供されるメタデータ表示の最適化が導入されており、開発者はプレーヤー UI を再構築することなく、システムのネイティブ機能を直接利用してメディア アプリケーションの再生エクスペリエンスを向上させることができます。
主要内容
iOS 16 より前は、ユーザーがビデオの再生速度を調整したり、インタースティシャルをサポートしたり、再生インターフェイスでより豊富なメタデータを表示したりしたい場合は、プレーヤー UI 全体を書き直すことがほとんど運命にありました。 Apple は長い間 AVPlayerViewController を提供してきましたが、そのカスタマイズ機能は常に制限されていました。開発者は 2 つの選択肢に直面します。システム プレーヤーの固定動作を受け入れるか、完全なプレーヤーを最初から構築するかのいずれかです。独自のものを作成するには、バッファー インジケーター、再生コントロール、時間表示、ピクチャー イン ピクチャー、字幕トラックの選択、オーディオ トラックの選択、AirPlay 共有など、膨大な詳細を扱う必要があり、作成には時間がかかり、バグが発生しやすくなります。 (00:45)
iOS 16 ではそれが変わります。 Apple は AVPlayerViewController の API を拡張し、開発者が自分で UI を保守しなくてもシステム プレーヤーにカスタム関数を直接マウントできるようにしました。これには、(1.0x、1.25x、1.5x、2.0x の固定オプションだけではなく) 再生速度メニューにカスタム ギアを追加できることが含まれます。 AVPlayerInterstitialEventController を使用して、インタースティシャル広告の再生ロジックを管理できます。 externalMetadata を通じて、プレーヤーにタイトル、サブタイトル、説明情報を表示できます。 (01:30)
これらの改善の重要性は、「システム プレーヤーの使用」と「カスタマイズされたエクスペリエンスの提供」が、もはや二者択一の関係ではなくなることです。重要なポイントでアプリの特性を具体化しながら、Apple のプレーヤー インタラクションの継続的な最適化 (新しいデバイスへの適応、アクセシビリティのサポート、システム機能との統合を含む) を引き続き利用できます。これはメディア アプリケーションにとって特に重要です。ユーザーはプレーヤーに対して明確な期待を持っており、システムの動作方法に慣れていますが、アプリケーション プロバイダーは独自のブランド情報、広告ロジック、または機能を表示する必要があります。 (02:15)
このセッションの中心は、過剰なカスタマイズを行わずに、最小限のコードでこれらの一般的なプレーヤー要件を実装する方法を示すことです。スピーカーは、完全なカスタム プレーヤーを作成する方法を教えません (Apple はシステムによって提供されるプレーヤーを使用することを推奨しているため) が、アプリのニーズを満たすようにシステム プレーヤーを拡張する方法を教えます。 (02:45)
詳細
プレーヤーのメタデータを設定する
(03:30) AVPlayerViewController を使用して URL を再生する場合、デフォルトでは、プレーヤー インターフェイスには時間や再生ボタンなどの基本的なコントロールのみが表示されます。何を放送しているのか分かりません。 iOS 16 では、externalMetadata を通じて AVPlayerItem のメタデータを設定でき、この情報はプレーヤーの情報パネルに自動的に表示されます。
具体的な方法は、各項目がメタデータの一部を表す AVMutableMetadataItem 配列を作成することです。 Apple は、フィールド タイプを指定するための標準の識別子定数を提供しています。タイトルは次のとおりです。.commonIdentifierTitle、字幕用.iTunesMetadataTrackSubTitle、説明するために使用されます.commonIdentifierDescription。コードは次のとおりです。
let titleItem = AVMutableMetadataItem()
titleItem.identifier = .commonIdentifierTitle
titleItem.value = "WWDC 2022 Session 10147"
let subtitleItem = AVMutableMetadataItem()
subtitleItem.identifier = .iTunesMetadataTrackSubTitle
subtitleItem.value = "Create a great video playback experience"
let infoItem = AVMutableMetadataItem()
infoItem.identifier = .commonIdentifierDescription
infoItem.value = "学习如何利用 iOS 16 的系统媒体播放器构建优秀的媒体应用体验。"
playerItem.externalMetadata = [titleItem, subtitleItem, infoItem]
キーポイント:
AVMutableMetadataItemのidentifierこのメタデータのタイプを決定し、システムによって提供される定数を使用する必要があります。valueメタデータ仕様に準拠する文字列またはその他のタイプを指定できますexternalMetadata配列を受け入れ、さらにフィールドを追加できます (アートワーク、作者情報など)。- この情報は AVPlayerViewController の情報パネルに自動的に表示されます。追加の UI コードは必要ありません。
ミッドロール広告を管理する
(17:00) インタースティシャル広告は、プレロール広告、エンドオブクレジット広告、プログラム間の広告など、メディア アプリケーションの一般的な要件です。 iOS 16 より前は、再生タイミング、スキップ ロジック、メイン コンテンツとの接続を自分で管理する必要がありました。 AVPlayerInterstitialEventController は、これらのシナリオを処理するための宣言型 API を提供するようになりました。
基本的な考え方は、AVPlayerInterstitialEventController、それをメイン プレーヤーにバインドし、挿入イベントを宣言します。それぞれAVPlayerInterstitialEventオブジェクトは、広告コンテンツ (primaryItem) とトリガー時間 (time) を含む挿入を表します。また、イベントに制限を設定して、早送りの禁止やスキップの禁止など、広告再生中の動作制限を指定することもできます。
let eventController = AVPlayerInterstitialEventController(primaryPlayer: mediaPlayer)
let event = AVPlayerInterstitialEvent(primaryItem: interstitialItem, time: .zero)
event.restrictions = [
.requiresPlaybackAtPreferredRateForAdvancement,
.constrainsSeekingForwardInPrimaryContent
]
eventController.events.append(event)
キーポイント:
AVPlayerInterstitialEventController初期化はメイン プレーヤーに渡す必要があります。これにより、挿入イベントがメイン プレーヤーのライフ サイクルに関連付けられます。AVPlayerInterstitialEventのprimaryItem広告コンテンツの AVPlayerItem です。timeメイン コンテンツのどの時点に挿入するかを指定します (.zero広告を最初から開始することを示します)restrictions動作制約の配列です。requiresPlaybackAtPreferredRateForAdvancementユーザーは続行する前に通常の再生速度で広告を視聴する必要があります。constrainsSeekingForwardInPrimaryContent広告再生中のメインコンテンツの早送りを無効にする- 尋ねることができます
eventController.eventsプレロール広告 + プログラム ギャップ広告 + エンドオブクレジット広告など、複数のインタースティシャル イベントを追加します。
(18:20) コマーシャル休憩のもう 1 つの一般的なシナリオは、「5 秒後にスキップ可能」です。これには、インタースティシャル イベントの表示ステータスを監視し、UI にスキップ ボタンを表示し、ユーザーがクリックしたときにそれを呼び出す必要があります。cancelCurrentEvent。 AVPlayerViewController はデリゲートを通じてコールバックしますplayerViewController(_:willPresent:)休憩の表示が間もなく開始されることを通知します。この時点でタイマーを開始できます。
func playerViewController(playerViewController: AVPlayerViewController, willPresent interstitial: AVInterstitialTimeRange) {
showSkipButton(afterTime: 5.0, onPress: {
eventController.cancelCurrentEvent(withResumptionOffset: CMTime.zero)
})
}
キーポイント:
willPresentコールバックは挿入の開始時にトリガーされ、パラメーターは挿入の時間範囲情報です。- 自分で実装する必要があります
showSkipButton5秒のカウントダウンとボタンUIを含むロジック cancelCurrentEvent(withResumptionOffset:)中断はただちに終了します。withResumptionOffset再開するメインコンテンツの時点を指定します (.zeroゼロから始めるという意味です)- スキップ ロジックは自分で処理する必要があります。システムは自動的にスキップ ボタンを提供しません。
カスタム再生速度
(20:00) システム プレーヤーは、デフォルトで 1.0x、1.25x、1.5x、2.0x の 4 つの再生速度を提供します。 iOS 16 では次のことが可能になりますAVPlaybackSpeedカスタムギアを追加します。これは、長い形式のビデオ アプリケーションに役立ちます。ユーザーが視聴するには 0.5 倍、素早く閲覧するには 3.0 倍が必要な場合があります。
AVPlaybackSpeed次の 2 つのプロパティがあります。rate実際の再生速度です。localizedNameUI に表示される名前です。カスタム速度オブジェクトを作成して追加できます。AVPlayerViewController.speeds配列:
let player = AVPlayerViewController()
player.player = mediaPlayer
present(player, animated: true)
let newSpeed = AVPlaybackSpeed(rate: 2.5, localizedName: "Two and a half times speed")
player.speeds.append(newSpeed)
キーポイント:
AVPlaybackSpeedのrateはいDoubleタイプ、1.0 は通常速度、0.5 は半分の速度、2.0 は 2 倍の速度を意味しますlocalizedNameスピードメニューに表示されます。中国語、英語、その他の言語を使用できます。- に追加
speeds配列を選択すると、新しい速度オプションがプレーヤー速度メニューに自動的に表示されます。 - 複数のカスタムギアを追加でき、システムはそれらを配列内の順序で表示します。
(22:00) 再生速度機能がまったく必要ない場合 (たとえば、アプリケーションが短いビデオの場合、デフォルトで自動的に再生され、ユーザーが速度を調整する必要はありません)、速度メニューを直接非表示にすることができます。その方法は、speeds配列クリア:
let player = AVPlayerViewController()
player.player = mediaPlayer
present(player, animated: true)
player.speeds = []
キーポイント:
- クリア
speedsArray は速度メニュー全体を削除し、速度コントロールはプレーヤー インターフェイスに表示されなくなります。 - ギアを 1 つずつ取り外すよりも簡単です。
- メディアの種類自体が速度調整を必要としない場合 (音楽、特定のシーンのビデオなど)、非表示にすることで UI を簡素化できます。
重要ポイント
iOS 16 プレーヤーのこれらの新機能に基づいて、次の機能を直接実装できます。
-
教育アプリに「集中視聴モード」と「クイックブラウズモード」を追加——利用する
AVPlaybackSpeed0.75x や 0.5x などの集中読書ギア、2.5x や 3.0x などのクイックブラウジングギアを追加し、ユーザーは学習ニーズに応じて自由に切り替えることができます。エントリ ポイントはプレーヤーの速度メニューにあり、追加の UI は必要ありません。実装コードは呼び出すだけで済みます。player.speeds.append()ギアをいくつか追加します。 -
ニュース/ポッドキャスト アプリ向けの「スポンサー付きスニペット」の実装 - 使用
AVPlayerInterstitialEventController番組間にスポンサー音声を自動挿入、設定.requiresPlaybackAtPreferredRateForAdvancement強制的に最後まで聞くか、「15 秒後にスキップ」ボタンを提供してエクスペリエンスを向上させます。インタースティシャル イベントを作成して追加するだけです。eventsアレイでは、システムが再生タイミングとステータス管理を自動的に処理します。 -
メディア ライブラリ アプリにリッチ コンテンツ情報パネルを追加します —— を使用します
externalMetadata各ビデオのタイトル、サブタイトル、説明、カバー画像などの情報を設定すると、ユーザーはリスト ページに戻ることなく、プレーヤー情報パネルで番組の詳細を直接確認できます。これに必要なのは、AVPlayerItemメタデータ配列を設定すると、システムが自動的にそれを表示します。 -
「オーディオ クリップ」インサートをミュージック ビデオ アプリに追加します - 完全な MV の前に 30 秒のオーディション クリップを自動的に再生し、挿入イベントを使用してオーディションと完全なコンテンツの間の接続を管理します。試用後は、完全なコンテンツが自動的に入力されるか、「今すぐ完全版を購入する」ボタンが表示されます。このロジックは補間イベントを使用して追加できます。
willPresentコールバックの実装により、再生ステータスの切り替えを手動で管理する必要がなくなります。 -
子供向けコンテンツ アプリの再生コントロールを簡素化 - 使用します
speeds = []子供が誤って速度メニューに触れて再生が混乱するのを防ぐために、速度メニューを非表示にします。中断イベントの制限を使用して早送りを禁止し、コンテンツが順番に再生されるようにします。この「誤操作防止」の組み合わせにより、システム プレーヤーを子供のシーンにより適したものにするために必要なコードは 2 行だけです。
関連セッション
- AVFoundation の新機能 - このセッションで説明したプレーヤー拡張機能を含む、iOS 16 の AVFoundation フレームワークの包括的なアップデートを詳しく見ていきます。
- AVKit ビデオ プレーヤー標準を満たす — クロスプラットフォームの一貫性を確保するために、アプリのビデオ再生標準を開発および実装する方法を学びます。
- tvOS 向けに優れた再生エクスペリエンスを設計する - iOS のプレーヤー機能を Apple TV に拡張し、リモコンの操作やフォーカス管理を処理する方法を説明します。
- 写真とカメラの AVFoundation — AVFoundation とシステム カメラの統合について学び、メディア アプリに撮影機能と編集機能を追加します。
- カメラ キャプチャの新機能 — メディア再生と統合されたシーンなど、iOS 16 のカメラ キャプチャの新機能について説明します。
コメント
GitHub Issues · utterances