flutter如何实现音频播放

在Flutter中如何实现音频播放功能?需要使用哪个插件或者原生代码?能否提供简单的代码示例说明如何加载本地音频文件和网络音频流?播放过程中如何控制暂停、继续和音量调节?是否需要处理后台播放或锁屏控制?不同平台(iOS/Android)的实现是否有差异?

2 回复

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

  1. audioplayers 插件(最常用):

    • 支持播放本地和网络音频
    • 基本用法:
    final player = AudioPlayer();
    await player.play(UrlSource('https://example.com/audio.mp3'));
    
    • 可控制暂停、音量、进度等
  2. just_audio 插件(功能更强大):

    • 支持高级功能如循环播放、播放列表
    • 适合复杂音频应用
  3. 其他方式:

    • 使用 video_player 播放音频(不推荐)
    • 原生集成(适合特殊需求)

建议步骤:

  1. 在 pubspec.yaml 添加依赖
  2. 配置安卓/iOS 权限
  3. 实现基本播放控制
  4. 处理后台播放(需要额外配置)

推荐先用 audioplayers 快速上手,需要高级功能时再考虑 just_audio。注意网络音频需要网络权限,本地文件需要存储权限。

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


在Flutter中实现音频播放,可以使用以下几种常用方式:

1. audioplayers 包(推荐)

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

安装依赖:

dependencies:
  audioplayers: ^5.0.0

基本使用:

import 'package:audioplayers/audioplayers.dart';

class AudioPlayerPage extends StatefulWidget {
  @override
  _AudioPlayerPageState createState() => _AudioPlayerPageState();
}

class _AudioPlayerPageState extends State<AudioPlayerPage> {
  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('audios/sample.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 Scaffold(
      body: 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 包

如果需要更高级的音频功能,可以使用 just_audio:

dependencies:
  just_audio: ^0.9.35
import 'package:just_audio/just_audio.dart';

final player = AudioPlayer();

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

// 循环播放
player.setLoopMode(LoopMode.one);

3. 权限配置

android/app/src/main/AndroidManifest.xml 中添加网络权限:

<uses-permission android:name="android.permission.INTERNET" />

主要特性

  • 支持本地和网络音频
  • 后台播放
  • 音量控制
  • 进度控制
  • 播放状态监听

audioplayers 是最简单易用的选择,适合大多数音频播放需求。

回到顶部