空間オーディオ

空間オーディオは、臨場感あふれるオーディオ体験で、 臨場感あふれるリアルなサウンドが実現します。音は "空間化"サラウンドのようなマルチスピーカー効果を ヘッドフォンで設定してください。

たとえば映画では、車の音がユーザーの後ろから始まり、 遠くまで追いつくことができますビデオチャットでは、 スピーカーを簡単に識別できるようにしています。

サポートされている音声形式をコンテンツで使用している場合は、 Android 13(API レベル 33)以降のアプリで利用できます。

機能をクエリする

Spatializer クラスを使用して以下を行います。 デバイスの空間化機能と動作をクエリできます。まず取得 Spatializer のインスタンス AudioManager:

Kotlin

val spatializer = audioManager.spatializer

Java

Spatializer spatializer = AudioManager.getSpatializer();

Spatializer が表示されたら、満たすべき 4 つの条件を確認します。 true に設定すると、空間化された音声が出力されます。

条件 確認
デバイスは空間化に対応していますか? getImmersiveAudioLevel()SPATIALIZER_IMMERSIVE_LEVEL_NONE に一致しない
立体化は可能ですか?
ご利用いただけるかどうかは、現在のオーディオ出力ルーティングとの互換性によって異なります。
isAvailable()true です
空間化は有効になっていますか? isEnabled()true です
指定されたパラメータを持つ音声トラックを空間化できますか? canBeSpatialized()true です

空間化が利用できない場合などは、これらの条件が満たされない可能性があります 音声出力デバイスで完全に無効にすることもできます。

ヘッド トラッキング

プラットフォームは、サポートされているヘッドセットを使用して、 ユーザーの頭の位置に基づいて空間化します。ヘッド トラッカーが 現在のオーディオ出力ルーティングで利用できない場合は、 isHeadTrackerAvailable()

互換性のあるコンテンツ

Spatializer.canBeSpatialized() 指定されたプロパティを持つ音声を ルーティングする。このメソッドは AudioAttributes を受け取ります。 AudioFormat があります。どちらも 以下で詳しく説明します。

AudioAttributes

AudioAttributes オブジェクト リソースの使用方法を 音声ストリーム(ゲーム音声など) または標準のメディア)、 その再生動作やコンテンツ タイプが表示されます。

canBeSpatialized() を呼び出すときは、同じ Player に設定された AudioAttributes インスタンス。たとえば Jetpack Media3 ライブラリを使用しており、 AudioAttributesAudioAttributes.DEFAULT を使用してください。

空間オーディオを無効にする

コンテンツがすでに空間化されていることを示すには、 setIsContentSpatialized(true) 二重処理が行われないようにする必要がありますまたは、 次の呼び出しによって、空間化を完全に無効にします。 setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)

AudioFormat

AudioFormat オブジェクトは、 音声トラックの形式とチャンネル設定に関する詳細。

canBeSpatialized() に渡す AudioFormat をインスタンス化する場合: encoding を設定します。 デコーダから期待される出力形式と同じになるように変換します。さらに、 チャンネル マスク コンテンツのチャンネル設定と一致するようにしてください。詳しくは、 デフォルトの空間化動作セクションのガイダンス 指定することもできます。

Spatializer の変更をリッスンする

Spatializer の状態の変化をリッスンするために、リスナーを追加して、 Spatializer.addOnSpatializerStateChangedListener() に置き換えます。 同様に、ヘッド トラッカーの可用性の変化をリッスンするには、 Spatializer.addOnHeadTrackerAvailableListener() を呼び出します。

これは、再生中にトラックの選択を調整する場合に便利です。 リスナーのコールバックを使用します。たとえば、ユーザーがインターネットから ヘッドセットをデバイスから離すと、onSpatializerAvailableChanged コールバックは、新しいスペースでスペイシャライザー エフェクトを使用できるかどうかを示します。 ルーティングできますこのタイミングで、プレーヤーのゲーム コンテンツの更新を デバイスの新機能に合わせて選択ロジックを追跡します。詳細については、 ExoPlayer のトラック選択動作については、ExoPlayer と空間オーディオをご覧ください。 。

ExoPlayer と空間オーディオ

ExoPlayer の最近のリリースで、空間オーディオの導入が簡単になりました。以下をご使用の場合: スタンドアロンの ExoPlayer ライブラリ(パッケージ名 com.google.android.exoplayer2) バージョン 2.17 では、空間化された音声を出力するようにプラットフォームが設定されます。 2.18 では、音声チャンネル数の制約が導入されています。 Media3 ライブラリの ExoPlayer モジュールを使用する場合(パッケージ名 androidx.media3)、バージョン 1.0.0-beta01 同じ更新が加えられます

ExoPlayer の依存関係を最新リリースに更新すると、アプリは 空間化できるコンテンツが必要です

音声チャンネル数の制約

空間オーディオの 4 つの条件をすべて満たしている場合、ExoPlayer は以下を選択します。 マルチチャンネル オーディオ トラックです。そうでない場合、ExoPlayer は代わりにステレオ トラックを選択します。 Spatializer プロパティが変更された場合、ExoPlayer 新しいトラック選択がトリガーされ、 確認します。なお、この新しいトラックを選択すると、 再バッファリング期間内です。

音声チャンネル数の制約を無効にするには、トラック選択パラメータを設定します 次のようにプレーヤーに表示されます。

Kotlin

exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context)
  .setConstrainAudioChannelCountToDeviceCapabilities(false)
  .build()

Java

exoPlayer.setTrackSelectionParameters(
  new DefaultTrackSelector.Parameters.Builder(context)
    .setConstrainAudioChannelCountToDeviceCapabilities(false)
    .build()
);

同様に、既存のトラック セレクタのパラメータを更新して、無効にすることもできます。 次のような音声チャンネル数の制約があります。

Kotlin

val trackSelector = DefaultTrackSelector(context)
...
trackSelector.parameters = trackSelector.buildUponParameters()
  .setConstrainAudioChannelCountToDeviceCapabilities(false)
  .build()

Java

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
...
trackSelector.setParameters(
  trackSelector
    .buildUponParameters()
    .setConstrainAudioChannelCountToDeviceCapabilities(false)
    .build()
);

音声チャンネル数の制約を無効にして、コンテンツに複数の音声が含まれている場合 ExoPlayer は最初にチャンネル数が最も多いトラックを選択し、 デバイスから再生できることを確認します。たとえば、コンテンツに マルチチャンネル音声トラックとステレオ音声トラックがあり、デバイスは 両方の再生で、ExoPlayer はマルチチャンネル トラックを選択します。詳しくは、 この動作をカスタマイズする方法について詳しくは、音声トラックの選択をご覧ください。

音声トラックの選択

ExoPlayer のオーディオ チャンネル数の制約 動作が無効の場合、ExoPlayer は音声トラックを自動的に選択しません。 これは、デバイスのスペイシャライザーのプロパティと一致するものです。代わりに トラック選択を設定して、ExoPlayer のトラック選択ロジックをカスタマイズする パラメータを指定します。デフォルトでは、ExoPlayer はオーディオ MIME タイプに関する最初のトラックと同じトラック。 (エンコード)、チャンネル数、サンプルレートがあります。

トラック選択パラメータの変更

ExoPlayer のトラック選択パラメータを変更するには、次のコマンドを使用します。 Player.setTrackSelectionParameters()。 同様に、ExoPlayer の現在のパラメータは、次のコマンドで取得できます。 Player.getTrackSelectionParameters()。 たとえば、再生中にステレオ音声トラックを選択するには、次のようにします。

Kotlin

exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters
  .buildUpon()
  .setMaxAudioChannelCount(2)
  .build()

Java

exoPlayer.setTrackSelectionParameters(
  exoPlayer.getTrackSelectionParameters()
    .buildUpon()
    .setMaxAudioChannelCount(2)
    .build()
);

なお、再生中にトラック選択パラメータを変更すると、 発生します。プレーヤーのトラックの調整に関する詳細 選択パラメータは トラック選択 セクションをご覧ください。

デフォルトの空間化動作

Android のデフォルトの空間化動作には、次の動作が含まれます。 次のようなタイプがあります。

  • ステレオ コンテンツではなく、マルチチャンネル コンテンツのみが空間化されます。 マルチチャネルの形式に応じて、ExoPlayer を使用しない場合 設定しなければならない場合は、必要に応じてチャンネルの最大数と 音声デコーダで出力できます。これにより プラットフォームが空間化するためのマルチチャンネル PCM を出力します。

    Kotlin

    val mediaFormat = MediaFormat()
    mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
    

    Java

    MediaFormat mediaFormat = new MediaFormat();
    mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
    

    実際の例については、ExoPlayer の MediaCodecAudioRenderer.java をご覧ください。OEM に関係なく、自分で空間化をオフにするには カスタマイズについては、空間オーディオを無効にするをご覧ください。

  • AudioAttributes: 音声は空間化に対応しています usage の場合 USAGE_MEDIA に設定されている または USAGE_GAME を使用します。

  • AudioFormat: 少なくとも次の値を含むチャンネル マスクを使用します。 AudioFormat.CHANNEL_OUT_QUAD 音声チャンネル(前面-左、前-右、左、右の背面)から音声を 空間化の対象になります。以下の例では、AudioFormat.CHANNEL_OUT_5POINT1 を使用します。 5.1 オーディオ トラックの場合。ステレオ音声トラックの場合は、AudioFormat.CHANNEL_OUT_STEREO を使用します。

    Media3 を使用している場合は、Util.getAudioTrackChannelConfig(int channelCount) を使用できます。 を使用して、チャンネル数をチャンネル マスクに変換します。

    さらに、エンコードを AudioFormat.ENCODING_PCM_16BIT に設定します。 デコーダでマルチチャンネル PCM を出力するよう設定している場合。

    Kotlin

    val audioFormat = AudioFormat.Builder()
      .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
      .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1)
      .build()
    

    Java

    AudioFormat audioFormat = new AudioFormat.Builder()
      .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
      .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1)
      .build();
    

空間オーディオをテストする

テストデバイスで空間オーディオが有効になっていることを確認します。

  • 有線ヘッドセットの場合は、[システム設定] >音声とバイブレーション >空間的 オーディオ
  • ワイヤレス ヘッドセットの場合は、[システム設定] >接続済みのデバイス >歯車アイコン <ph type="x-smartling-void-element"><br></ph>空間オーディオ

現在のルーティングで空間オーディオを利用できるかどうかを確認するには、次のコマンドを実行します。 adb shell dumpsys audio コマンドを使用します。次のように表示されます。 渡す必要があります。

Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)