ブロックチェーン・AI・システム開発の株式会社INDETAIL

AndroidでSoundPoolを使っての音声再生の注意点

2015.08.03
なめ橋

こんにちわ。
なめ橋です。
最近北海道も暑くなってきましたね。
夏バテしないように気を付けましょう!

さて、今回はAndroidで音声の再生をする際に、SoundPoolを使った場合の注意点のまとめになります。
音声の再生にはSoundPoolを用いなくても、MediaPlayerやAudioTrack等のクラスを使っての再生方法もありますが、今回はSoundPoolを用いた場合のみの注意点となります。

1.デコードに時間がかかる

音声データのサイズにもよりますが、デコードに多少時間がかかります。
そのため、

こんなコードを書くと、

というようなWarningが発生し、結果として音声が再生されません。
音声データの読み込みが完了する前に再生させようとしているためです。
そのため、loadが完了してから再生させる必要があります。
load完了の通知を受け取るためには、setOnLoadCompleteListenerを使ってあげれば受け取ることができます。
以下の様な感じですね。

2.Poolできる上限数

SoundPoolにPoolできる上限数はメモリ管理領域の都合上、256までです。
そのため、257個以上をloadさせようとすると、

というようなエラーが発生します。
また、厄介なことに、SoundPoolのunloadメソッドを使用してもそれ以上loadすることはできないようです。
そのため、SoundPool自体をいったんreleaseする必要があります。

3.ファイルサイズ

読み込む音声データのファイルサイズが大きいと、ヒープを起こしてしまい、データが読み込まれず、以下の様なエラーが発生いたします。

ファイルサイズが大きい音声データはSoundPoolでの再生をあきらめるか、可能であるならばなるべく小さくして読み込ませてあげる必要があります。

最後に

音声の再生はUI/UX的にタイミングがシビアに求められるので、特に1番のようにイベントが走った直後に読み込み -> 再生を行うのではなく、必要な音声データはSoundPoolにあらかじめ読み込ませておくといった対応が必要になってきますね。

なめ橋

2013年4月に入社。 最近ようやくiOSの開発に慣れてきた新人のエンジニアです。 髪が長くなるとなめこに似ているといわれます。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。