ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
メディアメタデータのパブリッシュと再生インタラクションの詳細
AppのNow Playing情報をすべてのプラットフォームでハイライト表示する方法をご確認ください。メディアメタデータの概要をはじめ、ロック画面やコントロールセンターなどのエリアで表示される仕組み、コンテンツ用の効果的なメディアメタデータの作成方法や公開方法を紹介します。また、HomePodなどの他のデバイスからのコマンドにAppがどう応答するかについても解説します。
リソース
関連ビデオ
WWDC22
-
ダウンロード
(音楽) こんにちは Video Teamの EngineerのNikです 今日のトピックはmedia metadata publishingと playback interactionsです どういう意味でしょうか? Appleデバイスの あちこちで playback情報が表示され コントロールできます 例えばControl Centerの Now Playingにはアルバムや タイトルや現在再生中の メディア情報が表示されます また再生・停止・早送りや 巻き戻しもできます Now Playingを拡大すると カバーや経過が表示され スクラブや音量の調整を することができます Lock Screenでも 同じ情報が表示され 情報を見たり コントロールができる上 Unlockすることなく AirPlayを使用できます
Apple Watchの Now Playing Appも 同じ経験を提供し Apple TV remoteも 備えています
tvOSではAVKitを使うと info overlayが 番組タイトルや チャプター情報を表示します info paneを スワイプすると アートワークや詳細が 表示されます
Apple TV remoteの TV buttonを長押しすると Control Centerが現れ Now Playingが表示されます tvOSの背景でオーディオ コンテンツが流れると remoteのplay buttonを 押すにしろ 別のデバイスの Music appからにしろ Now Playing情報が 通知で表示されます またtvOSでaudio再生時 しばらく活動がないと フルスクリーンで 情報が表示されます
最後にiOSのControl Other Speakers and TVs buttonで Now Playing情報が すべてのデバイスで見れ コントロールもできます
Now Playingが表示される デバイスが増え コントロールができると 正しいNow Playing情報を 表示し コントロールに応えるのが 非常に重要です このセッションでは remote commandsや automatic metadata publishingやAVKit manual publishing についてお話しします AVFoundation for media playbackは Now Playing metadata を発行し MPNowPlayingSessionで 反応するのに最適です
これまでtvOSでのみ 利用できましたが iOS 16でも利用できるように なりました
個別のセッションに 対応するのに使われ いくつか セッションがあれば Now Playingの コントロールを提供します manual metadata publishingと automatic publishingの 両方をサポートします
MPNowPlayingSessionは 後にカバーする automatic publishing機能が あるため AVKit使用時は tvOSに使えません Now Playing Appは Control Centerや Lock Screenに表示され ユーザーがボタンを押すと playback controlが 表示されます MPNowPlayingSessionで 1つのApp内で いくつものplayback session に対応できます しかしその場合 1つのアクティブな セッションを システムを通して 表示せねばなりません 例えば Picture in Pictureの場合 2つが同時に プレーされていますが フルスクリーンの方が アクティブとみなされます またNow Playingに適格と みなす発見法もあります まず最低1つのremote commandに登録します ご想像通り playbackに応じないAppは Now Playing Appには 相応しくないと考えられます 次にAVAudioSessionが catagory optionで non-mixable catagoryと 設定されねばなりません Mixable playback categoryとoptionは 通常 通知時に 使用されるもののため おそらくNow Playingには 相応しくないと思われます Playback sessionの例です ここでは映像1つの 再生なので 1つのMPNowPlayingSession で対応されます PIPに対応するなら2つの MPNowPlayingSessionです 1つはメイン もう1つはPIP用です さらに複雑なシナリオでは MPNowPlayingSession1つと 複数のPlayerです この例では4つのPlayerが 四分画面に表示され レースを違う角度から 捉えています 同じMPNowPlayingSession では 同じコンテンツの 一部であるべきです これらのセッションを 例示したものです まず1つのコンテンツなので Single playerの Single sessionです 2つ目はPIPなので 2つのSessioに Playerが1つずつあり 最初がフルスクリーン 次のがPIPコンテンツです 最後のマルチビューレースは 1つのSessionで 4つのPlayerです Sessionが複数あれば どのSessionをプロモート するかはAppの責任です 例えばPIPで再生中 ユーザーがフル画面にすると その前のSessionは 無効となり PIP Sessionが フル画面として 有効になります これは MPNowPlayingSessionの becomeActiveIfPossible で可能になります MPNowPlayingSession の基本と Now Playing Sessionの コントロールを学んだので Lock Screenや HomePodからの Remote command の受信と反応についてです まずはPlay Pauseコマンドの 基本から始めましょう これにより別のデバイスでの コントロール操作や Siriへの指示での Callbackを受信できます MPNowPlayingSessionを まず例示します Sessionは1つなので becomeActiveIfPossible は必要ありません 1つのSessionの時は Now Playing Appの時の デフォルトになります MPNowPlayingSessionは MPRemoteCommandCenterで どのRemote commandに 反応するかを表示します 次にplayCommandの Handlerを足し PlayerのPlay methodを 発動しreturn.successします pauseCommandも同様です コンテンツに対応し サポートするコマンドに それぞれHandlerをつけます 別の例が早送りと 巻き戻しコマンドです たいてい使用可能ですが Live streamの場合 早送りは不可能です まず希望する間隔 つまり早送りと巻き戻しする 秒数を設定します この場合 15秒です 次にPlayとPause同様 早送りボタンや Siriでの指示に対し Handlerを足します HandlerでMPSkipInterval CommandEventを受け取るため そのタイプのイベントを キャストします 次に現在の時間と 先ほど設定した間隔で 経過時間を計算し そこに移動した上で successをreturnします Appで一時コマンドが 使用できない場合もあります 広告中の早送りなどです その場合skipForwardCommand が無効になります Remote commandへの 反応の次は Automatic metadata publishingについてです Automatic publishingは 長さや経過時間 再生状態や進行状況など metadata propertyを 自動的に維持することで metadataの正確性の 継続を楽にします コンテンツの長さや 経過時間に影響しない 広告が含まれている場合 正味時間を計算し その結果を報告します タイトルや解説 アート ワークなどのmetadataは nowPlayingInfoで直接 AVPlayerItemsに足せます この例では automatic publishingに ほとんど任せてタイトルと アートワークをセットします MPMediaItemArtworkを まず作成して アートワークを足します たいていはnetwork requestで呼び込みます 次にstring titleをセットし アートワークとタイトルを MPMediaItemPropertyTitleで playerItemの nowPlayingInfoとして セットします Playing metadataには MPMediaItemPropertyと MPNowPlayingInfoProperty があります MPNowPlayingSessionを 最後に作成し Playerにパスし automaticallyPublishNow PlayingInfoをtrueに設定 automaticallyPublishNow PlayingInfoがtrueなら MPNowPlayingSessionが スクラブや 再生停止や アイテム変更など Playerを観察し始めます これは広告がコンテンツに 焼き込んでいる場合 それらを長さや経過時間に 入れないように どうautomatic publishingを 使うかの例です そのためには 含んだ広告のそれぞれに MPAdTimeRangeを 作成します この例では一番最初に 30秒の広告があります ですのでstartがzeroで 長さを30秒に設定します 先ほどのタイトルと アートワーク同様 MPNowPlayingInfoProperty AdTimeRangesで MPAdTimeRangeを nowPlayingInfoに足します そして先ほど同様 MPNowPlayingSessionを作成 automatic publishingを 可能にします 次はAVKitによる metadata publishingです AVKitでNow Playing metadataを出版するのは MPNowPlayingSession と似ています metadataは直接 AVPlayerItemに足され 経過時間や長さや 再生状態などの値は 自動更新されます PlayerとAssetからの metadataは AppのAVPlayerItemからの metadataと共に Player UIのInfo Paneに 使用されます またAVKitはremote command にも対応します AVKitはAirPlayやPIPなど 他の機能を簡単に統合させる ツールになります metadataは内容を表現する AVMetadataItemからなる AVPlayerItemのexternal MetadataでAVKit内で 設定されます 各AVMetadataItemで 3つ値を設定します まずAVMetadataItemが どのmetadataを 示すかを指すIdentifier 例えばAVMetadataCommon IdentifierTitleはタイトル AVMetadata CommonIdentifierArtworkは アートワークです 次にValueです タイトルの場合 タイトルを含むStringです アートワークの場合 絵を含むNSDataです DataTypeはアートワークの フォーマットを指します JPEGなら kCMMetadatabase DataType_JPEGとなります 最後はExtendedLanguageTag でタイトルや解説などの 言語を指定します たいていの場合 誰もが同じ値を見れるよう undを使用すべきです 英語の場合en-usを 使いたくなりますが その場合スペイン語など 他の言語に対し metadataが表示されません
アートワークとタイトルを 設定する例です まずアートワークのデータを Bundleから取り寄せます たいていの場合 network resourceからです 次にAVMetadataItemを 例示します Identifierを.common IdentifierArtworkに設定 ValueをNSDataと 設定します イメージはJPEGなので dataTypeをkCMMetadata BaseDataType_JPEGに設定 アートワークがPNGなら kCMMetadataBaseData Type_PNGを使います どの言語のデバイスでも metadataを表示したいため extendedLanguageTagを 未定義のundに設定 タイトルも.common IdentifierTitleで設定し ValueはNSString extendedLanguageTagを undに設定します すべての設定が済めば 配列に足し AVPlayerItemの externalMetadataとして 設定します アートワークとタイトルが Player itemに足され Control Centerと Lock Screenに表示されます アートワークのように 解説や字幕情報 評価などのmetadataも 設定できます リッチな体験を提供するため できるだけ多くの設定を することをお勧めします MPNowPlayingSessionでの Automatic publishingと AVKitをカバーしました しかしAutomatic publishing機能は AVPlayer Instanceが 必要です それがオプションにない場合 Manual publishingも可能で それにはすべてのmetadataを 提供する必要があります Automatic publishingと違い 経過時間や再生速度は システムでは決定できません つまり低レベル再生の 微調整ができ 再生が変わるにつれ 正確性はAppに委ねられます Remote commandへの対応も 要求されます MPNowPlayingSessionを 使用していないので MPRemoteCommandCenterの Shared instanceが必要です Now Playing Infoの 更新例です まずイメージのあるMPMedia ItemArtworkを作成します Automatic publishingと 似ています こちらにあるmetadataを含む Dictionaryを作成します ここではタイトルと アートワークと長さ 経過時間を再生速度です MPNowPlayingInfoCenterの デフォルトに設定します 再生や一時停止など 大きな変化があった場合 このmetadataを 更新するべきです 一時停止やスクラブ 新コンテンツなどが例です 経過時間は その必要はありません システムは最後の更新からの 時間を基に 正しい経過時間を推測します Now Playing metadataの 違った出版方法や デバイスからのコマンドに 応える方法がわかり それらでユーザー体験を 非常に簡単に 向上できます 既存の統合法もそうです Automatic publishingで 将来の退化を防ぎ 最低限のメンテで済みます 詳細はdeveloper.apple.com MediaPlayerをご覧ください ありがとうございました
-
-
4:34 - Instantiation examples
// playing Magnificent self.session = MPNowPlayingSession(players: [player]) // Playing different WWDC sessions, one full screen and one in PiP self.session = MPNowPlayingSession(players: [player]) self.pipSession = MPNowPlayingSession(players: [pipPlayer]) // playing multi-view race self.session = MPNowPlayingSession(players: [topLeft, topRight, bottomLeft, bottomRight])
-
4:58 - Promoting and demoting sessions as Now Playing
// Promoting and demoting sessions as Now Playing self.session = MPNowPlayingSession(players: [player]) self.pipSession = MPNowPlayingSession(players: [pipPlayer]) // if the content in PiP is promoted to full screen, swap active self.pipSession.becomeActiveIfPossible { becameActive in // if success, pipSession data populates lock screen, etc, and // controls from lock screen, etc are routed to pipSession }
-
5:32 - Responding to play and pause commands
// Example of responding to play and pause commands self.session = MPNowPlayingSession(players: [player]) // respond to play commands self.session.remoteCommandCenter.playCommand.addTarget { event in player.play() return .success } // respond to pause commands self.session.remoteCommandCenter.pauseCommand.addTarget { event in player.pause() return .success }
-
6:22 - Responding to skip forward commands
// Example responding to skip forward commands self.session.remoteCommandCenter.skipForwardCommand.preferredIntervals = [15.0] self.session.remoteCommandCenter.skipForwardCommand.addTarget { event in let skipCommand = event as! MPSkipIntervalCommandEvent player.seek(to: CMTimeAdd(player.currentTime(), CMTimeMakeWithSeconds(skipCommand.interval, preferredTimescale: 1))) return .success } // commands can also be disabled. for example, during an ad: self.session.remoteCommandCenter.skipForwardCommand.isEnabled = false // add handlers for all commands that are applicable to the content // https://developer.apple.com/documentation/mediaplayer/mpremotecommandcenter
-
7:48 - Setting artwork metadata with automatic publishing
// Example of setting artwork metadata let artwork = MPMediaItemArtwork(image: image) let title = "Magnificent" playerItem.nowPlayingInfo = [ MPMediaItemPropertyTitle: title, MPMediaItemPropertyArtwork: artwork, // … ] self.session = MPNowPlayingSession(players: [player]) self.session.automaticallyPublishNowPlayingInfo = true
-
8:38 - Setting ad time ranges for automatic publishing
// Example with ads that should not contribute to elapsed time and duration let preroll = MPAdTimeRange(timeRange: CMTimeRange(start: CMTime.zero, duration: CMTimeMakeWithSeconds(30, preferredTimescale: 1))) playerItem.nowPlayingInfo = [ … MPNowPlayingInfoPropertyAdTimeRanges: [preroll] … ] self.session = MPNowPlayingSession(players: [player]) self.session.automaticallyPublishNowPlayingInfo = true
-
11:02 - Setting artwork and title metadata for AVKit
// Example of setting artwork metadata let path = Bundle.main.path(forResource: "poster", ofType: "jpg") let posterData = FileManager.default.contents(atPath: path!)! let artwork = AVMutableMetadataItem() artwork.identifier = .commonIdentifierArtwork artwork.value = posterData as NSData artwork.dataType = kCMMetadataBaseDataType_JPEG as String artwork.extendedLanguageTag = "und" let title = AVMutableMetadataItem() title.identifier = .commonIdentifierTitle title.value = "Magnificent" as NSString title.extendedLanguageTag = "und" playerItem.externalMetadata = [artwork, title]
-
12:59 - Manually publishing Now Playing
// Example of setting Now Playing information let artwork = MPMediaItemArtwork(image: image) let nowPlayingInfo = [ MPMediaItemPropertyTitle: title, MPMediaItemPropertyArtwork: artwork, MPMediaItemPropertyPlaybackDuration: playerItem.duration, MPNowPlayingInfoPropertyElapsedPlaybackTime: player.currentTime().seconds, MPNowPlayingInfoPropertyPlaybackRate: player.rate ] MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
-
13:25 - Updating Now Playing metadata
// On any non-linear time change, playback rate change, or play/pause var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。