flutter如何实现音频播放

在Flutter中如何实现音频播放功能?需要支持本地和网络音频文件播放,最好能提供进度控制、音量调节和播放状态监听的完整示例代码。目前尝试使用audioplayers插件,但遇到网络音频加载缓慢和状态更新不及时的问题,是否有更优的解决方案或推荐的其他插件?

2 回复

Flutter 中实现音频播放可使用 audioplayers 库。步骤如下:

  1. 添加依赖到 pubspec.yaml
  2. 导入库并创建 AudioPlayer 实例。
  3. 调用 play 方法,传入音频 URL 或本地路径。
  4. 可控制暂停、停止和音量。

更多关于flutter如何实现音频播放的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现音频播放,主要有以下几种方式:

1. audioplayers 包(推荐)

最常用的音频播放库,支持本地和网络音频。

安装依赖:

dependencies:
  audioplayers: ^5.0.0

基本使用:

import 'package:audioplayers/audioplayers.dart';

class AudioPlayerWidget extends StatefulWidget {
  @override
  _AudioPlayerWidgetState createState() => _AudioPlayerWidgetState();
}

class _AudioPlayerWidgetState extends State<AudioPlayerWidget> {
  final AudioPlayer audioPlayer = AudioPlayer();
  bool isPlaying = false;
  Duration duration = Duration.zero;
  Duration position = Duration.zero;

  @override
  void initState() {
    super.initState();
    
    // 监听播放状态
    audioPlayer.onPlayerStateChanged.listen((state) {
      setState(() {
        isPlaying = state == PlayerState.playing;
      });
    });

    // 监听时长变化
    audioPlayer.onDurationChanged.listen((newDuration) {
      setState(() {
        duration = newDuration;
      });
    });

    // 监听播放位置
    audioPlayer.onPositionChanged.listen((newPosition) {
      setState(() {
        position = newPosition;
      });
    });
  }

  // 播放网络音频
  Future<void> playAudio() async {
    await audioPlayer.play(UrlSource('https://example.com/audio.mp3'));
  }

  // 播放本地音频
  Future<void> playLocalAudio() async {
    await audioPlayer.play(AssetSource('audio/local_audio.mp3'));
  }

  // 暂停
  Future<void> pauseAudio() async {
    await audioPlayer.pause();
  }

  // 停止
  Future<void> stopAudio() async {
    await audioPlayer.stop();
  }

  // 调整位置
  Future<void> seekAudio(Duration position) async {
    await audioPlayer.seek(position);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Slider(
          min: 0,
          max: duration.inSeconds.toDouble(),
          value: position.inSeconds.toDouble(),
          onChanged: (value) {
            seekAudio(Duration(seconds: value.toInt()));
          },
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            IconButton(
              icon: Icon(isPlaying ? Icons.pause : Icons.play_arrow),
              onPressed: () {
                if (isPlaying) {
                  pauseAudio();
                } else {
                  playAudio();
                }
              },
            ),
            IconButton(
              icon: Icon(Icons.stop),
              onPressed: stopAudio,
            ),
          ],
        ),
      ],
    );
  }

  @override
  void dispose() {
    audioPlayer.dispose();
    super.dispose();
  }
}

2. just_audio 包

功能更强大的音频播放库,适合复杂需求。

安装:

dependencies:
  just_audio: ^0.9.35

简单使用:

import 'package:just_audio/just_audio.dart';

final AudioPlayer player = AudioPlayer();

// 播放音频
await player.setUrl('https://example.com/audio.mp3');
await player.play();

// 暂停
await player.pause();

// 停止
await player.stop();

3. 原生集成

对于特殊需求,可以通过 platform channels 调用原生代码。

配置注意事项

Android:

  • AndroidManifest.xml 中添加网络权限(网络音频):
<uses-permission android:name="android.permission.INTERNET" />

iOS:

  • Info.plist 中添加:
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

推荐方案

  • 简单需求:使用 audioplayers
  • 复杂音频处理:使用 just_audio
  • 后台播放:需要额外配置后台服务

选择哪种方式取决于你的具体需求,audioplayers 能满足大部分常见场景。

回到顶部