[Android & Kotlin] AudioTrack でwav音声ファイルを再生

wavなどの短い音データなどをandroidで再生させる場合にAudioTrackを使うと素早くできます。ゲームのワンフレーズ等に使えるでしょう。

Android Studio
2024.1.1




AudioTrack

Audioの再生にはこのAudioTrack以外にもMediaPlayerやSoundPoolがあります。

  • SoundPool
    • 再生可能なフォーマット:mp3, ogg, wav(非圧縮), etc.
    • Audio Mixerのように複数の音源を重ねて再生できる
    • 事前にデコードしてメモリに展開するので低レイテンシー
    • 再生できるのは5秒程度
    • 繰り返し再生
    • 再生スピードを可変できる
    • それぞれの音源に優先度をつけられる
    • ゲームの効果音再生に適している
  • MediaPlayer
    • Supported media formatsおそらくこれらをサポート
    • BGMとしてあるいは楽曲の再生用途で使う
  • AudioTrack
    • メモリに直接展開して再生するので低レイテンシー
    • 細かい操作ができる(してあげないといけない)

 

 

AudioTrack.Builder

 

AudioTrack.Builder を使ってみたいと思います。AudioTrack.Builderにサンプルがありますから、それをそのまま使いましょう。
 

そのままといっても、音源に合わせて設定しないといけませんが 

AudioAttributes

 

最初にrawフォルダをres以下に作成します。適当なwavファイルをその res/raw/ 以下に置きます。多くの音声ファイルをフォルダ階層で管理したい場合はassetsに置きます。
ここでは、how_are_you というwavファイルを使ってみます。

AudioAttributes からAudioAttributesを選定します。

  • AudioAttribute:音源は音声なのでこれらを設定
    • setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
    • setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
  • AudioFormat:これらは音源ファイルを調べればわかります
    • setEncoding(AudioFormat.ENCODING_PCM_16BIT)
    • setSampleRate(SamplingRate)
    • setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
      • ステレオ/モノラルの設定
 

sampling rate

 

サンプリングレートを調べるには、windowsなどのエクスプローラーでこの音声ファイルのプロパティを見ます。ビットレートが512kbpsであることが分かり、PCMは16bitなので、
512000bps/16bps = 32000 がサンプリングレートとなります。
 
Macの場合はファイルの情報を見ます。
 
1x1.trans - [Android & Kotlin] AudioTrack でwav音声ファイルを再生

 

サンプルコード

 

以上を踏まえて簡単なテストコードを書いてみました。
 
MainActivity.java

 

レイアウト、画像は特に必要ないですが気分です
activity_main.xml

strings.xml

 

サンプル動画

 

 

audioTrack.write(wavData, 44, wavData.length-44);
としているのは、wavファイルのヘッダ部分が44byteあるので、それがノイズ、プチッ音になるのを回避するためです。

それと注意しないといけないのが、このまま使うと他の処理、画面が止まったりします。それが都合が悪い場合はThreadを使って非同期にするなど対応が必要です。

Reference:
AudioTrack

シェアする

  • このエントリーをはてなブックマークに追加

フォローする