Flutter如何通过just_audio实现音频播放

我正在使用Flutter开发一个需要播放音频的APP,了解到just_audio这个插件比较流行,但不知道具体如何实现。想请教几个问题:1. 怎么在项目中集成just_audio?2. 如何加载本地和网络音频文件?3. 能否实现播放控制(暂停/继续/进度跳转)?4. 遇到缓冲问题时该怎么处理?5. 有没有处理音频焦点冲突的最佳实践?希望有用过这个插件的大神能分享一下经验。

2 回复

使用just_audio播放音频步骤:

  1. 添加依赖:just_audio: ^0.9.34
  2. 创建播放器:final player = AudioPlayer()
  3. 设置音频源:await player.setUrl('音频URL')
  4. 控制播放:player.play()player.pause()
  5. 释放资源:player.dispose()

支持本地文件、网络URL,可控制音量、进度等。

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


在 Flutter 中,使用 just_audio 包可以方便地实现音频播放。以下是详细步骤:

  1. 添加依赖
    pubspec.yaml 文件中添加依赖:

    dependencies:
      just_audio: ^0.9.35
    

    运行 flutter pub get 安装包。

  2. 基本播放实现

    • 创建 AudioPlayer 实例:
      final _audioPlayer = AudioPlayer();
      
    • 加载音频源(支持网络、本地文件或资产):
      await _audioPlayer.setUrl('https://example.com/audio.mp3');
      // 或本地文件:setFilePath('/path/to/file.mp3')
      // 或资产文件:setAsset('assets/audio.mp3')
      
    • 控制播放:
      _audioPlayer.play();  // 播放
      _audioPlayer.pause(); // 暂停
      _audioPlayer.stop();  // 停止
      
  3. 进度与状态监听
    使用 StreamBuilder 监听播放状态和进度:

    StreamBuilder<Duration>(
      stream: _audioPlayer.durationStream,
      builder: (context, snapshot) {
        final duration = snapshot.data ?? Duration.zero;
        return StreamBuilder<Duration>(
          stream: _audioPlayer.positionStream,
          builder: (context, snapshot) {
            var position = snapshot.data ?? Duration.zero;
            if (position > duration) position = duration;
            return Slider(
              value: position.inMilliseconds.toDouble(),
              max: duration.inMilliseconds.toDouble(),
              onChanged: (value) => _audioPlayer.seek(
                Duration(milliseconds: value.toInt()),
              ),
            );
          },
        );
      },
    );
    
  4. 完整示例

    import 'package:flutter/material.dart';
    import 'package:just_audio/just_audio.dart';
    
    class AudioPlayerScreen extends StatefulWidget {
      @override
      _AudioPlayerScreenState createState() => _AudioPlayerScreenState();
    }
    
    class _AudioPlayerScreenState extends State<AudioPlayerScreen> {
      final _audioPlayer = AudioPlayer();
    
      @override
      void initState() {
        super.initState();
        _initAudio();
      }
    
      Future<void> _initAudio() async {
        try {
          await _audioPlayer.setUrl('https://example.com/audio.mp3');
        } catch (e) {
          print("Error loading audio: $e");
        }
      }
    
      @override
      void dispose() {
        _audioPlayer.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Column(
            children: [
              StreamBuilder<Duration>(
                stream: _audioPlayer.durationStream,
                builder: (context, snapshot) {
                  final duration = snapshot.data ?? Duration.zero;
                  return StreamBuilder<Duration>(
                    stream: _audioPlayer.positionStream,
                    builder: (context, snapshot) {
                      var position = snapshot.data ?? Duration.zero;
                      if (position > duration) position = duration;
                      return Slider(
                        value: position.inMilliseconds.toDouble(),
                        max: duration.inMilliseconds.toDouble(),
                        onChanged: (value) => _audioPlayer.seek(
                          Duration(milliseconds: value.toInt()),
                        ),
                      );
                    },
                  );
                },
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  IconButton(
                    icon: Icon(Icons.play_arrow),
                    onPressed: _audioPlayer.play,
                  ),
                  IconButton(
                    icon: Icon(Icons.pause),
                    onPressed: _audioPlayer.pause,
                  ),
                  IconButton(
                    icon: Icon(Icons.stop),
                    onPressed: _audioPlayer.stop,
                  ),
                ],
              ),
            ],
          ),
        );
      }
    }
    
  5. 注意事项

    • 处理权限:安卓需添加 <uses-permission android:name="android.permission.INTERNET" />(网络音频)。
    • 错误处理:通过 try-catch 捕获 setUrl 等操作的异常。
    • 资源释放:在 dispose() 中调用 _audioPlayer.dispose() 避免内存泄漏。

通过以上步骤,即可在 Flutter 中快速实现音频播放功能。

回到顶部