空間オーディオ

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

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

コンテンツでサポートされているオーディオ形式を使用している場合は、Android 13(API レベル 33)以降でアプリに空間オーディオを追加できます。

機能のクエリ

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

KotlinJava
val spatializer = audioManager.spatializer
Spatializer spatializer = AudioManager.getSpatializer();

Spatializer を取得したら、デバイスが空間オーディオを出力するために満たす必要がある 4 つの条件を確認します。

条件 確認
デバイスは空間化に対応していますか? 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 オブジェクトは、オーディオ トラックの形式とチャンネル構成の詳細を記述します。

AudioFormat をインスタンス化して canBeSpatialized() に渡す場合は、エンコードをデコーダから想定される出力形式と同じに設定します。また、コンテンツのチャンネル構成と一致するチャンネル マスクを設定する必要があります。詳しくは、 デフォルトの空間化動作セクションのガイダンス 指定することもできます。

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 新しいトラック選択がトリガーされ、 確認します。なお、この新しいトラックを選択すると、 再バッファリング期間内です。

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

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

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

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

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

音声トラックの選択

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

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

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

KotlinJava
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters
  .buildUpon()
  .setMaxAudioChannelCount(2)
  .build()
exoPlayer.setTrackSelectionParameters(
  exoPlayer.getTrackSelectionParameters()
    .buildUpon()
    .setMaxAudioChannelCount(2)
    .build()
);

なお、再生中にトラック選択パラメータを変更すると、 発生します。プレーヤーのトラックの選択パラメータのチューニングについて詳しくは、ExoPlayer のドキュメントのトラックの選択セクションをご覧ください。

デフォルトの空間化動作

Android のデフォルトの空間化動作には、OEM がカスタマイズできる次の動作が含まれます。

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

    KotlinJava
    val mediaFormat = MediaFormat()
    mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
    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) を使用できます。 を使用して、チャンネル数をチャンネル マスクに変換します。

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

    KotlinJava
    val audioFormat = AudioFormat.Builder()
      .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
      .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1)
      .build()
    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)