Flutter音频服务插件audio_service的使用

Flutter音频服务插件audio_service的使用

介绍

audio_service 是一个用于Flutter应用程序的插件,它允许你的音频代码在后台运行,并与媒体通知、锁屏、耳机按钮、可穿戴设备和Android Auto进行交互。该插件支持Android、iOS、Web和Linux(通过 audio_service_mpris)。适用于以下场景:

  • 音乐播放器
  • 文本转语音阅读器
  • 播客播放器
  • 视频播放器
  • 导航器
  • 更多!

插件工作原理

你需要将你的音频代码封装在一个实现了标准系统回调的 AudioHandler 中,以统一处理来自不同来源的媒体播放请求。例如,一个文本转语音阅读器应用可以使用 flutter_tts 来实现这些回调,而一个音乐播放器应用则可以使用 just_audio 来渲染音频。

支持的功能特性

特性 Android iOS macOS Web
背景音频
耳机点击
播放/暂停/快进/倒退/停止
快速前进/回退
重复/随机模式
队列操作,跳过下一个/上一个
自定义动作/事件/状态
通知/控制中心
锁屏控制
专辑封面
Android Auto, Apple CarPlay

使用教程和文档

示例代码

以下是audio_service的基本使用示例,包括初始化、发送请求到音频处理器以及监听状态变化等。

初始化

class MyAudioHandler extends BaseAudioHandler with QueueHandler, SeekHandler {
  final _player = AudioPlayer();

  // 常见回调方法
  Future<void> play() => _player.play();
  Future<void> pause() => _player.pause();
  Future<void> stop() => _player.stop();
  Future<void> seek(Duration position) => _player.seek(position);
  Future<void> skipToQueueItem(int i) => _player.seek(Duration.zero, index: i);
}

Future<void> main() async {
  // 存储为单例
  _audioHandler = await AudioService.init(
    builder: () => MyAudioHandler(),
    config: AudioServiceConfig(
      androidNotificationChannelId: 'com.mycompany.myapp.channel.audio',
      androidNotificationChannelName: 'Music playback',
    ),
  );
  runApp(new MyApp());
}

发送请求到音频处理器

_audioHandler.play();
_audioHandler.seek(Duration(seconds: 10));
_audioHandler.setSpeed(1.5);
_audioHandler.pause();
_audioHandler.stop();

// 播放特定媒体项
var item = MediaItem(
  id: 'https://example.com/audio.mp3',
  album: 'Album name',
  title: 'Track title',
  artist: 'Artist name',
  duration: const Duration(milliseconds: 123456),
  artUri: Uri.parse('https://example.com/album.jpg'),
);

_audioHandler.playMediaItem(item);
_audioHandler.playFromSearch(queryString);
_audioHandler.playFromUri(uri);
_audioHandler.playFromMediaId(id);

// 队列管理
_audioHandler.addQueueItem(item);
_audioHandler.insertQueueItem(1, item);
_audioHandler.removeQueueItem(item);
_audioHandler.updateQueue([item, ...]);
_audioHandler.skipToNext();
_audioHandler.skipToPrevious();
_audioHandler.skipToQueueItem(2);

// 循环和随机播放
_audioHandler.setRepeatMode(AudioServiceRepeatMode.one); // none/one/all/group
_audioHandler.setShuffleMode(AudioServiceShuffleMode.all); // none/all/group

// 自定义动作
_audioHandler.customAction('setVolume', {'volume': 0.8});
_audioHandler.customAction('saveBookmark');

广播状态变化

mediaItem.add(item1);
queue.add(<MediaItem>[item1, item2, item3]);

playbackState.add(PlaybackState(
  controls: [
    MediaControl.skipToPrevious,
    MediaControl.pause,
    MediaControl.stop,
    MediaControl.skipToNext,
  ],
  systemActions: const {
    MediaAction.seek,
    MediaAction.seekForward,
    MediaAction.seekBackward,
  },
  androidCompactActionIndices: const [0, 1, 3],
  processingState: AudioProcessingState.ready,
  playing: true,
  updatePosition: Duration(milliseconds: 54321),
  bufferedPosition: Duration(milliseconds: 65432),
  speed: 1.0,
  queueIndex: 0,
));

playbackState.add(playbackState.value.copyWith(
  speed: newSpeed,
));

监听状态变化

_audioHandler.mediaItem.listen((MediaItem item) { ... });
_audioHandler.queue.listen((List<MediaItem> queue) { ... });
_audioHandler.playbackState.listen((PlaybackState state) {
  if (state.playing) ... else ...
  switch (state.processingState) {
    case AudioProcessingState.idle: ...
    case AudioProcessingState.loading: ...
    case AudioProcessingState.buffering: ...
    case AudioProcessingState.ready: ...
    case AudioProcessingState.completed: ...
    case AudioProcessingState.error: ...
  }
});

AudioService.position.listen((Duration position) { ... });

完整示例

完整的示例代码可以在GitHub仓库中找到,其中包括了更多高级特性和详细的实现细节。


更多关于Flutter音频服务插件audio_service的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频服务插件audio_service的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用audio_service插件来实现音频服务的示例代码。这个插件允许你在后台播放音频,并处理音频控制事件(如播放、暂停、停止等)。

首先,确保你已经在pubspec.yaml文件中添加了audio_service及其依赖项:

dependencies:
  flutter:
    sdk: flutter
  audio_service: ^0.x.y  # 请替换为最新版本号
  just_audio: ^0.x.y      # audio_service 的依赖项

然后,运行flutter pub get来安装这些依赖项。

接下来,你需要创建一个AudioHandler类来处理音频事件。这是一个简单的例子:

import 'package:audio_service/audio_service.dart';
import 'package:just_audio/just_audio.dart';

class AudioHandler extends BaseAudioHandler {
  final AudioPlayer _player = AudioPlayer();

  AudioHandler() {
    // 初始化播放器
    _player.setCipherSuite(CipherSuite.aes128cbc);
  }

  @override
  Future<void> play() async {
    // 播放音频文件的URL,请替换为你的音频文件URL
    final mediaItem = MediaItem(
      id: 'audio_id',
      album: 'Album',
      title: 'Title',
      artist: 'Artist',
      duration: const Duration(seconds: 120),
      artUri: Uri.parse('https://example.com/art.jpg'),
      extras: <String, dynamic>{'episodeId': '123'},
    );
    await _player.setMediaItem(mediaItem);
    await _player.play();
    await super.play();
  }

  @override
  Future<void> pause() => _player.pause();

  @override
  Future<void> stop() => _player.stop();

  @override
  Future<void> seekTo(Duration position) => _player.seek(position);

  @override
  Duration? get position => _player.position;

  @override
  Duration get bufferedPosition => _player.bufferedPosition;

  @override
  bool get playing => _player.playing;

  @override
  Future<void> skipToNext() async {
    // 实现跳转到下一首的逻辑(如果有的话)
  }

  @override
  Future<void> skipToPrevious() async {
    // 实现跳转到上一首的逻辑(如果有的话)
  }

  @override
  Future<void> setRepeatMode(AudioServiceRepeatMode repeatMode) async {
    // 实现循环播放的逻辑(如果有的话)
  }

  @override
  Future<void> setShuffleMode(AudioServiceShuffleMode shuffleMode) async {
    // 实现随机播放的逻辑(如果有的话)
  }

  @override
  Future<void> customAction(String action, Map<String, dynamic> arguments) async {
    // 实现自定义动作的逻辑(如果有的话)
  }
}

然后,在你的主应用文件中(通常是main.dart),你需要初始化AudioService并绑定到你的AudioHandler

import 'package:flutter/material.dart';
import 'package:audio_service/audio_service.dart';
import 'audio_handler.dart';  // 导入你创建的AudioHandler类

void main() {
  // 初始化AudioService并绑定AudioHandler
  AudioService.init(
    builder: () => AudioHandler(),
    config: AudioServiceConfig(
      androidNotificationChannelId: 'com.example.myapp.audioservice',
      androidNotificationChannelName: 'Audio Service',
      androidNotificationOngoing: true,
      iosCategory: 'playback',
      iosCategoryOptions: IosCategoryOptions(allowsRemoteControl: true),
    ),
  ).then((_) {
    runApp(MyApp());
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Audio Service Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () => AudioService.play(),
                child: Text('Play'),
              ),
              ElevatedButton(
                onPressed: () => AudioService.pause(),
                child: Text('Pause'),
              ),
              ElevatedButton(
                onPressed: () => AudioService.stop(),
                child: Text('Stop'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何使用audio_service插件来播放音频,并处理播放、暂停和停止的基本操作。你可以根据需要扩展这个示例,添加更多功能,如处理播放列表、实现循环播放和随机播放等。

请注意,由于audio_servicejust_audio插件的API可能会随着版本更新而变化,因此在实际开发中,请务必查阅最新的官方文档和示例代码。

回到顶部