flutter开发实战-just_audio实现播放音频暂停音频设置音量等

2023-10-30

flutter开发实战-just_audio实现播放音频暂停音频设置音量等

最近开发过程中遇到需要播放背景音等音频播放,这里使用just_audio来实现播放音频暂停音频设置音量等

在这里插入图片描述

一、引入just_audio

在pubspec.yaml引入just_audio

  just_audio: ^2.7.0

在iOS上,video_player使用的是AVPlayer进行播放。
在Android上,video_player使用的是ExoPlayer。

二、使用前设置

2.1 在iOS中的设置
在iOS工程中info.plist添加一下设置,以便支持Https,HTTP的视频地址

<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>

2.2 在Android中的设置
需要在/android/app/src/main/AndroidManifest.xml文件中添加网络权限

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

三、just_audio实现播放音频暂停音频设置音量等

引入just_audio后,可以使用AudioPlayer来播放音频

3.1 常用操作如下

  • 播放
await _audioPlayer.play();
  • 暂停
await _audioPlayer.pause();
  • seek
await _audioPlayer.seek(position);
  • 停止
await _audioPlayer.pause();
await _audioPlayer.seek(Duration.zero);
  • 设置音量
await _audioPlayer.setVolume(volume);

3.2 使用just_audio实现播放player

这里通过player来获取SDAudioPlayerState状态,控制音频的暂停音频设置音量等操作

import 'package:flutter_app/manager/logger_manager.dart';
import 'package:just_audio/just_audio.dart';

// 播放回调
typedef SDAudioPlayerCallBack = void Function(
    SDAudioPlayerState state, SDAudioPlayerError? error);

// 播放音频的状态
enum SDAudioPlayerState {
  idle, // 默认
  loading, // 加载中
  buffering, // 缓存中
  ready, // 可播放
  completed, // 播放完成
}

// 播放音频出现错误
class SDAudioPlayerError {
  String? message;
}

// 定义优先级的类
class SDMusicConfig {
  // 音频文件地址
  late String audioUrl = '';

  late bool runLoop = false; // 是否循环播放

  // 构造函数
  SDMusicConfig(this.audioUrl, this.audioPriority, this.runLoop);
}

// 播放音频文件
class SDMusicPlayer {
  // 音频播放
  late AudioPlayer _audioPlayer;

  // 优先级
  late SDMusicConfig _musicConfig;

  late bool _playing = false; // 是否正在播放

  late SDAudioPlayerState _playerState = SDAudioPlayerState.idle; // 状态

  late SDAudioPlayerCallBack? _playerCallBack;

  SDMusicPlayer(this._audioPlayer, this._musicConfig){
    setAudioUrl(this._musicConfig.audioUrl);
    openPlayCallBack((state, error) {

    });
  }

  SDMusicConfig getMusicConfig() {
    return _musicConfig;
  }

  void openPlayCallBack(SDAudioPlayerCallBack playerCallBack) {
    _playerCallBack = playerCallBack;
    _audioPlayer.playerStateStream.listen((state) {
      _playing = state.playing;

      switch(state.processingState) {
        case ProcessingState.idle: {
          _playerState = SDAudioPlayerState.idle;
          break;
        }
        case ProcessingState.loading: {
          _playerState = SDAudioPlayerState.loading;
          break;
        }
        case ProcessingState.buffering: {
          _playerState = SDAudioPlayerState.buffering;
          break;
        }
        case ProcessingState.ready: {
          _playerState = SDAudioPlayerState.ready;
          break;
        }
        case ProcessingState.completed: {
          _playerState = SDAudioPlayerState.completed;
          if (_musicConfig.runLoop == true) {
            // 循环播放的时候
            seek(Duration.zero);
            play();
          } else {
            stop();
          }
          break;
        }

        default:
      }

      if (_playerCallBack != null) {
        _playerCallBack!(_playerState, null);
      }
    });
  }

  // var duration = await player.setUrl('https://foo.com/bar.mp3');
  Future<void> setAudioUrl(String url) async {
    SDAudioPlayerError? error;
    if (url.isNotEmpty) {
      // Set the audio source but manually load audio at a later point.
      try {
        _audioPlayer.setUrl(url, preload: true);
        // Acquire platform decoders and start loading audio.
        var duration = await _audioPlayer.load();
        print("url:${url} duration:${duration}");
      } on PlayerException catch (e) {
        // iOS/macOS: maps to NSError.code
        // Android: maps to ExoPlayerException.type
        // Web: maps to MediaError.code
        // Linux/Windows: maps to PlayerErrorCode.index
        print("SDAudioPlayer Error code: ${e.code}");
        // iOS/macOS: maps to NSError.localizedDescription
        // Android: maps to ExoPlaybackException.getMessage()
        // Web/Linux: a generic message
        // Windows: MediaPlayerError.message
        print("SDAudioPlayer Error message: ${e.message}");
        error = SDAudioPlayerError();
        error.message = e.message;
      } on PlayerInterruptedException catch (e) {
        // This call was interrupted since another audio source was loaded or the
        // player was stopped or disposed before this audio source could complete
        // loading.
        LoggerManager()
            .debug("SDAudioPlayer Connection aborted: ${e.message}");
        error = SDAudioPlayerError();
        error.message = e.message;
      } catch (e) {
        // Fallback for all errors
        print("e: ${e}");
        error = SDAudioPlayerError();
        error.message = e.toString();
      }
    } else {
      error = SDAudioPlayerError();
      error.message = '播放地址不能为空';
    }

    if (_playerCallBack != null) {
      _playerCallBack!(_playerState, error);
    }
  }

  void play() async {
    // Usually you don't want to wait for playback to finish.
    if (_musicConfig.audioUrl != null && _musicConfig.audioUrl.isNotEmpty) {
      if (_playing == false) {
        // 正在播放
        await _audioPlayer.play();
      }
    }
  }

  void pause() async {
    if (_musicConfig.audioUrl != null && _musicConfig.audioUrl.isNotEmpty) {
      await _audioPlayer.pause();
    }
  }

  void stop() async {
    if (_musicConfig.audioUrl != null && _musicConfig.audioUrl.isNotEmpty) {
      await _audioPlayer.pause();
      await _audioPlayer.seek(Duration.zero);
    }
  }

  void seek(Duration position) async {
    if (_musicConfig.audioUrl != null && _musicConfig.audioUrl.isNotEmpty) {
      await _audioPlayer.seek(position);
    }
  }

  void setVolume(double volume) async {
    if (_musicConfig.audioUrl != null && _musicConfig.audioUrl.isNotEmpty) {
      await _audioPlayer.setVolume(volume);
    }
  }

  // 不需要该播放器,则需要调用该方法
  void dispose() async {
    await _audioPlayer.dispose();
  }
}

四、小结

flutter开发实战-just_audio实现播放音频暂停音频设置音量等。
学习记录,每天不停进步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter开发实战-just_audio实现播放音频暂停音频设置音量等 的相关文章

随机推荐

  • 使用Clion开发STM32过程中的提示:此文件不属于任何项目目标,代码洞察功能可能无法正常工作(附带汉化方法)

    Catalog 一 问题描述 二 解决办法 三 附带Clion汉化方法 一 问题描述 笔者在学习STM32开发过程中 在使用CubeMX生成工程文件后 又新建了自己的User文件 在编译的过程中终端会提示 在文件中会提示 并且笔者检查代码确
  • SQLite基本操作

    SQLite SQLite是一个软件库 实现了自给自足的 无服务器的 零配置的 事务性的 SQL 数据库引擎 SQLite 源代码不受版权限制 SQLite 直接访问其存储文件 SQLite 是非常小的 是轻量级的 完全配置时小于 400K
  • Git安装与配置

    1 Git安装与配置 1 1 什么是Git Git是目前世界上最先进的分布式版本控制系统 Git是免费 开源的 最初Git是为辅助 Linux 内核开发的 来替代 BitKeeper 作者 Linux和Git之父李纳斯 托沃兹 Linus
  • Java用JDBC通过远程连接PostgreSQL并实现操作

    工具及准备介绍 1 本文使用的开发软件是eclipse1 7 2 需要下载postgresqlpostgresql 9 2 1002 jdbc3 jar 需要的话在我的资源上下载 需要数据库管理软件Navicat 3 本文是用JDBC连接数
  • CSDN中如何转载他人的博客

    1 复制他人博客内容 打开需要转载的博客文章 在页面任意空白处点击鼠标右键 gt 检查 打开浏览器开发模式页面 在元素中找到名为article content的div 选中后右击 gt 复制 gt 复制 outerHTML 2 新写博客文章
  • 理想倍频器/分频器对相噪/杂散的影响

    结论 使用理想倍频器将信号频率提高 N N倍 会让相噪抬高 20log 10 N 20log 10 N dB 类似的 N N分频会让相噪降低 20log 10 N 20log 10 N dB 理想倍频器 对于信号 f t cos t t f
  • Stegsolve.jar工具包准备,避坑指南,教你正确启动Stegsolve

    目录 准备阶段 错误重现 错误分析 Stegsolve jar正确启动方法 准备阶段 下载地址 http www caesum com handbook Stegsolve jar 环境配置的过程 3分钟复制粘贴配置java环境变量 验证配
  • [Unity]有关curson/鼠标的详细AIP

    Unity 有关curson 鼠标的详细AIP 经常用到的与curson有关的API Cursor lockState Cursor lockState CursorLockMode None 光标行为未修改 Cursor lockStat
  • MySQL秘籍:让你的表操作炉火纯青

    每个人都有自己的一生 不要和别人去比较 比较只会让你感到沮丧和不满足 关注自己的成长和进步 并享受属于自己的旅程 作者 不能再留遗憾了 专栏 MySQL学习 本文章主要内容 学习MySQL的对表操作 查看表 创建表 删除表 对表进行增删改查
  • Vue 实现生成二维码(qrcodejs2),并生成图片(html2canvas)可实现保存和识别

    1 引包 npm install qrcodejs2 save npm install save html2canvas import html2canvas from html2canvas import QRCode from qrco
  • 传送文件到云服务器,传送文件到云服务器

    传送文件到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ e
  • Linux基础笔记4

    绝对路径 以根目录为参照物 从根目录开始 一级一级进入目录 相对路径 以当前目录作为参照物 进行目录查找 1 1 目录操作 ls 显示目录下的内容 查看 etc passwd文件 文件夹下的信息 ls l etc passwd 查看当前文件
  • zookeeper连接,报caught end of stream exception EndOfStreamException: Unable to read additional data fro

    最近发现线上的zookeeper的日志zookeeper out 文件居然有6G 后来设置下日志为滚动输出 但是改了之后 发现一天的日志量就是100多M 滚动日志一天就被冲掉了 这个不科学 再仔细查看下日志里的内容 发现有很多连接建立好 马
  • C++ std::remove/std::remove_if/erase用法探讨

    std remove 不会改变输入vector string的长度 其过程相当于去除指定的字符 剩余字符往前靠 后面的和原始字符保持一致 需要注意的是 remove函数是通过覆盖移去的 如果容器最后一个值刚好是需要删除的 则它无法覆盖掉容器
  • 强化学习的状态值函数与状态动作值函数

    在本文中 我们将学习贝尔曼方程和价值函数 回报和返还 return 正如前面所讨论的 强化学习agent如何最大化累积未来的回报 用于描述累积未来回报的词是返还 通常用R表示 我们还使用一个下标t来表示某个时间步长的返还 在数学符号中 它是
  • sql:查询创建表的结构

    显示所有用户表 1 SELECT SCHEMA NAME schema id As SchemaName name As TableName from sys tables ORDER BY name 2 alternate SELECT
  • QML android 采集手机传感器数据 并通过udp 发送

    利用 qt 开发 安卓 app 采集手机传感器数据 并通过udp 发送 ifndef UDPLINK H define UDPLINK H include
  • 数据结构与算法(非常详细)从零基础入门到精通,看完这一篇就够了

    本文包含数据结构与算法主要的基本知识点 便于知识的梳理与回顾 部分知识点的详细介绍请在专栏内查阅 目录 一 概述 二 线性表 三 栈 四 队列 五 串 六 多维数组和广义表 七 树和二叉树 八 图 九 查找 十 排序 一 概述 数据结构 逻
  • 【C++】全局变量的声明与定义

    文章目录 编译单元 模块 声明与定义 extern作用 静态全局变量 static 全局常量 const 编译单元 模块 在VC或VS上编写完代码 点击编译按钮准备生成exe文件时 编译器做了两步工作 将每个 cpp c 和相应的 h文件编
  • flutter开发实战-just_audio实现播放音频暂停音频设置音量等

    flutter开发实战 just audio实现播放音频暂停音频设置音量等 最近开发过程中遇到需要播放背景音等音频播放 这里使用just audio来实现播放音频暂停音频设置音量等 一 引入just audio 在pubspec yaml引