【Flutter】just_audioで音声を再生

Flutter

just_audioとは

just_audio は、Flutterアプリケーションにおいて音声を再生するためのパッケージです。このパッケージは、URL、ローカルファイル、アセット、ストリームなど様々な音源を扱うことができます。また、ループ再生、クリップ再生、連結再生などの機能も提供しています。

just_audio | Flutter package
A feature-rich audio player for Flutter. Loop, clip and concatenate any sound from any source (asset/file/URL/stream) in...

使い方

インストール

dependencies:
  just_audio: ^0.9.38

基本的な使い方

  1. プレイヤーの作成 final player = AudioPlayer();
  2. URLから音声をロード final duration = await player.setUrl('https://foo.com/bar.mp3');
  3. 再生 player.play(); // 完了を待たずに再生 await player.play(); // 完了を待って再生
  4. 一時停止 await player.pause();
  5. シーク await player.seek(Duration(seconds: 10));
  6. 再生速度の設定 await player.setSpeed(2.0); // 2倍速
  7. 音量の設定 await player.setVolume(0.5); // 半分の音量
  8. 停止
    dart await player.stop();

複数のプレイヤーの操作

// 2つのプレイヤーをセットアップ
final player1 = AudioPlayer();
await player1.setUrl('https://foo.com/bar1.mp3');
final player2 = AudioPlayer();
await player2.setUrl('https://foo.com/bar2.mp3');

// 同時に再生
player1.play();
player2.play();

// 連続して再生
await player1.play();
await player2.play();

// player2が終了するまでplayer1をループ
await player1.setLoopMode(LoopMode.one);
player1.play();
await player2.play();
await player1.pause();

// リソースを解放
await player1.stop();
await player2.stop();

クリップの操作

// クリップ再生
await player.setClip(start: Duration(seconds: 2), end: Duration(seconds: 4));
await player.play();
await player.pause();

// クリップ範囲をクリア
await player.setClip();

ギャップレスプレイリストの操作

// プレイリストの定義
final playlist = ConcatenatingAudioSource(
  useLazyPreparation: true,
  shuffleOrder: DefaultShuffleOrder(),
  children: [
    AudioSource.uri(Uri.parse('https://example.com/track1.mp3')),
    AudioSource.uri(Uri.parse('https://example.com/track2.mp3')),
    AudioSource.uri(Uri.parse('https://example.com/track3.mp3')),
  ],
);

// プレイリストのロードと再生
await player.setAudioSource(playlist, initialIndex: 0, initialPosition: Duration.zero);
await player.seekToNext();
await player.seekToPrevious();
await player.seek(Duration.zero, index: 2);
await player.setLoopMode(LoopMode.all);
await player.setShuffleModeEnabled(true);

// プレイリストの更新
await playlist.add(AudioSource.uri(Uri.parse('https://example.com/track4.mp3')));
await playlist.insert(3, AudioSource.uri(Uri.parse('https://example.com/track5.mp3')));
await playlist.removeAt(3);

リクエストヘッダーの設定

// HTTPリクエストヘッダーを設定
final player = AudioPlayer(
  userAgent: 'myradioapp/1.0 (Linux;Android 11) https://myradioapp.com',
  useProxyForRequestHeaders: true,
);

final duration = await player.setUrl(
  'https://foo.com/bar.mp3',
  headers: {'header1': 'value1', 'header2': 'value2'}
);

エラー処理

// ロード時のエラーキャッチ
try {
  await player.setUrl('https://s3.amazonaws.com/404-file.mp3');
} on PlayerException catch (e) {
  print("Error code: ${e.code}");
  print("Error message: ${e.message}");
} on PlayerInterruptedException catch (e) {
  print("Connection aborted: ${e.message}");
} catch (e) {
  print('An error occurred: $e');
}

// 再生中のエラーキャッチ
player.playbackEventStream.listen((event) {}, onError: (Object e, StackTrace st) {
  if (e is PlatformException) {
    print('Error code: ${e.code}');
    print('Error message: ${e.message}');
    print('AudioSource index: ${e.details?["index"]}');
  } else {
    print('An error occurred: $e');
  }
});

キャッシュの操作

// アセットキャッシュのクリア
await AudioPlayer.clearAssetCache();

// 再生中のオーディオをダウンロードしてキャッシュ
final audioSource = LockCachingAudioSource('https://foo.com/bar.mp3');
await player.setAudioSource(audioSource);

// キャッシュされたファイルを削除
await audioSource.clearCache();

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました