WWDC Quick Look 💓 By SwiftGGTeam
Tune up your AirPlay audio experience

Tune up your AirPlay audio experience

元の動画を見る

ハイライト

Apple は、iOS 17 で AirPlay 拡張オーディオ バッファリング プロトコルを開始しました。AVQueuePlayer または AVSampleBufferAudioRenderer を通じて、アプリケーションは、より高速なオーディオ ストリーム バッファリング、より高感度な制御応答、マルチチャンネル フォーマットのサポート、およびインテリジェントなロスレス再生機能を獲得できます。

主要内容

オーディオバッファリングを強化する必要がある理由

AirPlay で音楽を聴くとき、ユーザーにとって最も迷惑な点は 2 つあります。それは、携帯電話が Wi-Fi 圏外になるとすぐに音楽が途切れてしまうということと、一時停止をクリックした後の応答に時間がかかるということです。

(02:17) Apple は今年、根本から再設計された新しい AirPlay 強化オーディオ バッファリング プロトコルを発表しました。その主な改善点は 3 点です。オーディオ ストリームはリアルタイム再生よりも速い速度でバッファリングされ、中断が減少します。制御コマンド (再生、一時停止、曲の切り替え) はすぐに応答します。ドルビーアトモスなどのマルチチャンネルフォーマットをサポートし、ロスレス再生用の新しいスマートスイッチがiOSに追加されました。

セッションでは典型的なシナリオがデモンストレーションされました。ユーザーはゴミを出すために携帯電話を取り出し、Wi-Fi 範囲を離れた後も HomePod は再生を続けました。ユーザーが Wi-Fi 範囲に戻ると、電話機はシームレスに制御を再開し、プロセス全体を通じて音楽が中断されることはありませんでした。

統合方法: 2 つのパス

(06:11) Apple は、拡張オーディオ バッファリングをサポートするために 2 つの API セットを提供しています。ほとんどの開発者は、拡張オーディオ バッファリングを自動的に処理する AVQueuePlayer を直接使用する必要があります。カスタム DRM またはオーディオの前処理を必要とするアプリケーションのみが、基礎となる AVSampleBufferAudioRenderer + AVSampleBufferRenderSynchronizer を使用する必要があります。

詳細

オーディオセッションを構成する

(04:00) AirPlay を統合する前に、オーディオ セッションが正しく設定されていることを確認してください。

let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playback, mode: .default, policy: .longFormAudio)

キーポイント:

  • .playbackカテゴリにより、アプリがバックグラウンドに入った後も音声が再生され続けることが保証されます -.longFormAudioこのポリシーは、これがシステムのサウンド効果ではなく、音楽やポッドキャストなどの長いオーディオ コンテンツであることをシステムに伝えます。
  • ポッドキャストまたはオーディオブックの場合は、モードを に設定することをお勧めします。.spokenAudio

スマート AirPlay の提案

(04:43) iOS 17 では、オンデバイス インテリジェンスに基づいた新しい AirPlay 推奨事項が追加されています。システムはユーザーの使用習慣 (たとえば、ユーザーは通常、料理をしながらキッチンで HomePod で音楽を聴いている) を学習し、ユーザーがアプリを開くと、近くにある HomePod が推奨ターゲットとして自動的に表示されます。

これを有効にする方法は非常に簡単で、Info.plist に追加します。

<key>AVInitialRouteSharingPolicy</key>
<string>LongFormAudio</string>

Xcode では、このキーは「AirPlay 最適化ポリシー」として表示されます。

AVQueuePlayer メソッド (推奨)

(07:23) AVQueuePlayer は、強化されたオーディオ バッファリングを統合し、自動的に取得する最も簡単な方法です。

let player = AVQueuePlayer()

let url = URL(string: "https://example.com/audio.m3u8")
let asset = AVAsset(url: url)
let item = AVPlayerItem(asset: asset)

player.insert(item, after: nil)
player.play()

キーポイント:

  • 作成するAVQueuePlayer
  • 使用するAVAssetそしてAVPlayerItemパッケージコンテンツのURL -insert(item, after: nil)アイテムをキューに追加
  • 強化されたオーディオ バッファリングは、AirPlay にルーティングするときに自動的に有効になります。
  • Apple 独自のメディア アプリのほとんども AVQueuePlayer を使用しています

カスタム プレーヤー メソッド

(08:28) AVQueuePlayer がニーズ (カスタム DRM やオーディオの前処理など) を満たせない場合は、AVSampleBufferAudioRenderer を使用します。

let serializationQueue = DispatchQueue(label: "sample.buffer.player.serialization.queue")
let audioRenderer = AVSampleBufferAudioRenderer()
let renderSynchronizer = AVSampleBufferRenderSynchronizer()

renderSynchronizer.addRenderer(audioRenderer)

(08:50) オーディオ データをキューに追加します。

serializationQueue.async { [weak self] in
    guard let self = self else { return }

    self.audioRenderer.requestMediaDataWhenReady(on: serializationQueue) { [weak self] in
        guard let self = self else { return }

        while self.audioRenderer.isReadyForMoreMediaData {
            let sampleBuffer = self.nextSampleBuffer()
            if let sampleBuffer = sampleBuffer {
                self.audioRenderer.enqueue(sampleBuffer)
            } else {
                self.audioRenderer.stopRequestingMediaData()
            }
        }
    }

    self.renderSynchronizer.rate = 1.0
}

キーポイント:

  • serializationQueueこれはシリアル キューであり、すべての再生操作はこのキュー上で実行されます。 -AVSampleBufferRenderSynchronizer統一されたタイムラインを作成する -addRendererオーディオ レンダラーをシンクロナイザーにバインドする -requestMediaDataWhenReadyレンダラーがデータを受信する準備ができたときのコールバック -isReadyForMoreMediaData引き続きキューに参加できるかどうかを確認する
  • データがなくなったときに呼び出されますstopRequestingMediaData()
  • rate = 1.0自然な速度で再生を開始します

CarPlay のサポート

(09:26) 自動車メーカーは、CarPlay 実装で強化されたバッファリングもサポートできるようになりました。ワイヤレス CarPlay をサポートする車両が増えているため、安定した再生と応答性の高いコントロールが車載オーディオ体験にとって重要です。幸いなことに、アプリケーションが上記の 2 つの API セットのいずれかを使用している限り、CarPlay は自動的に恩恵を受けることになります。

重要ポイント

  1. ポッドキャスト アプリケーションを作成する際にスマート AirPlay をオンにするための推奨事項

    • 内容: ユーザーがアプリを開いたときに、よく使用するスピーカーが AirPlay ターゲット リストの先頭に自動的に表示されるようにします。
    • 実行する価値がある理由: Info.plist にキーを追加するだけで、コードコストがゼロになり、ユーザー エクスペリエンスが向上します。
    • 開始方法: 追加AVInitialRouteSharingPolicyのためにLongFormAudio、オーディオ セッション カテゴリが に設定されていることを確認します。.playback
  2. 複数の部屋で音楽再生を同期

    • 機能: ユーザーは複数の HomePod または AirPlay スピーカーを同時に聞いて、家全体で同時再生できます。
    • 価値がある理由: 強化されたオーディオ バッファリング プロトコルは、より高速なバッファリングとより正確な同期を備え、家全体のオーディオ用に特別に設計されています。
    • 開始方法: AVQueuePlayer を使用して再生します。システムは自動的にマルチデバイスの同期を処理します。アプリケーション層に追加のロジックは必要ありません。
  3. バックグラウンドでの連続再生をサポートするオーディオ アプリケーションを作成します

    • 内容: ユーザーが Wi-Fi 範囲外に出てもスピーカーは再生を続けます。ユーザーが戻ったときにシームレスに制御を再開します
    • 実行する価値がある理由: これは、オーディオ バッファリングを強化するための中核となる機能です。以前は複雑な再接続ロジックが必要でしたが、現在はプロトコル層が自動的に処理します。
    • 開始方法: 必ず AVQueuePlayer を使用し、正しいオーディオ セッション カテゴリを設定し、残りはシステムに任せてください。
  4. カスタムオーディオ処理を備えたプレーヤーを作成

    • 内容: オーディオ再生前にカスタム処理 (リアルタイムの音響効果、視覚分析など) を実行し、AirPlay をサポートします。
    • 価値がある理由: AVSampleBufferAudioRenderer を使用すると、強化されたバッファリングのメリットを享受しながら、オーディオ データをキューに入れる前に処理できます。
    • 開始方法: を使用しますAVSampleBufferAudioRenderer + AVSampleBufferRenderSynchronizerカスタムプレーヤーを構築するnextSampleBuffer()処理ロジックを挿入します

関連セッション

コメント

GitHub Issues · utterances