【Flutter】効果音やBGMを鳴らす【audioplayers/AudioCache】

Flutter

Flutter で効果音やBGMを鳴らしたい場合に便利な audioplayers パッケージとAudioCacheクラスについて解説します。

audioplayersパッケージは本来ミュージックプレイヤー実装に使えるものですが、今回はアプリ内のアセット(音声ファイル)を鳴らす目的で使えるAudioCacheクラスについて解説します。

使い方も簡単で、アプリでちょっとした効果音やBGMを鳴らしたい時には非常に便利です。

スポンサーリンク

AudioCacheクラスの使い方

AudioCacheクラスはaudioplayersパッケージに含まれています。iOS/Android/macOS/Webに対応しており、プラットフォームによる挙動の違いはほぼありません。わりと完璧な気がします。

パッケージとアセットの追加

pubspec.yaml にパッケージを追加します。

dependencies:
  flutter:
    sdk: flutter

  # ↓これを追加
  audioplayers: ^0.15.1

同じく pubspec.yaml に効果音とBGMのファイルを追加します。(ファイル名やファイルの数はご自由に)

  # ↓これを追加
  assets:
     - assets/se.wav
     - assets/bgm.wav

AudioCacheクラスの初期化

// 以下をインポート
import 'package:audioplayers/audio_cache.dart';
import 'package:audioplayers/audioplayers.dart'; // AudioPlayerインスタンスを使う場合

// AudioCacheインスタンスの初期化(1度だけ)
AudioCache _player = AudioCache();

再生/ループ再生

// 再生
_player.play('se.wav');

// ループ再生
_player.loop('bgm.wav');

ファイル名を指定して再生、これだけです。(簡単!)

BGMをループ再生しながら、効果音をバンバン鳴らすのも簡単ですね。

停止/一時停止

単発の再生だけなら特に制御は必要ありませんが、BGMをループ再生している場合は、停止などの制御が必要になります。その場合はAudioPlayerクラスのインスタンスを使います。

// ループ再生
AudioPlayer _ap = await _player.loop('bgm.wav');

// 停止
_ap.stop();

// 一時停止
_ap.pause();

再生時に個別のAudioPlayerクラスのインスタンスが生成されるので、これを保持しておいて、インスタンス経由で停止などの制御を行います。

音量/再生スピード

AudioPlayerクラスのインスタンス経由で音量や再生スピードの変更も可能です。

// 音量の変更
_ap.setVolume(0.5); //デフォルトは1.0

// 再生スピードの変更
_ap.setPlaybackRate(playbackRate: 0.7); //デフォルトは1.0

※再生スピードの変更はwebだけ対応していません。

再生スピードの変更は、よくある音程が変わってしまうものではなく、音程が変わらずにスピードを変えられる「タイムストレッチ」なので、ゆっくり再生したり倍速再生などにも使えます。

音声ファイルのプリロードや破棄

AudioCache はメモリ上に音声データをスタンバイして、遅延なく再生できることを目的にしています。メモリを消費するので、データのロードと破棄についても明示的に記載できるようになっています。

// プリロード
_player.load('se.wav');

// プリロード(一括)
_player.loadAll(['se.wav', 'bgm.wav'])

// 破棄
_player.clear('se.wav');

音声ファイルを切り替える場面が多い時は、シーン毎に使用する音声ファイルをロード&破棄しつつ使用すると良いでしょう。

音声フォーマット

再生できる音声フォーマットは各プラットフォームがサポートしているフォーマットに依存します。一般的なフォーマット(wavやmp3)を使えば問題ないでしょう。

まとめ

今のところアプリで音を鳴らす用途ではこのパッケージが良さげだと思います。

アプリで効果音を鳴らしたいとか、ちょっとしたゲームなんかにも十分使えるんじゃないでしょうか!

コメント

  1. sk より:

    音を出したかったもののsoundpoolで1時間ほど詰まって、こちらの記事を目にしてaudioplayerに変えたところ一瞬で音が出ました。
    本当にありがとうございますorz

タイトルとURLをコピーしました