WWDC Quick Look 💓 By SwiftGGTeam
Explore media metadata publishing and playback interactions

Explore media metadata publishing and playback interactions

元の動画を見る

ハイライト

iOS 16 ではMPNowPlayingSessiontvOS から iPhone および iPad まで拡張された自動メタデータ公開機能により、開発者はわずか数行のコードでアプリケーションの再生情報をコントロール センター、ロック画面、Apple Watch、HomePod に正しく表示できるようになります。

主要内容

どこでもプレイできるようになりました

ユーザーがコントロール センターで音量を調整すると、現在再生中のコンテンツのカバーとタイトルが表示されます。ロック中にすぐに一時停止したり、他のデバイスに AirPlay したりできます。 Apple Watch には Now Playing App もあり、Apple TV のリモコンも内蔵されています。

これらのインターフェイスはすべて、メタデータを正しく公開するためにアプリケーションに依存しています。メタデータが欠落しているか、時間内に更新されない場合、ユーザー エクスペリエンスが損なわれます。カバーが表示されず、プログレス バーが不正確になり、リモコンが応答しなくなります。

MPNowPlayingSession は複数のプラットフォームを統合します

02:18

MPNowPlayingSessionこれまでは tvOS のみでしたが、iOS 16 が正式に利用可能になりました。これは独立した再生セッションを表し、アプリケーションはメイン プレーヤー用とピクチャー イン ピクチャー用など、複数のセッションを持つことができます。

システムは、アプリケーションが Now Playing アプリケーションになる資格があるかどうかを、次の 2 つの条件に基づいて判断します。

  1. 少なくとも 1 つのリモート コマンド ハンドラーを登録します。
  2. AVAudioSession非混合カテゴリとして設定

自動リリースによりメンテナンスの負担が軽減されます

07:16

iOS 16 ではメタデータの自動公開が追加されています。開封後は、MPNowPlayingSessionプレーヤーのステータスを自動的に監視し、継続時間、プレイ経過時間、プレイ ステータスなどのフィールドをリアルタイムで更新します。開発者はタイトルと表紙を設定するだけで、残りはシステムに任せられます。

詳細

再生セッションを作成する

04:34

シングルプレイヤーシナリオ:

self.session = MPNowPlayingSession(players: [player])

ピクチャー・イン・ピクチャー シーン、2 つの独立したセッション:

self.session = MPNowPlayingSession(players: [player])
self.pipSession = MPNowPlayingSession(players: [pipPlayer])

複数の視点と同じコンテンツのシナリオ、1 つのセッションで複数のプレーヤー:

self.session = MPNowPlayingSession(players: [topLeft, topRight, bottomLeft, bottomRight])

キーポイント:

  • 同じMPNowPlayingSession複数のプレーヤーが同じコンテンツに属している必要があります
  • マルチセッションのシナリオでは、アクティブなセッションを手動で昇格する必要があります

アクティブなセッションを切り替える

04:58

ピクチャー・イン・ピクチャー・コンテンツが全画面表示のときにアクティブなセッションを切り替えるには:

self.pipSession.becomeActiveIfPossible { becameActive in
    // 成功后,pipSession 的数据会填充到锁屏和控制中心
    // 远程控制命令也会路由到 pipSession
}

キーポイント:

  • becomeActiveIfPossibleこれは非同期であり、コールバックを通じて成功が確認されます。
  • システムが切り替えを拒否する場合があります (別のアプリが再生中の場合)

リモートコマンドに応答する

05:32

再生と一時停止:

self.session = MPNowPlayingSession(players: [player])

self.session.remoteCommandCenter.playCommand.addTarget { event in
    player.play()
    return .success
}

self.session.remoteCommandCenter.pauseCommand.addTarget { event in
    player.pause()
    return .success
}

早送りコマンド:

self.session.remoteCommandCenter.skipForwardCommand.preferredIntervals = [15.0]
self.session.remoteCommandCenter.skipForwardCommand.addTarget { event in
    let skipCommand = event as! MPSkipIntervalCommandEvent
    let newTime = CMTimeAdd(
        player.currentTime(),
        CMTimeMakeWithSeconds(skipCommand.interval, preferredTimescale: 1)
    )
    player.seek(to: newTime)
    return .success
}

// 广告期间禁用快进
self.session.remoteCommandCenter.skipForwardCommand.isEnabled = false

キーポイント:

  • それぞれMPNowPlayingSession自分のものを持っているMPRemoteCommandCenter
  • 該当するすべてのコマンドのハンドラーを登録し、サポートされていないコマンドを無効にすることができます
  • preferredIntervals早送り/巻き戻しする秒数を定義します
  • MPSkipIntervalCommandEvent.intervalユーザーが要求した特定のスキップ時間を取得します
  • ライブストリーミングなどのシナリオではジャンプコマンドを無効にする必要があります

メタデータを自動的に公開する

07:48

タイトルと表紙を設定し、自動公開をオンにします。

let artwork = MPMediaItemArtwork(image: image)
let title = "Magnificent"

playerItem.nowPlayingInfo = [
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtwork: artwork
]

self.session = MPNowPlayingSession(players: [player])
self.session.automaticallyPublishNowPlayingInfo = true

キーポイント:

  • nowPlayingInfo辞書が設定されているのは、AVPlayerItem優れた
  • MPMediaItemPropertyTitleタイトルを設定する
  • MPMediaItemPropertyArtworkカバーをセットするタイプは、MPMediaItemArtwork
  • automaticallyPublishNowPlayingInfo = true自動公開をオンにする
  • システムはプレイヤーを自動的に観察し、継続時間、プレイ経過時間、プレイステータスを更新します。

インライン広告の処理:

let preroll = MPAdTimeRange(
    timeRange: CMTimeRange(
        start: CMTime.zero,
        duration: CMTimeMakeWithSeconds(30, preferredTimescale: 1)
    )
)

playerItem.nowPlayingInfo = [
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtwork: artwork,
    MPNowPlayingInfoPropertyAdTimeRanges: [preroll]
]

self.session = MPNowPlayingSession(players: [player])
self.session.automaticallyPublishNowPlayingInfo = true

キーポイント:

  • MPAdTimeRange広告の時間帯をマークする
  • MPNowPlayingInfoPropertyAdTimeRanges広告配列を渡す
  • 自動記者会見では広告時間を自動的に差し引いて正味の再生時間を計算します

AVKit メタデータ設定

11:02

tvOS で AVKit を使用する場合は、次のように渡します。externalMetadata設定:

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]

キーポイント:

  • AVMutableMetadataItemメタデータ項目の構築に使用されます
  • identifierメタデータの種類を指定します。.commonIdentifierArtwork表紙を示します
  • value表紙に使用した実際のデータですNSData、タイトルにNSString
  • dataType画像形式を指定します。kCMMetadataBaseDataType_JPEGまたは_PNG
  • extendedLanguageTag使用"und"(未定義) すべてのロケールが表示されるようにします。
  • AVKit はリモート コマンドとメタデータの公開を自動的に処理します

メタデータを手動で公開する

12:59

未使用MPNowPlayingSession次の場合にフォールバックします。

let artwork = MPMediaItemArtwork(image: image)

let nowPlayingInfo: [String: Any] = [
    MPMediaItemPropertyTitle: title,
    MPMediaItemPropertyArtwork: artwork,
    MPMediaItemPropertyPlaybackDuration: playerItem.duration,
    MPNowPlayingInfoPropertyElapsedPlaybackTime: player.currentTime().seconds,
    MPNowPlayingInfoPropertyPlaybackRate: player.rate
]

MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

経過時間と再生レートを更新します。

var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo
nowPlayingInfo?[MPNowPlayingInfoPropertyElapsedPlaybackTime] = player.currentTime().seconds
nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo

キーポイント:

  • マニュアル公開では、すべてのフィールドを自分で保守する必要があります
  • コンテンツの再生/一時停止、ジャンプ、切り替え時にメタデータを更新します
  • 再生時間を定期的に更新する必要はありません。システムは最後の更新と再生速度に基づいて自動的に計算します。
  • 使用MPNowPlayingInfoCenter.default()の共有インスタンス

重要ポイント

  • 内容: ポッドキャスト アプリに完全なロック画面コントロールのサポートを追加します。

  • 実行する価値がある理由: ユーザーは運転中や運動中にポッドキャストを聴くことが多く、ロック画面とヘッドフォンの制御が主なインタラクション モードです。

  • 開始方法: 作成するMPNowPlayingSession、play/pause/skipForward/skipBackwardコマンドを登録、設定nowPlayingInfoタイトル、表紙、章の情報が含まれます

  • やるべきこと: マルチルームオーディオ制御アプリケーションを構築する

  • 価値がある理由: ユーザーは HomePod 経由で iPhone での再生を制御でき、メタデータ公開により、このクロスデバイス制御がシームレスに機能します。

  • 開始方法: 必ずご確認くださいAVAudioSession非混合クラスを設定するには、リモート コマンド ハンドラーを登録し、次を使用します。MPNowPlayingSession再生ステータスを管理する

  • やるべきこと: ピクチャー・イン・ピクチャーをサポートするビデオ・アプリケーションを開発します。

  • 価値がある理由: マルチセッション管理により、ユーザーがピクチャーインピクチャーとフルスクリーンを切り替えたときに、再生中の情報を常に正確に表示できるようになります。

  • 開始方法: メインプレーヤーとピクチャーインピクチャー用に作成しますMPNowPlayingSession、切り替え時に呼び出されますbecomeActiveIfPossible

  • やるべきこと: ライブ ストリーミング アプリを作成する

  • 価値がある理由: ライブ ストリーミング シナリオでは、他のコントロールを利用可能なままにしつつ、特定のコマンド (早送りなど) を無効にする必要があります。

  • 開始方法: コマンドを登録した後、ライブブロードキャストのステータスに応じて動的に設定しますisEnabled、コマーシャル中のスキップ機能を無効にする

関連セッション

コメント

GitHub Issues · utterances