【Flutter】Flutter 使用 just_audio 播放音频

news2024/11/15 13:51:55

【Flutter】Flutter 使用 just_audio 播放音频

文章目录

    • 一、前言
    • 二、环境与版本信息
    • 三、安装和基本使用
    • 四、深入 just_audio
    • 五、实际业务中的用法
    • 六、完整示例
    • 七、总结

一、前言

今天,我要为你介绍一个非常实用的 Flutter 音频处理包——just_audio。这个包不仅功能丰富,而且支持多种平台,可以帮助你轻松实现音频的播放、循环、剪辑等操作。本文的重点是帮助你快速上手 just_audio,掌握其基本使用方法,并为你提供一个完整的音乐播放器示例。希望你能跟着我的步骤,一步一步学习,最终成为 Flutter 音频处理的小专家!

你是否对成为 Flutter 高手充满渴望,想要掌握更多前沿技巧和最佳实践?现在,你的机会来了!

🚀 Flutter 从零到一:基础入门到应用上线全攻略 正在热烈招募参与者!

✅ 这个专栏不仅包括了全面的 Flutter 学习资源,还有实用的代码示例和深入的解析教程。
✅ 专栏内容会持续更新,价格也会随之上涨。现在加入,享受最优惠的价格,抓住属于你的机会!
✅ 想要与其他 Flutter 学习者互动交流吗?点击这里 加入我们的讨论群,一起成长、一起进步。

别再等待,让我们今天就启程,共同开启 Flutter 的精彩学习之旅吧!

二、环境与版本信息

  • Flutter 版本:3.10
  • Dart 版本:3.0
  • just_audio 包版本:0.9.34

三、安装和基本使用

  1. 如何安装 just_audio 包

    在你的 pubspec.yaml 文件中添加以下依赖:

    dependencies:
      just_audio: ^0.9.34
    

    然后运行 flutter pub get 命令来安装包。

  2. 简单的播放示例

    import 'package:just_audio/just_audio.dart';
    
    final player = AudioPlayer();
    final duration = await player.setUrl('https://foo.com/bar.mp3');
    player.play();
    
  3. 常用功能概览

    • 播放和暂停:player.play()player.pause()
    • 跳转到指定位置:player.seek(Duration(seconds: 10))
    • 设置播放速度:player.setSpeed(2.0)
    • 设置音量:player.setVolume(0.5)
    • 停止播放:player.stop()

这是小雨青年于 2023 年发布在 CSDN 的博客,由于目前采集站侵权行为猖獗,如果你不是在 CSDN 看到本文,麻烦你通过 CSDN 联系我,谢谢你的支持。

四、深入 just_audio

  1. 音频源的处理
    just_audio 支持多种音频源,包括 assets、files、URLs 和 streams。你可以根据需要选择合适的音频源。

    • 从 assets 播放:

      final player = AudioPlayer();
      final duration = await player.setAsset('assets/foo.mp3');
      player.play();
      
    • 从文件播放:

      final player = AudioPlayer();
      final duration = await player.setFilePath('/path/to/foo.mp3');
      player.play();
      
  2. 音频播放的控制
    除了基本的播放和暂停功能,just_audio 还提供了许多高级的播放控制功能,如循环、随机播放等。

  3. 音频的高级功能
    just_audio 不仅支持基本的播放控制,还提供了一些高级功能,如音频剪辑、连接等。

五、实际业务中的用法

  1. 创建一个音乐播放器
    在实际业务中,我们可能需要为用户提供一个完整的音乐播放器界面,包括播放/暂停按钮、进度条、音量控制等。使用 just_audio,我们可以轻松实现这些功能。

    AudioPlayer player = AudioPlayer();
    bool isPlaying = false;
    
    playPause() {
      if (isPlaying) {
        player.pause();
      } else {
        player.play();
      }
      setState(() {
        isPlaying = !isPlaying;
      });
    }
    
  2. 音频列表和播放队列的管理
    如果你需要为用户提供一个播放列表,just_audio 也可以满足你的需求。你可以使用 ConcatenatingAudioSource 来管理播放队列。

    var playlist = ConcatenatingAudioSource(
      children: [
        AudioSource.uri(Uri.parse("https://example.com/track1.mp3")),
        AudioSource.uri(Uri.parse("https://example.com/track2.mp3")),
        // ... 更多音轨
      ],
    );
    player.setAudioSource(playlist);
    
  3. 错误处理和异常管理
    当处理音频时,我们可能会遇到各种错误,如网络错误、文件格式不支持等。just_audio 提供了错误处理机制,帮助我们捕获和处理这些异常。

    player.playerStateStream.listen((state) {
      if (state.processingState == ProcessingState.error) {
        print("Error loading audio source: ${state.error}");
      }
    });
    

六、完整示例

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

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late AudioPlayer player;
  bool isPlaying = false;
  double volume = 1.0;

  
  void initState() {
    super.initState();
    player = AudioPlayer();
    _loadAudio();
  }

  _loadAudio() async {
    await player.setUrl(
        'https://xxxxx.oss-cn-beijing.aliyuncs.com/xxx.mp3');//需要替换成可访问的 url
  }

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('音乐播放器')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                child: Text(isPlaying ? "暂停" : "播放"),
                onPressed: () {
                  playPause();
                },
              ),
              ElevatedButton(
                child: Text("停止"),
                onPressed: () {
                  stop();
                },
              ),
              Slider(
                value: volume,
                onChanged: (newVolume) {
                  setState(() {
                    volume = newVolume;
                    player.setVolume(volume);
                  });
                },
                min: 0.0,
                max: 1.0,
              ),
              ElevatedButton(
                child: Text("前进 10 秒"),
                onPressed: () {
                  seekForward();
                },
              ),
              ElevatedButton(
                child: Text("后退 10 秒"),
                onPressed: () {
                  seekBackward();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

  playPause() {
    if (isPlaying) {
      player.pause();
    } else {
      player.play();
    }
    setState(() {
      isPlaying = !isPlaying;
    });
  }

  stop() {
    player.stop();
    setState(() {
      isPlaying = false;
    });
  }

  seekForward() {
    player.seek(player.position + Duration(seconds: 10));
  }

  seekBackward() {
    player.seek(player.position - Duration(seconds: 10));
  }

  
  void dispose() {
    player.dispose();
    super.dispose();
  }
}

运行结果如下:

七、总结

经过上面的学习,我相信你已经对 just_audio 有了基本的了解,并掌握了其主要功能。这个包为 Flutter 开发者提供了强大的音频处理能力,无论是简单的音频播放,还是复杂的音乐播放器应用,都可以轻松实现。希望你能在实际项目中充分利用这个工具,创造出更多优秀的应用!

这是小雨青年于 2023 年发布在 CSDN 的博客,由于目前采集站侵权行为猖獗,如果你不是在 CSDN 看到本文,麻烦你通过 CSDN 联系我,谢谢你的支持。

对 Flutter 感兴趣,渴望深入探索和学习吗?Flutter 从零到一:基础入门到应用上线全攻略 正是你的完美起点!

📘 在这个专栏中,你将发现丰富的 Flutter 学习资源,从代码示例到深入的技术解读,一应俱全。
🛠️ 想要了解如何用 Flutter 构建出色的应用吗?所有的秘诀和答案都在我们的专栏里等着你!
💰 别再犹豫,专栏内容将不断更新,价格也将逐渐上涨。现在就加入,享受最优惠的价格,开启你的 Flutter 探索之旅!

想了解更多?点击这里查看 Flutter Developer 101:入门小册 & 专栏指引

👥 还有,别忘了点击这里 加入我们的讨论群,与其他 Flutter 爱好者一起交流和学习,共同成长!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA软件安装包分享

目录 一、软件简介 二、软件下载 一、软件简介 IntelliJ IDEA是一款流行的Java集成开发环境&#xff08;IDE&#xff09;&#xff0c;由捷克软件开发公司JetBrains开发。它专为Java开发人员设计&#xff0c;提供了许多高级功能和工具&#xff0c;使得开发人员能够更高效地编写…

《深入理解Java虚拟机》读书笔记:运行时栈帧结构

代码编译的结果从本地机器码转变为字节码&#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步。 一、概述 在Java虚拟机规范中制定了虚拟机字节码执行引擎的概念模型&#xff0c;这个概念模型成为各种虚拟机执行引擎的统一外观&#xff08;Facade&#x…

FrameWork之旅 -- Android_input浅析

最近工作超级忙&#xff0c;周末了&#xff0c;看了下博客&#xff0c;今年居然没有更新过博客&#xff0c;看来还是搬砖太忙了。通过3个小时的代码梳理后&#xff0c;下图是个人对input的简单分析&#xff0c;后面如果有精力&#xff0c;会有更新。

AcWing算法提高课-5.5.1可见的点

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 在一个平面直角坐标系的第一象限内&#xff0c;如果一个点 ( x , y ) (x,y) (x,y) 与原点 ( 0 , 0 ) (0,0) (0,0) 的连线中没有通过其他任何点&#xff0c;则称该点在原点处是可见的。…

第一个react应用程序并添加样式

编写第一个react应用程序 将目录下的文件、src文件夹、public文件夹清空&#xff0c;项目根目录下新建一个文件index.js 在文件中写入以下代码 import React from react import ReactDOM from react-dom ReactDOM.render(<h1>欢迎进入React的世界</h1>,document.…

【LeetCode-中等题】54. 螺旋矩阵

文章目录 题目方法一&#xff1a;按层模拟 题目 方法一&#xff1a;按层模拟 思路就是定义四个指针边界&#xff0c;按顺序扫完一遍&#xff0c;再缩小区域再扫描 public List<Integer> spiralOrder(int[][] matrix) {List<Integer> order new ArrayList<Int…

【IO进程线程】使用标准IO函数完成用户的登录和注册

1 实现登录功能 自定义一个usr.txt&#xff0c;先手动输入其账户密码。 格式&#xff1a;账户 密码 例&#xff1a; zhangsan 12345 lisi abcde wangwu abc123 需求如下&#xff1a; 1. 从终端获取账户密码&#xff0c;与文件中的账户密码比较&#xff1b; 2. 若终端输入的账户…

胖小酱之麻雀虽小

麻雀虽小&#xff0c;五脏俱全的意思&#xff1a;比喻事物的体积或规模虽小&#xff0c;具备的内容却很齐全。释义&#xff1a;比喻事物体积或规模虽小&#xff0c;具备的内容却很齐全。出处&#xff1a;茹志娟《如愿》&#xff1a;你别看我们那个生产小组不大&#xff0c;麻雀…

web自动化框架:selenium学习使用操作大全(Python版)

目录 一、浏览器驱动下载二、selenium-python安装&#xff08;打开网站、操作元素&#xff09;三、网页解析&#xff08;HTML、xpath&#xff09;四、selenium基本操作1、元素定位八种方法2、元素动态定位3、iframe切换4、填充表单_填充文本框5、填充表单_单选按钮6、填充表单_…

XGBoost,LightGBM

目录 XGBoost LightGBM Boosting 框架的主流集成算法&#xff0c;包括 XGBoost 和 LightGBM。 送上完整的思维导图&#xff1a; XGBoost XGBoost 是大规模并行 boosting tree 的工具&#xff0c;它是目前最快最好的开源 boosting tree 工具包&#xff0c;比常见的工具包快 1…

如何将多个网页合并成一个PDF文件?

pdfFactory是一款PDF虚拟打印软件&#xff0c;但与其他虚拟打印机软件不同的是&#xff0c;它使用起来更加简单高效。由于无需Acrobat就能生成Adobe PDF文件&#xff0c;它可以帮助用户在系统没有连接打印机的情况下&#xff0c;将大部分支持打印的文档资料迅速转换成PDF文件&a…

代码随想录第29天|491.递增子序列,46.全排列,47.全排列II

491.递增子序列 491. 递增子序列 这道题的特点是有序的子序列(不能对原数组排序)&#xff0c;最终结果集res不能有重复子集。所以这道题又是子集又是去重 回溯三部曲 1.递归函数参数 本题求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&a…

无人机自主飞行实战入门-第一课(简介)

研究的意义&#xff1a;对人类操作的严重依赖&#xff0c;严重阻碍了泛无人机行业的发展。 飞行汽车&#xff08;UAM&#xff09;即将到来&#xff0c;不论是从成本还是安全考虑都需要自主飞行。 传统飞控基于STM32架构设计&#xff0c;无法满足更智能功能所需的计算量&#xf…

机器学习简介[01/2]:简单线性回归

Python 中的机器学习简介&#xff1a;简单线性回归 一、说明 简单线性回归为机器学习提供了优雅的介绍。它可用于标识自变量和因变量之间的关系。使用梯度下降&#xff0c;可以训练基本模型以拟合一组点以供未来预测。 二、技术背景 这是涵盖回归、梯度下降、分类和机器学习的其…

QT概括-Rainy

Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控件、布局、交互&#xff09;&#xff0c;还包含很多其它功能&#xff0c;比如多线程、访问数据库、图像处理、音频…

为Android做一个ShowModal窗口

大家知道&#xff0c;用Delphi实现一个Form&#xff0c;并用ShowModal显示出来&#xff0c;在Android平台是非阻塞的&#xff0c;即执行了Form.ShowModal&#xff0c;代码会继续往下执行而不是等待&#xff0c;这跟在Windows平台是完全不一样的。如果我们需要类似阻塞的效果&am…

使用eclipse编写Java代码:将缩进用空格,而不用Tab

在菜单中选择Window->Preferences&#xff1a; 选择Java下面的Formatter&#xff1a; 点击Edit按钮&#xff0c;在弹出窗口中&#xff0c;Tab policy选择Spaces only&#xff1a; 将Profile name改为一个其它的名字才能保存&#xff1a; 以后新创建的函数、类缩进就…

[ VMware 虚拟机 ] 启动不了图形界面,报 “The system is running in low-graphics mode” 错误

文章目录 问题现象异常原因解决方案 问题现象 在启动虚拟机的时候&#xff0c;不能正常的进入图形界面&#xff0c;报 “The system is running in low-graphics mode” 错误。 异常原因 启动界面的xorg.conf文件失败并删除。 解决方案 1、点击异常界面上的 “ok”后&…

智慧工地项目管理平台源码 项目工程云平台源码 劳务管理、数据预警、视频实时监控、重大危险源和绿色文明施工

通过运用物联网、大数据、云计算、BIM 等技术&#xff0c;搭建由劳务管理、质量安全数据预警、施工现场视频实时监控、重大危险源和绿色文明施工监控等板块构成的模块化、一站式的信息化管理平台。平台可实现施工现场数据采集、数据综合统计及分析、手机App 应用等&#xff0c;…

【LeetCode-面试经典150题-day14】

目录 19.删除链表的倒数第N个结点 82.删除排序链表中的重复元素Ⅱ 61. 旋转链表 86.分隔链表 146.LRU缓存 19.删除链表的倒数第N个结点 题意&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 【输入样例】head [1,2,3,4,5…