WWDC Quick Look 💓 By SwiftGGTeam
Immerse your app in Spatial Audio

Immerse your app in Spatial Audio

元の動画を見る

ハイライト

Apple は、AVFoundation および WebKit の再生パスに空間オーディオのサポートを追加しました。開発者は、マルチチャネル HLS、空間フォーマット制御、オーディオ ルーティング検出を使用して、ヘッド トラッキングと帯域幅適応による没入型の再生エクスペリエンスをメディア アプリに提供できます。

主要内容

(01:32) これまで、モバイル デバイスのビデオ サウンドはほとんどがステレオのままでした。ヘッドフォンの左右のチャンネルが頭と一緒に動き、サウンドが頭に張り付いているように感じられます。映画を観ているときにユーザーが首を回すと音場も回転し、劇場での固定された音場体験が消えます。

(02:14) Spatial Audio (空間オーディオ) はこの問題を解決します。音響心理技術を利用して仮想音場を生成します。空間オーディオをサポートするヘッドフォンを使用する場合、システムは再生デバイスとヘッドフォンの慣性測定データを比較してユーザーの頭の姿勢を取得し、画面周囲の音場を維持するようにレンダリングを動的に調整します。

(02:49) メディア サービスの場合、最も直接的なエントリはマルチチャネル コンテンツです。 Apple は、HLS (HTTP ライブ ストリーミング、HTTP ライブ ストリーミング) バリアントがすでにマルチチャンネル オーディオ代替を参照している場合、これらのコンテンツを公開した後、アプリはデフォルトで空間オーディオを有効にでき、多くの場合コードを変更する必要がないことを明確にしています。

(05:39) マルチチャンネルオーディオはより高いビットレートを占有します。ネットワークが逼迫している場合、システムは空間エクスペリエンスを維持しながら、オーディオをステレオ アップミックス処理にダウングレードします。帯域幅が復元されると、完全なマルチチャネル空間オーディオが返されます。開発者は、ステレオおよびマルチチャンネル レンディションの音量が一貫していることを確認し、DRC (Dynamic Range Control、ダイナミック レンジ コントロール) およびダイヤルノルム メタデータを提供する必要があります。

(06:35) アプリが空間化戦略を制御する必要がある場合、AVFoundation は以下を提供します。AVAudioSpatializationFormats。モノラルおよびステレオの空間化を許可したり、マルチチャネルの空間化を許可したり、両方を許可したり、0 に設定して空間化をオフにしたりすることができます。

詳細

空間化を可能にするオーディオ形式を選択してください

(06:55) Apple 提供AVAudioSpatializationFormats(Spatialized Audio Format) では、どのソース オーディオを空間化できるかを説明します。このタイプはOptionSet、複数の形式の組み合わせを表現するのに適しています。

import AVFoundation

let formats: AVAudioSpatializationFormats = .monoStereoAndMultichannel

print(formats.contains(.monoAndStereo))
print(formats.contains(.multichannel))

キーポイント:

  • import AVFoundationこのセッションで説明した再生 API について紹介します。
  • AVAudioSpatializationFormats空間形式のコレクションです。
  • .monoStereoAndMultichannelモノラル、ステレオ、およびマルチチャンネル ソース オーディオを空間化に参加できるようにします。
  • contains(.monoAndStereo)コレクションにモノラルおよびステレオの空間化が含まれているかどうかを確認します。
  • contains(.multichannel)コレクションにマルチチャネル空間化が含まれているかどうかを確認します。

対応する API の形式は次のとおりです。

public struct AVAudioSpatializationFormats : OptionSet {

    public init(rawValue: UInt)

    public static var monoAndStereo: AVAudioSpatializationFormats { get }

    public static var multichannel: AVAudioSpatializationFormats { get }

    public static var monoStereoAndMultichannel: AVAudioSpatializationFormats { get }
}

キーポイント:

  • OptionSet複数のオプションを組み合わせられることを示します。
  • monoAndStereoモノラルおよびステレオソースからのオーディオの空間化を可能にします。
  • multichannelマルチチャンネルソースからのオーディオの空間化を可能にします。
  • monoStereoAndMultichannelこれは、最初の 2 種類の能力を組み合わせたものです。

プレーヤーに空間化戦略を設定する

(07:21) 再生オブジェクトに空間形式を設定する必要があります。セッションには 2 つのパスが指定されています:AVPlayerItemそしてAVSampleBufferAudioRenderer。後者は、2021 年秋のシステムからこのコントロール ポイントもサポートします。

import AVFoundation

let url = URL(string: "https://example.com/movie.m3u8")!
let playerItem = AVPlayerItem(url: url)

playerItem.allowedAudioSpatializationFormats = .multichannel

let player = AVPlayer(playerItem: playerItem)
player.play()

キーポイント:

  • URLHLS メディア リソースへのポイント、使用例.m3u8
  • AVPlayerItem再生されるメディアをホストします。
  • allowedAudioSpatializationFormats空間化を許可するソースオーディオタイプを指定します。
  • .multichannelマルチチャンネル ソース オーディオのみが空間処理に参加できることを示します。
  • AVPlayerこれを使用してくださいplayerItemプレイを開始します。

Sessionに表示される属性エントリは以下のとおりです。

@available(macOS 11.0, *)
var allowedAudioSpatializationFormats: Int32

キーポイント:

  • allowedAudioSpatializationFormats空間化戦略を制御する属性です。
  • この属性は次の目的で使用されます。AVPlayerItem、2021 年秋のシステムも利用できます。AVSampleBufferAudioRenderer
  • 0を渡すとオーディオの空間化を抑制できます。これはセッションの4つの値の補足説明から来ています。

現在のオーディオ ルートで空間オーディオが有効になっているかどうかを確認します

(08:21) アプリは、コンテンツに複数のチャンネルがあるかどうかだけを確認することはできません。ユーザーの現在のオーディオ ルーティングも空間オーディオをサポートする必要があり、ユーザーは空間オーディオの有効化を許可する必要があります。 iOS15からは、AVAudioSessionPortDescription供給isSpatialAudioEnabled

import AVFoundation

let session = AVAudioSession.sharedInstance()
let outputs = session.currentRoute.outputs

for output in outputs {
    if #available(iOS 15.0, *) {
        print(output.portName, output.isSpatialAudioEnabled)
    }
}

キーポイント:

  • AVAudioSession.sharedInstance()現在のアプリのオーディオ セッションを取得します。
  • currentRoute.outputsヘッドフォンや内蔵スピーカーなど、現在の出力ルートを返します。
  • #available(iOS 15.0, *)位置合わせisSpatialAudioEnabledシステムのバージョン要件。
  • isSpatialAudioEnabled同時に 2 つのことを伝えます。ポートには空間オーディオをレンダリングする機能があり、ユーザーはそれを使用することが許可されています。
  • portNameデバッグ中に現在の出力デバイスを確認すると便利です。

対応する API の形式は次のとおりです。

@available(iOS 6.0, *)
class AVAudioSessionPortDescription : NSObject {

  @available(iOS 15.0, *)
  var isSpatialAudioEnabled: Bool { get }

}

キーポイント:

  • AVAudioSessionPortDescriptionオーディオセッションのポートを説明します。
  • isSpatialAudioEnablediOS 15 以降で利用可能になります。
  • この属性は読み取り専用で、現在のルーティング ステータスを判断するためにアプリによって使用されます。

モニタリングスペースの再生機能の変更

(08:35) ユーザーは、コントロール センターまたは Bluetooth 設定で空間オーディオの設定を変更できます。アプリは監視する必要があるspatialPlaybackCapabilitiesChangedNotification、通知を読んでくださいAVAudioSessionSpatialAudioEnabledKey

import AVFoundation

let center = NotificationCenter.default

if #available(iOS 15.0, *) {
    center.addObserver(
        forName: AVAudioSession.spatialPlaybackCapabilitiesChangedNotification,
        object: AVAudioSession.sharedInstance(),
        queue: .main
    ) { notification in
        let enabled = notification.userInfo?[AVAudioSessionSpatialAudioEnabledKey] as? Bool
        print(enabled as Any)
    }
}

キーポイント:

  • NotificationCenter.defaultシステム通知オブザーバーを登録するために使用されます。
  • spatialPlaybackCapabilitiesChangedNotification空間再生能力が変化したときに発生します。
  • object現在を指すAVAudioSession
  • queue: .mainUI の更新に適したメイン キューでコールバックを実行します。
  • AVAudioSessionSpatialAudioEnabledKeyから使用されますuserInfo空間オーディオ有効ステータスを削除します。

Sessionに表示されるAPIは以下の通りです。

extension AVAudioSession {
  @available(iOS 15.0, *)
  class let spatialPlaybackCapabilitiesChangedNotification: NSNotification.Name
}

@available(iOS 15.0, *)
let AVAudioSessionSpatialAudioEnabledKey: String

キーポイント:

  • 通知は次のように定義されます。AVAudioSession延長中。
  • key は、通知によって伝えられるステータスを読み取るために使用される文字列定数です。
  • この通知は、ユーザーがコントロール センターおよび Bluetooth 設定で空間オーディオ設定を変更するシナリオを対象としています。

アプリがマルチチャンネル コンテンツをサポートしていることをシステムに宣言します。

(09:01) アプリがAVSampleBufferAudioRendererまたは、再生パスをカスタマイズするには、マルチチャンネル コンテンツを提供できることをシステムに伝える必要があります。入り口は、setSupportsMultichannelContent(_:)

import AVFoundation

let audioSession = AVAudioSession.sharedInstance()

if #available(iOS 15.0, *) {
    do {
        try audioSession.setSupportsMultichannelContent(true)
        print(audioSession.supportsMultichannelContent)
    } catch {
        print(error)
    }
}

キーポイント:

  • AVAudioSession.sharedInstance()現在のアプリのオーディオ セッションを表します。
  • setSupportsMultichannelContent(true)アプリまたはサービスがマルチチャネル コンテンツを提供できるという声明。
  • このステートメントは、ネットワーク条件が許可され、処理方法が有効になっている場合にスペース エクスペリエンスを取得できることをユーザーに知らせるためのシステム プロンプトに使用されます。
  • supportsMultichannelContent現在の請求ステータスを読み取ります。
  • do/catchこのスローメソッドによってスローされる可能性のあるエラーを処理します。

Sessionに表示されるAPIは以下の通りです。

extension AVAudioSession {
  @available(iOS 15.0, *)
  func setSupportsMultichannelContent(_ inValue: Bool) throws
  @available(iOS 15.0, *)
  var supportsMultichannelContent: Bool { get }
}

キーポイント:

  • メソッドとプロパティの両方が iOS 15 以降で利用可能になります。
  • setSupportsMultichannelContent(_:)申告エントリーです。
  • supportsMultichannelContent読書入り口です。
  • アプリが使用する場合AVPlayer、セッションは、これらの指示がシステムによって管理されることを示します。

WebKit およびシステム バージョンのサポート範囲

(09:20) 空間オーディオのサポートは、複数のシステム バージョンをカバーしています。 macOS Catalina、iOS 13、iPadOS 13 は内蔵スピーカーですでにサポートされていますAVPlayerItemおよび WebKit ビデオタグ。 macOS Big Sur、iOS 14、iPadOS 14 では、AirPods Pro および AirPods Max のヘッドトラッキング ヘッドフォンのサポートが追加されています。

import AVFoundation

let item = AVPlayerItem(url: URL(string: "https://example.com/movie.m3u8")!)
item.allowedAudioSpatializationFormats = .monoStereoAndMultichannel

キーポイント:

  • AVPlayerItemこれは、システム全体で空間オーディオをサポートする重要な再生ポータルです。
  • .monoStereoAndMultichanneliOS 15、iPadOS 15、macOS Monterey、および tvOS 15 でデフォルトの向きを揃える: 条件が許せば、モノラル、ステレオ、およびマルチチャンネルのソースをすべて空間化できます。
  • WebKit の MSE (Media Source Extensions) パスは、2021 年秋のシステムではサポートが限定されています。
  • MSE には、空間化されたエクスペリエンスをカスタマイズするためのインターフェイスがありません。
  • WebKit は Media Capabilities API を通じて利用可能ですAudioConfiguration辞書検出空間オーディオのサポート。

重要ポイント

  1. やるべきこと: 映画およびテレビ アプリにマルチチャンネル HLS 再生を追加します。 実行する価値がある理由: セッションの説明、HLS バリアントがマルチチャンネル オーディオ代替を参照した後、AVFoundation はデフォルトで空間オーディオを有効にできます。 開始方法: まずメディア ライブラリ内のマルチチャンネル オーディオ リソースを整理し、HLS オーサリング仕様に従ってバリアント プレイリストを出力してから、AVPlayerItem好みに応じて再生および設定allowedAudioSpatializationFormats

  2. 対処方法: 再生ページに「空間オーディオは現在利用可能ですか?」と表示します。 実行する価値がある理由: ユーザーのヘッドフォン、スピーカー、コントロール センターの設定は実際のエクスペリエンスに影響を与えるため、アプリはステータスをユーザーにフィードバックする必要があります。 開始方法: 読むAVAudioSession.sharedInstance().currentRoute.outputs、それぞれチェックしてくださいAVAudioSessionPortDescriptionisSpatialAudioEnabled

  3. 内容: ユーザーがヘッドフォンを切り替えたり、空間オーディオ設定を変更したときに、再生 UI を更新します。 実行する価値がある理由: セッションでルートの変更を監視し、スペース再生機能の変更の通知をリッスンすることをお勧めします。 開始方法: 登録するAVAudioSession.spatialPlaybackCapabilitiesChangedNotification、使用AVAudioSessionSpatialAudioEnabledKey新しい状態を読み取り、ルーティングが変更されたときに再確認しますisSpatialAudioEnabled

  4. やるべきこと: カスタム プレーヤーのマルチチャンネル機能を宣言します。 実行する価値がある理由: を使用しますAVSampleBufferAudioRendererアプリは、マルチチャネル コンテンツを提供できることをシステムに積極的に伝える必要があります。 開始方法: プレイ前に呼び出されますtry AVAudioSession.sharedInstance().setSupportsMultichannelContent(true)、そしてパスしますsupportsMultichannelContent検証ステータス。

  5. やるべきこと: コンサート、スポーツ、特集ビデオ用にサウンドフィールドのナラティブバージョンを作成します。 実行する価値がある理由: Session のデモは、風の音、周囲の音、遠くでの電話、飛行機、映画のシーンなどの空間オーディオの物語的価値を示しています。 開始方法: まず、キー クリップのマルチチャンネル オーディオを生成し、ステレオとマルチチャンネルのレンディション ボリュームが一貫していることを確認し、DRC とダイヤルノーム メタデータを補足してから、HLS を使用してパブリッシュします。

関連セッション

コメント

GitHub Issues · utterances