ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
AirPlayオーディオ体験の改善
アプリのAirPlayオーディオ体験を、より堅牢で応答性の高いものにアップグレードする方法を紹介します。AVQueuePlayerで強化されたオーディオ バッファリングを採用する方法について解説し、アプリでカスタムプレーヤーを構築する場合の代替案を検討し、ベストプラクティスを共有します。
関連する章
- 0:42 - AirPlay Overview
- 1:43 - Enhanced audio buffering
- 3:54 - Add support to your app
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪
こんにちは AirPlay Teamの エンジニアのKellyです 本セッションにようこそ 今日は最新バージョンの機能の いくつかを紹介したいと思います 今日はAirPlayの最新バージョンの 機能をカバーし アプリで素晴らしい AirPlay体験をしていただくための ヒントをご紹介します これが本日のアジェンダです まずAirPlayの概要から 説明します 次にAirPlayの拡張オーディオ バッファリングが提供する機能を紹介し 最後にアプリに拡張オーディオ バッファリングを統合する 方法について説明します AirPlayはビデオ 写真 音楽などをAppleデバイスから 近くのスピーカーやスクリーンに 共有する最も簡単な方法です 今日ではAirPlay対応デバイスが 家庭内に数多くあるため AirPlayはかつてないほど 普及しています AirPlayは次のいずれかの方法で 使用できます AirPlay Audioを使えば1台または 複数のHomePodと AirPlay対応 スピーカーにストリーミングして お気に入りの音楽やポッドキャストを 完全同期させて共有できます AirPlayビデオを使えばお気に入りの 映画や番組をAppleデバイスから Apple TVに またはAirPlay対応スマートTVに 高画質でストリーミングできます ミラーリングを使えば 写真 パーソナルビデオ ゲーム Webページ スプレッドシートなど Appleデバイスにあるものを Apple TVやAirPlay対応の スマートテレビで共有できます みなさんの友人や家族も Appleデバイスにあるものを共有できます 今日のビデオはAirPlayのオーディオ ストリーミングの側面に焦点を当てます AirPlayは1台またはそれ以上の デバイスに シームレスなオーディオ ストリーミング体験を提供します HomePod Mac Apple TVなどの Appleデバイスから何億台もの スマートTVを含む世界のトップブランドの オーディオビデオ製品まで 現在AirPlayオーディオを サポートするデバイスの 完全なエコシステムがあります AirPlayはとても便利です AirPlayはとても便利で 私個人もこれを毎日愛用しています
AirPlayが成長し続けるにつれ デベロッパと顧客の期待も高まっています AirPlayを次のレベルに 引き上げるために新しく改良された AirPlay拡張オーディオバッファリング プロトコルが採用され さらに優れたホームシアター および マルチチャンネル体験を提供します 拡張オーディオバッファリングは ホームオーディオ全体を念頭に置いて 根本から構築されていて 頑丈に作られています HomePodまたはiPhoneを リモコンとして使用する場合 オーディオストリームは リアルタイムの再生速度よりも 速くなり 再生の中断を最小限に 抑えます Apple TVからのDolby Atomosのような マルチチャンネルオーディオフォーマットや 今年新たにiOS用のロスレス再生で スマートな使用が可能です 拡張オーディオバッファリングは 広告をサポートする HLSインタースティシャルに 最高のサポートを提供します HLSインタースティシャルについては 同僚のAmitのビデオ 「AirPlayにおけるインタースティシャル の詳細」をご確認ください ご覧の通り私たちは将来に向けて 拡張オーディオバッファリングによって 素晴らしい基盤を築きました これを一体化することでみなさんのアプリで 素晴らしいAirPlay体験を生み出せます そこで拡張オーディオバッファリングが どんなメリットを持つかを見てみましょう 携帯電話からHomePodに オーディオをストリーミングしています
ゴミ出しをしていてWi-Fiの圏外に なったと仮定します ♪ ♪ HomePodは演奏を続けていることに お気づきになれましたでしょうか ネットワークに再接続しようとしても 音楽が途切れることはなく 私の携帯電話はHomePodに シームレスに再接続します ♪ ♪ 再び携帯電話から 再生コントロールが できるようになりました これはAirPlayを使って HomePodのようなAirPlay対応 スピーカーで音楽を再生する際に 求められる性能です 拡張オーディオバッファリングは 素晴らしいことばかりなので みなさんのアプリに 取り入れてみましょう アプリにAirPlayサポートを 追加する方法をおさらいします
オーディオセッションを適切に設定し アプリのミキシングと中断の動作を 正しく行うことが重要です メディアの再生がアプリの中心である場合 オーディオセッションの カテゴリを再生に設定します これによりアプリがバックグラウンドに あるときでもアプリのメディアが 再生され続けるようになります
一般的にはモードをデフォルトに 設定することができますがポッドキャストや オーディオブックのような話し言葉の オーディオではモードを spokenAudioに設定することを お勧めします 最後に音楽やポッドキャストなどの オーディオセッションの ルーティングポリシーを ロングフォームオーディオに 設定します 今年は新たに AirPlayを これまで以上にシームレスにします iPhoneとiPadはデバイス上の インテリジェンスを使って みなさんのAirPlayの嗜好を覚えます 夕食を作るときに音楽を 聴くことが多いので キッチンの近くにあるHomePodが 自動的に表示されアプリのコンテンツを 得ることが とても簡単になるというわけです 長編のオーディオコンテンツを 提供するならばこれをサポートしたいと 思われるかと思います インテリジェント AirPlayサジェストのサポートを アプリに追加するのも簡単です すでに説明した AVAudioSessionの設定に加え 唯一の新しいステップは アプリの Info.plistに行くだけです AVInitialRouteSharingPolicyキーを LongFormAudioに設定します
Xcodeではこのキーは ドロップダウンメニューで 「AirPlay optimization policy」と なっています 以上です iOSが残りを処理し オンデバイス学習を使って みなさんのアプリを開くときに使用する 近くのスピーカーをスマートに提供します
次にAVRoutePickerViewを ビュー階層に追加して アプリにAirPlayピッカーを追加します ピッカーはみなさんのアプリで 使用できる可能性のある AirPlayデバイスのリストを提供します
最後にMPNowPlayingInfoCenterを 使って現在の再生アイテムを システムに知らせ MPRemoteCommandCenterを使って 再生 一時停止 スキップなどの リモートコマンドを受け取ります これでAirPlayのためのアプリの セットアップが完了しました 拡張オーディオバッファリングを サポートするために この2つのAPIセットのどちらかを 採用する必要があります AVPlayerとAVQueuePlayer または AVSampleBufferAudioRenderer と AVSampleBufferRenderSynchronizer のいずれかです
どちらのAPIもローカルや Bluetoothを含むAirPlay以外の 再生に対応します しかしデベロッパによってはAirPlay 再生用と非AirPlay再生用に 異なるAPIを望むかもしれないです その場合みなさんのアプリは routeChangeNotificationに登録し 現在のルートに従って 行動することができます
AVPlayerとAVQueuePlayerは アプリのオーディオバッファリングを サポートする最も簡単な方法を提供します
大半のアプリデベロッパには AVQueuePlayerの採用を
お勧めします AVQueuePlayerが 再生に必要なほとんどを処理するためです AVQueuePlayerはアイテムの 管理再生のコントロールメディアの シークなど再生処理を行います
Apple独自のメディアアプリの多くも AVQueuePlayerを使用しています まずキュープレーヤーを作成します 再生したいローカルまたは クラウドコンテンツ を特定します
次にAVAssetインスタンスを作成します そのURLでAVAssetインスタンスを作成し アセットでAVPlayerItemインスタンスを 作成します
最後にAVPlayerItemを プレーヤーに渡し再生を開始します これだけです プレイアイテムをプレーヤーにエンキュー しているだけだと思われるかもしれません AirPlayの部分はどこなんでしょう? そのとおりです AVPlayerとAVQueuePlayerを 使用することで AirPlayにルーティングされる際に 自動的に オーディオバッファリングが拡張されます より多くのAVPlayer機能については 詳しくはリンクを参照してください メディアデータの前処理を行う必要がある 独自のアプリがある場合は AVSampleBufferAudioRendererと AVSampleBufferRenderSynchronizerを 使用できます APIを使用してキューイングされた 複数のサンプルバッファを 1つのタイムラインに同期させます ここではオーディオデータを エンキューする方法の基本を説明します まずすべての再生操作を実行するための シリアルキューを作成する必要があります オーディオレンダラ と レンダーシンクロナイザを作成します シンクロナイザはメディアタイムラインを 作成します 次にオーディオレンダラ を レンダーシンクロナイザに追加します これはオーディオレンダラに メディアの タイムラインに従うように指示します オーディオデータをエンキューするには コールバックを設置します
オーディオデータがなくなったら レンダラにデータの要求を
停止するように 指示します これはインターフェイスの 基本的な部分に過ぎません 詳細はリンク先のドキュメントを ご確認ください カスタムプレーヤーを構築する サンプルプロジェクトとこのAPIの 使用方法について詳しく説明します この2つのAPIはAirPlay対応 デバイスにおいて 拡張オーディオバッファリングを 活用するために使用できます しかもこれだけではないんです 自動車メーカーはCarPlayの実装で 拡張バッファリングをサポート できるようになりました なぜこの事が重要かというと ワイヤレスCarPlayをサポートする 車種が増えているからなんです 外出先で最高のオーディオ体験を得るには 堅牢な再生と反応の良いコントロールが 不可欠です 素晴らしいことというのが 2つのAPIのうちの1つを使ってアプリに 拡張オーディオバッファリングを 追加することで CarPlayにも対応させることができます アプリを利用する人々は 最高のオーディオストリーミング体験を 得ることができます まとめるとAirPlayをサポートするのに オーディオセッションを設定し アプリにAirPlayピッカーを追加し アプリにMedia Playerを 統合する必要があります これはほんの始まりにすぎません 我々は継続的に改善し この技術に さらに多くの機能を持たせるべく 改良を続けていますセッションを 楽しんでいただけたなら幸いです ありがとうございます ♪ ♪
-
-
4:00 - Set the audio type
let audioSession = AVAudioSession.sharedInstance() try audioSession.setCategory(. playback ,xmode: . default , policy:.longFormAudio )
-
7:23 - AVQueuePlayer
let player = AVQueuePlayer() let url = URL(string: "http://www.examplecontenturl.com") let asset = AVAsset(url: url) let item = AVPlayItem(asset: asset) player.insert(item, after: nil) player.play()
-
8:28 - Add the audio renderer to the render synchronizer
let serializationQueue = DispatchQueue(label: "sample.buffer.player.serialization.queue") let audioRenderer = AVSampleBufferAudioRenderer() let renderSynchronizer = AVSampleBufferRenderSynchronizer() renderSynchronizer.addRenderer(audioRenderer)
-
8:50 - Enqueue audio data
serializationQueue.async { [weak self] in guard let self = self else { return } // Start processing audio data and stop when there's no more data. self.audioRenderer.requestMediaDataWhenReady(on: serializationQueue) { [weak self] in guard let self = self else { return } while self.audioRenderer.isReadyForMoreMediaData { let sampleBuffer = self.nextSampleBuffer() // Returns nil at end of data. if let sampleBuffer = sampleBuffer { self.audioRenderer.enqueue(sampleBuffer) } else { // Tell the renderer to stop requesting audio data. audioRenderer.stopRequestingMediaData() } } } // Start playback at the natural rate of the media. self.renderSynchronizer.rate = 1.0 }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。