
-
シームレスなマルチビュー再生体験の構築
アプリで高度なマルチビュー再生体験を構築する方法を学びましょう。複数のプレーヤー間で再生を同期する方法、シームレスなAirPlay統合によってマルチビュー再生を向上させる方法、再生品質を高めて魅力的なマルチビュー再生体験を提供する方法について説明します。
関連する章
- 0:00 - イントロダクション
- 2:08 - マルチビュー再生の調整
- 9:09 - マルチビュー体験を提供するアプリでのAirPlayのサポート
- 14:14 - マルチビューでのストリーミング品質の最適化
リソース
関連ビデオ
WWDC21
-
このビデオを検索
皆さん こんにちは Juliaです AVFoundationエンジニアを担当しています このビデオでは アプリで複数プレイヤーを対象とした 魅力的なユーザー体験を作成する方法 について説明します 人々はスポーツの大会などのライブイベント を複数の視点で楽しんだり 複数のチャンネルを同時に視聴したりする ことを求めています マルチビュー再生体験は オーディオやビデオの複数のストリームを 同時に再生することで実現されます 同じイベントの異なるストリームを 複数再生するという使用例があります たとえば アナウンサーの オーディオストリームと フィールドの異なる視点からの2つの ビデオストリームを使うサッカーの試合です この場合 ストリーム間で 再生を同期することが重要です これにより 重要な瞬間を揃える ことができます ストリームを同期する他の例として 複数のカメラアングルがある 音楽コンサートや メインコンテンツのストリームと それに対応する手話ストリームがある 基調講演などがあります
マルチビューの別の使用例として 完全に異なるイベントの 複数のストリームを再生する場合があります たとえばオリンピック期間中に 陸上競技と水泳競技のような 異なる競技のストリームを表示し BGMを流すといった例です このような場合 オーディオとビデオのストリームを 相互に同期する必要はありません AVFoundationとAVRoutingには 素晴らしいマルチビュー再生体験を 簡単に構築できるAPIが用意されています このビデオではこれらのAPIを説明します まず複数のストリーム間で再生を 同期する方法を説明します 次にAirPlayの複数のビュー間で ルーティングを処理する方法を説明します 最後に複数のプレイヤー間で再生品質を 最適化する方法を紹介します
スポーツの試合のように調整が必要な 複数のストリームを表示する場合 重要な瞬間が揃うように すべてのプレイヤー間で 再生を同期することが重要です つまり 再生 一時停止 シークなどの すべての再生動作を 調整する必要があります ただし これは複雑なプロセスになる 可能性があります 再生速度の変更やシークだけでなく 複雑な動作も管理する必要があります AVFoundationフレームワークの AVPlaybackCoordinationMediumによって 複数のプレイヤー間の再生を 厳密に同期することが容易になります これは再生速度の変更や時間のジャンプの 調整だけでなく 停止 中断 起動時の同期などの 他の複雑な動作も処理します 「AV Playback Coordination Medium」を 使って アプリで複数のプレイヤーを 調整する方法を実演します このビデオで紹介するデモでは 線路上の列車を異なるカメラアングルで撮影し 植物や他の被写体 ランドマークなどの シーンを通過する様子を例として使います この列車の例は 複数のカメラアングルで マルチビューコンテンツが どのように見えるのかを 説明するのに役立ちます この調整のデモでは 線路の周囲から撮影した 複数のカメラアングルを追加していきます これはスポーツの試合を見ているときに 異なるカメラアングルを追加する場合と 同様です iPadアプリを使い 線路を走るおもちゃの列車を 複数の異なるビデオストリームで 表示しています まず 線路を走る列車を 俯瞰で撮影した映像を再生します 列車を別のアングルから見たいので 線路の横からの映像を追加します 2番目のストリームはすでに再生されている ストリームと一致しています 線路の周りから記録したカメラアングルを さらに2つ追加します 追加したストリームは同期され結合されます 一時停止するとすべてのプレイヤーが 同期して一時停止します よく見ると 4つのすべてのプレイヤーで 列車を複数のアングルから確認できます 左上の俯瞰の映像では 列車が植物を通り過ぎて テーブルの端付近にあるのがわかります 他のカメラアングルから見ると 列車が線路の直線部分に入り始め 後ろから猿に近づいていることが わかります 各ビデオのタイムスタンプを見ると すべてが同じ時間であることがわかります
再生すると すべてのプレイヤーが 同期して再生を開始します さまざまなアングルから 列車の動きが 完璧に調整されていることを確認できます
次に 10秒先にシークします どの操作を行っても プレイヤーは同期を維持します
iPadアプリから ピクチャ・イン・ピクチャビューに 切り替えても ストリームは同期を維持します
アプリに戻ると すべてのビデオが 引き続き同期され再生されています
これは「Now Playing」のような システムインターフェイスでも機能します 再生動作も調整されます 一時停止して再生しても プレイヤーは同期を維持します すべてのプレイヤーを調整することで 優れたユーザー体験が実現されます デモではランドマークを通過する 列車の例を紹介しました 現実世界のシナリオでは こうした例として スポーツイベントや手話ストリームなど 再生の調整が必要なマルチビューの 使用例が考えられます ここまで 実際の動作について説明しました 次に アプリでこの体験を構築する方法を 紹介します AV Playback Coordination Medium APIは SharePlay用の既存の AVPlaybackCoordinationアーキテクチャを 基盤として構築されています 各AVPlayerは AVPlaybackCoordinatorを備えており プレイヤーの再生状態と接続されている 他のすべてのプレイヤーとの間で ネゴシエーションが行われます 再生コーディネータと その仕組みの詳細については 「Group Activitiesによる メディアエクスペリエンス連携」をご覧ください 複数のビデオプレイヤーがある場合 再生コーディネータでは リモートの状態管理を行い 各プレイヤーが他のプレイヤーと 同期している必要があります 「AV Playback Coordination Medium」は すべての再生コーディネータ間で 状態の変化を伝えます 調整メディアは あるコーディネータから 他の再生コーディネータに状態を渡して すべてのコーディネータを同期します これはメッセージによって実現されます 調整メディアによって 再生速度や時間などの 重要な状態の変化に関するメッセージが プレイヤー間でやり取りされます たとえば あるプレイヤーが一時停止すると そのメッセージが調整メディアに送られます その後で 調整メディアがこのメッセージを 接続されている他のすべての 再生コーディネータに送ります 再生コーディネータは 再生状態を処理して適用します これにより すべてのプレイヤーは 調整されたマルチビューコンテンツを 再生する際に同期を維持できます 数行のコードを使うだけで この機能を実装できます まず それぞれ異なるアセットを使って AVPlayerを設定します ここでは2つのビデオを使っています 1つはクローズアップ映像 もう1つは俯瞰映像です これらを異なるアセットを使って 個別に設定しています 次に 調整メディアを作成します その後で 調整メソッドを使って各プレイヤーを 調整メディアに接続します このメソッドはエラーをスローする場合が あるため エラー処理が重要になります 最後に 2つ目のプレイヤーである 俯瞰映像に対しても同様に設定します これで 両方の再生コーディネータが 調整メディアに接続され 各プレイヤーでの操作が同期されます 1つのプレイヤーに対して 操作を呼び出すだけで 接続された他のすべてのプレイヤーでも 同じ操作が行われます この例で使っているプレイヤーは2つですが もっと多くのプレイヤーを接続できます AVPlaybackCoordinationMediumは マルチビュー再生の調整に最適です
次に 調整されたマルチビュー再生にも 調整されていないマルチビュー再生にも 適用できるツールについて説明します AirPlayを使うと 素晴らしい外部再生体験を実現できます ビデオストリームを 自宅のより大きな画面にルーティングしたり オーディオストリームを HomePodにルーティングしたりできます 適切なビューを適切なデバイスに ルーティングすることが重要です マルチビュー体験を実現するアプリで AirPlayをサポートする方法を説明します 実際に見てみましょう 次に示す例では 俯瞰映像のビデオを 線路のクローズアップビデオと一緒に 見ています どちらのビデオもiPadで再生されています どちらのビデオもiPadで再生されています ただし iPadからApple TVに ビデオをAirPlayで送信したいのです AirPlayレシーバーは1つのストリームしか サポートできません これにルーティングする場合 俯瞰映像のビデオを優先して 大画面で再生します これで細かい部分をすべて 鮮明に確認できます iPadで2つのビデオの再生を開始し Apple TVにルーティングします クローズアップの映像は 引き続きiPadで再生され 私の優先するプレイヤーである 俯瞰映像のビデオは 大画面で再生されます テレビで再生するビデオを変更する場合 優先するプレイヤーを クローズアップストリームに更新することで ストリームを切り替えることができ 2つのビデオが入れ替わります このiPadアプリでは スターボタンを押すことでこれを実行できます クローズアップビデオが 優先プレイヤーに設定されます では選択します クローズアップストリームは テレビで再生され 俯瞰映像はiPadで再生されます 一時停止や再生も行うことができます ストリームが調整されていれば 同期は維持されます 以上は調整された再生の使用例です 調整されていないマルチビューストリームも AirPlayでシームレスに動作します AVRoutingフレームワークの一部である AVRoutingPlaybackArbiterを使うと マルチビュー体験用のAirPlayの サポートを簡単に統合できます 再生アービターによって ビデオストリームまたは オーディオストリームを 1つしかサポートしない AirPlayや他の外部再生体験でも マルチビューがスムーズに動作します これはビデオ/オーディオストリームを 適切に切り替える際の複雑さを管理します AVRoutingPlaybackArbiterは 合成不可のオーディオ経路 に関する環境設定を 管理し適用します こうしたオーディオ経路では 1つのオーディオストリームしか再生できず 受信側で複数のオーディオを 同時に再生することはできません 再生アービターは制限付きの 外部再生ビデオ経路も処理できます こうした経路では AirPlayビデオや LightningデジタルAVアダプタのように 受信側で1つのビデオストリームしか 再生できません 列車のマルチビュービデオのような マルチビュー再生では 俯瞰映像と複数のクローズアップ映像が 使われることがあります ここで AirPlayでビデオを送信するときは 常に俯瞰映像を優先するとします まず 再生アービターシングルトンを 取得します 次に 俯瞰映像を 再生アービターのプロパティ preferredParticipantForExternalPlayback として設定します マルチビューコンテンツの再生中に iPadからApple TVへルーティングすると 俯瞰映像のビデオが Apple TVにルーティングされ 他のビデオは引き続きiPadで ローカルに再生されます 同様に 複数のプレイヤーがあり 俯瞰映像にオーディオの優先順位を 持たせる場合は まず再生アービターシングルトンを取得し 俯瞰映像のプレイヤーを preferredParticipantForNonMixableAudioRoutes として設定します マルチビューコンテンツの再生中に iPadからHomePodに オーディオをルーティングすると 俯瞰映像のオーディオが再生されます 次に このAPIの使用例を紹介します まず 2つのAVPlayerを設定します 1つはクローズアップ映像用 もう1つは俯瞰映像用です 次に AVRoutingPlaybackArbiterの インスタンスから 再生アービターシングルトンを取得します AirPlayにルーティングする際は常に 俯瞰映像を大画面に表示したいので 俯瞰映像を外部再生の優先プレイヤーとして 設定します また HomePodにルーティングする場合は オーディオを聞きたいので この場合も俯瞰映像を 合成不可のオーディオ経路の 優先プレイヤーとして設定します この例では両方のプロパティに 同じプレイヤーを選びましたが 別々のプレイヤーを設定することもできます AVRoutingPlaybackArbiterを使うと マルチビューアプリでAirPlayや 他の外部オーディオ/ビデオ再生体験を シームレスに統合できます 次に これらのストリームの品質を 管理する方法について説明します マルチビューコンテンツを視聴する際 一部のストリームが他のストリームよりも 重要になる場合があります たとえば マルチビューで スポーツの試合を視聴している際 1つのストリームがフィールドの 俯瞰映像になることがあります また他の2つのストリームが フィールドの異なる視点からの映像となり さらに別のストリームが観客の クローズアップ映像となる場合もあります
この例ではフィールドの 俯瞰映像を重視しています より鮮明な画像を表示し 高画質で再生したいと考えています 観客のクローズアップ映像は重視しないので そのディテールを表示する必要はなく 低画質で再生されても問題ありません マルチビューシナリオでは 各プレイヤーで 品質のニーズが異なる場合があります これを示すには AVPlayerの networkResourcePriorityを設定します その仕組みを詳しく説明します コンテンツのストリーミング時プレイヤーは ネットワーク帯域幅を消費します プレイヤーのサイズが同じであれば 各プレイヤーで同じ量の ネットワーク帯域幅を消費し それぞれ同じ品質で再生できます ただし 各プレイヤーで異なるネットワーク 帯域幅と品質が必要になる場合があります これに対応するにはAVPlayerの networkResourcePriorityを設定します 各プレイヤーは デフォルトの優先度で開始されます 優先度は高または低に設定できます 「高」の優先度は プレイヤーが高いレベルの ネットワークリソースを必要としており 高品質な解像度でのストリーミングが 重要であることを意味します 「低」の優先度は プレイヤーが最小限の ネットワーク帯域幅を必要としており 高品質な解像度でのストリーミングが 重要ではないことを意味します
networkResourcePriorityを使って これを実現する方法の例を見ていきましょう まず AVPlayerを作成します 次に プレイヤーの networkResourcePriorityを設定します スポーツの試合の例ではフィールドの 俯瞰映像が最も重要であるため 優先度を「高」に設定します 観客のクローズアップ映像はそれほど 重要ではないので「低」に設定します その結果 ネットワーク優先度は フィールドの俯瞰映像では高くなり 観客のクローズアップ映像では低くなります これらのネットワーク優先度によって システムがネットワーク帯域幅リソースを 割り当てるときに プレーヤーの優先度を示すことができます ネットワーク帯域幅の正確な分配では さまざまな要因が考慮されます それらは 他のプレイヤーの数 ビデオレイヤのサイズ ハードウェアの制約などです 次に ネットワーク優先度の実際の機能を 示すデモをお見せします この例では列車のマルチビューの 例を紹介します これは さまざまな再生品質が求められる スポーツの試合の例や 他のマルチビューシナリオにも応用できます 2つの異なるストリームを視聴しています 1つは線路の俯瞰映像で もう1つは列車のクローズアップ映像です 列車の動きを一瞬も 見逃さないことが重要であるため 俯瞰映像を鮮明に試聴することを 考えています 俯瞰映像のネットワークリソースの 優先度を「高」に設定します 現在どちらのビデオも 高解像度で再生されています 解像度タグはビデオの下部にあります ネットワーク状態が悪く ネットワーク帯域幅が制限されている場合 右側のクローズアップ映像は 最初に低解像度に切り替わります 今 それを確認できます 左側の俯瞰映像のほうが*重要*であるため 高解像度が維持されます プレイヤーのネットワークリソースの 優先度を設定することで ストリームの再生品質を より詳細に制御できます ご紹介したAVFoundationとAVRouting APIは すべて連携して動作し シームレスなマルチビュー体験を 構築することができます 高度なマルチビュー機能を ご覧いただきました ここでは再生の調整 AirPlayの統合 品質の最適化などを説明しました マルチビューを使って 独自のアプリを構築し強化してみましょう AVPlaybackCoordinationMediumを使って 魅力的で同期された マルチビュー体験を実現してください お気に入りのスポーツイベントで 複数のカメラアングルを同期できます AVRoutingPlaybackArbiterについて学習し AirPlayの統合を利用して マルチビューアプリを強化しましょう ASLストリームなどのマルチストリーム再生 を大画面に表示できます ネットワーク帯域幅の割り当てにより 再生品質を微調整し最適化できます 重要なストリームが高品質で 再生されるようにしましょう 皆さんが作り出す素晴らしいマルチビュー 再生体験を楽しみにしております ありがとうございました
-
-
7:55 - Coordinate playback
import AVFoundation var closeUpVideo = AVPlayer() var birdsEyeVideo = AVPlayer() let coordinationMedium = AVPlaybackCoordinationMedium() do { try closeUpVideo.playbackCoordinator.coordinate(using: coordinationMedium) }catch let error { // Handle error } do { try birdsEyeVideo.playbackCoordinator.coordinate(using: coordinationMedium) }catch let error { // Handle error }
-
13:17 - Set preferred participant
import AVFoundation import AVRouting var closeUpVideo = AVPlayer() var birdsEyeVideo = AVPlayer() let routingPlaybackArbiter = AVRoutingPlaybackArbiter.shared() routingPlaybackArbiter.preferredParticipantForExternalPlayback = birdsEyeVideo routingPlaybackArbiter.preferredParticipantForNonMixableAudioRoutes = birdsEyeVideo
-
16:15 - Set network resource priority
birdsEyeVideo.networkResourcePriority = .high closeUpVideo.networkResourcePriority = .low
-