音を扱うクラスとしてSoundPoolがあり、比較的短いものを遅延が少なく再生できるのでゲームの効果音の再生などに向いています。
下はAnimationとsound再生を同時に行った例です。
2024.1.1
SoundPool
Audioの再生にはこのSoundPool以外にもMediaPlayerやAudioTrackがあります。
- SoundPool
- 再生可能なフォーマット:mp3, ogg, wav(非圧縮), etc.
- Audio Mixerのように複数の音源を重ねて再生できる
- 事前にデコードしてメモリに展開するので低レイテンシー
- 再生できるのは5秒程度
- 繰り返し再生
- 再生スピードを可変できる
- それぞれの音源に優先度をつけられる
- ゲームの効果音再生に適している
- MediaPlayer
- Supported media formatsおそらくこれらをサポート
- BGMとしてあるいは楽曲の再生用途で使う
- AudioTrack
- メモリに直接展開して再生するので低レイテンシー
- 細かい操作ができる(してあげないといけない)
SoundPool の設定
SoundPoolはLollipop以降使い方が変わりました。
- AudioAttributes audioAttributes = new AudioAttributes.Builder(…)
- SoundPool soundPool = new SoundPool.Builder()…
- soundPool.load(…)
- soundPool.play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
- soundID: load()で決めたID
- leftVolume, rightVolume: 左音量, 右音量(range = 0.0 to 1.0)
- priority: (0 = lowest priority) default 0
- loop: (0 = no loop, -1 = loop forever)
- rate: (1.0 = normal playback, range 0.5 to 2.0)
SoundPoolは、事前に音源をロードしておく必要があります。いきなりロード再生ではうまくいきません。そのためアプリとして音源を抱えたままになりかねないため、release, unload等を使ってOut Of memoryに陥らない対策が必要です。
SoundPool、AudioAttributes
wavファイルを res/raw/ 以下に置きます。
「res」から
「New」「Folder」「Raw Resources Folder」
でフォルダーを作成
rawフォルダーにwavファイルを入れます。参考までに以下wavファイルを名前をつけて保存できます。
one two
多くの音声ファイルをフォルダ階層で管理したい場合はassetsに置きます。ただし、assetsからのデータ取得はAssetManagerを使う作業が必要です。簡単なMediaPlayerで音楽を再生
サンプルコード
MainActivity.java
activity_main.xmlなどは以下にあります
activity_main.xml
strings.xml
ついでに、ボタンを押してSoundPoolで音を再生し、ボタンを回転させてみました。
- 関連ページ
- 簡単なMediaPlayerで音楽を再生
- WAV音声ファイルをAudioTrackで再生
- SoundPoolで効果音を鳴らす
References:
SoundPool
AudioAttributes