Flutter音频服务插件audio_service_web的使用

发布于 1周前 作者 nodeper 来自 Flutter

Flutter音频服务插件audio_service_web的使用

audio_service_web 插件简介

audio_service_web 是一个用于在Flutter项目中处理音频播放服务的插件,特别适用于需要创建后台播放功能的应用。该插件为开发者提供了一种便捷的方式,以实现跨平台(Android、iOS 和 Web)的音频播放服务,而无需担心不同平台之间的差异。

快速开始

添加依赖

首先,在你的 pubspec.yaml 文件中添加 audio_servicejust_audio 作为依赖项:

dependencies:
  flutter:
    sdk: flutter
  audio_service: ^0.18.0 # 确认版本是否最新
  just_audio: ^0.9.17 # 确认版本是否最新

然后执行 flutter pub get 来安装这些包。

创建AudioHandler

接下来,你需要创建一个继承自 BaseAudioHandler 的类来管理音频播放逻辑。下面是一个简单的例子,它展示了如何设置一个基本的 AudioHandler:

import 'package:audio_service/audio_service.dart';

class MyAudioHandler extends BaseAudioHandler {
  MyAudioHandler() : super();

  // 在这里定义你的音频控制逻辑
}

配置Web平台支持

对于Web平台的支持,你需要确保项目中的 index.html 文件正确配置了 <base href="/"> 标签,并且在 web 目录下的 main.dart.js 文件可以被正常加载。此外,还需要在 lib/main.dart 中初始化 audio_service

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AudioService.init(
    builder: () => MyAudioHandler(),
    config: const AudioServiceConfig(
      androidNotificationChannelId: 'com.yourcompany.yourapp.audio',
      androidNotificationChannelName: 'Audio playback',
      androidNotificationOngoing: true,
    ),
  );
  runApp(MyApp());
}

请注意,由于Web平台的限制,部分功能可能无法像在移动平台上那样工作,比如后台播放时的通知栏显示等。

示例代码

以下是一个完整的示例应用,演示了如何使用 audio_service_web 进行基本的音频播放操作:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AudioService.init(
    builder: () => MyAudioHandler(),
    config: const AudioServiceConfig(
      androidNotificationChannelId: 'com.yourcompany.yourapp.audio',
      androidNotificationChannelName: 'Audio playback',
      androidNotificationOngoing: true,
    ),
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(title: Text('Audio Service Example')),
        body: Center(child: PlayButton()),
      ),
    );
  }
}

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

  MyAudioHandler() {
    _player.playbackEventStream.listen((event) {
      final playing = _player.playing;
      playbackState.add(playbackState.value.copyWith(
        playing: playing,
        processingState: playing ? AudioProcessingState.ready : AudioProcessingState.idle,
      ));
    });
  }

  @override
  Future<void> play() async {
    await _player.setUrl('https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3');
    await _player.play();
  }

  @override
  Future<void> pause() async {
    await _player.pause();
  }

  @override
  Future<void> stop() async {
    await _player.stop();
    playbackState.add(playbackState.value.copyWith(
      processingState: AudioProcessingState.stopped,
      playing: false,
    ));
  }
}

class PlayButton extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<PlaybackState>(
      stream: AudioService.playbackStateStream,
      builder: (context, snapshot) {
        final playbackState = snapshot.data;
        final processingState = playbackState?.processingState;
        final playing = playbackState?.playing;
        if (processingState == AudioProcessingState.loading ||
            processingState == AudioProcessingState.buffering) {
          return Container(margin: EdgeInsets.all(8.0), width: 64.0, height: 64.0, child: CircularProgressIndicator());
        } else if (playing == true) {
          return IconButton(
            icon: Icon(Icons.pause),
            iconSize: 64.0,
            onPressed: () => AudioService.pause(),
          );
        } else {
          return IconButton(
            icon: Icon(Icons.play_arrow),
            iconSize: 64.0,
            onPressed: () => AudioService.play(),
          );
        }
      },
    );
  }
}

这个例子创建了一个简单的界面,其中包含一个按钮用于控制音频的播放和暂停。当用户点击按钮时,它会调用 AudioService.play()AudioService.pause() 方法来控制音频播放。

通过上述步骤,你应该能够在Flutter项目中成功集成并使用 audio_service_web 插件了。如果有任何问题或需要进一步的帮助,请随时查阅官方文档或者社区资源。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用audio_service_web插件来实现音频服务的代码示例。audio_service_webaudio_service插件的Web平台实现,允许你在Flutter Web应用中处理音频播放。

首先,确保在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  audio_service: ^0.xx.x  # 请使用最新版本号
  audio_service_web: ^0.xx.x  # 请使用最新版本号

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

接下来,你需要创建一个音频播放服务。以下是一个简单的实现示例:

  1. 创建一个音频播放器类

首先,创建一个新的Dart文件,例如audio_player.dart,来定义你的音频播放器服务。

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

class AudioPlayer implements MediaItemNotifier {
  final AudioPlayerHandler _audioPlayerHandler = AudioPlayerHandler();

  AudioPlayer() {
    _audioPlayerHandler.setCustomActionsHandlers(customActions: {});
  }

  Future<void> play() async {
    final mediaItem = MediaItem(
      id: '1',
      title: 'Sample Audio',
      album: 'Album',
      artist: 'Artist',
      duration: const Duration(seconds: 60), // 示例时长
      artUri: Uri.parse('https://example.com/album_art.jpg'), // 示例封面图片URL
    );

    final AudioPlayerState state = await _audioPlayerHandler.playFromMediaItem(mediaItem);
    // 这里可以处理播放状态的变化,例如更新UI
  }

  Future<void> pause() async {
    await _audioPlayerHandler.pause();
  }

  Future<void> stop() async {
    await _audioPlayerHandler.stop();
  }

  @override
  Future<MediaItem?> getMediaItem() async => _audioPlayerHandler.mediaItem;

  @override
  Stream<MediaItem?> get mediaItemChanged => _audioPlayerHandler.mediaItemChanged;

  @override
  Future<void> setMediaItem(MediaItem? mediaItem) async {
    if (mediaItem != null) {
      await _audioPlayerHandler.playFromMediaItem(mediaItem);
    }
  }
}
  1. 配置audio_service

在你的主应用文件中(例如main.dart),配置audio_service以使用你定义的音频播放器服务。

import 'package:flutter/material.dart';
import 'package:audio_service/audio_service.dart';
import 'audio_player.dart';

void main() {
  AudioService.init(
    builder: () => AudioPlayer(),
    config: AudioServiceConfig(
      androidNotificationChannelId: 'com.example.myapp.channel.audio',
      androidNotificationChannelName: 'Audio Playback',
      androidNotificationOngoing: true,
      iosCategory: .playback,
      iosCategoryOptions: [.allowBackgroundMode, .mixWithOthers],
    ),
  );

  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'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
  1. 处理Web平台特定的配置

由于audio_service_webaudio_service的Web平台实现,你通常不需要额外的配置即可在Web上运行。但是,确保你的index.html文件允许音频自动播放(如果需要)。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Flutter Audio Service Example</title>
  <script>
    if ('mediaSession' in navigator) {
      navigator.mediaSession.setActionHandler('play', function() {
        // 在这里触发播放操作,例如通过JavaScript与Flutter通信
      });
      navigator.mediaSession.setActionHandler('pause', function() {
        // 在这里触发暂停操作
      });
      navigator.mediaSession.setActionHandler('stop', function() {
        // 在这里触发停止操作
      });
    }
  </script>
</head>
<body>
  <script src="main.dart.js" type="application/javascript"></script>
</body>
</html>

请注意,上面的index.html中的JavaScript部分是一个示例,实际项目中你可能需要通过Flutter的插件机制来实现媒体会话控制。

这个示例展示了如何使用audio_serviceaudio_service_web来在Flutter Web应用中处理音频播放。你可以根据需要扩展这个基础实现,例如添加更多的自定义操作、处理播放列表等。

回到顶部