flutter开发实战-just_audio实现播放音频暂停音频设置音量等
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.indexprint("SDAudioPlayer Error code: ${e.code}");// iOS/macOS: maps to NSError.localizedDescription// Android: maps to ExoPlaybackException.getMessage()// Web/Linux: a generic message// Windows: MediaPlayerError.messageprint("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 errorsprint("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实现播放音频暂停音频设置音量等。
学习记录,每天不停进步。
相关文章:
flutter开发实战-just_audio实现播放音频暂停音频设置音量等
flutter开发实战-just_audio实现播放音频暂停音频设置音量等 最近开发过程中遇到需要播放背景音等音频播放,这里使用just_audio来实现播放音频暂停音频设置音量等 一、引入just_audio 在pubspec.yaml引入just_audio just_audio: ^2.7.0在iOS上,video_p…...
【Bert101】最先进的 NLP 模型解释【01/4】
0 什么是伯特? BERT是来自【Bidirectional Encoder Representations from Transformers】变压器的双向编码器表示的缩写,是用于自然语言处理的机器学习(ML)模型。它由Google AI Language的研究人员于2018年开发,可作为…...
c语言经典例题讲解(输出菱形,喝汽水问题)
目录 一、输出菱形 二、喝汽水问题 方法1:一步一步来 方法二:直接套公式 一、输出菱形 输出类似于下图的菱形: 通过分析:1、先分为上下两部分输出 2.在输出前先输出空格 3.找规律进行输出 可知,可令上半部分lin…...
【Flutter】【基础】CustomPaint 绘画功能(一)
功能:CustomPaint 相当于在一个画布上面画画,可以自己绘制不同的颜色形状等 在各种widget 或者是插件不能满足到需求的时候,可以自己定义一些形状 使用实例和代码: CustomPaint: 能使你绘制的东西显示在你的ui 上面&a…...
iOS 实现图片高斯模糊效果
效果图 用到了 UIVisualEffectView 实现代码 - (UIVisualEffectView *)bgEffectView{if(!_bgEffectView){UIBlurEffect *blur [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];_bgEffectView [[UIVisualEffectView alloc] initWithEffect:blur];}return _bgEffect…...
[保研/考研机试] KY7 质因数的个数 清华大学复试上机题 C++实现
描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如1202*2*2*3*5,共有5个质因数。 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。 输出描述: 对于每组数…...
初识Redis
目录 认识Redis分布式系统Redis的特性Redis的应用场景Redis客户端Redis命令 认识Redis 上面一段话是官网给出的对Redis的介绍,in-memory data store表明Redis是在内存中存储数据的,这和我们接触的其他数据库就有很大的不同,比如MySQL…...
每天一道leetcode:115. 不同的子序列(动态规划困难)
今日份题目: 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 题目数据保证答案符合 32 位带符号整数范围。 示例1 输入:s "rabbbit", t "rabbit" 输出:3 解释: 如下所…...
服务器数据恢复-RAID5多块磁盘离线导致崩溃的数据恢复案例
服务器数据恢复环境: DELL POWEREDGE某型号服务器中有一组由6块SCSI硬盘组建的RAID5阵列,LINUX REDHAT操作系统,EXT3文件系统,存放图片文件。 服务器故障&分析: 服务器raid5阵列中有一块硬盘离线,管理员…...
NO.2 MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查
目录 1、Mapper接口和映射文件关系 2、Mapper接口和映射文件的命名规则 2.1 Mapper接口的命名规则 2.2 映射文件的命名规则 3、Mapper接口和映射文件的创建及增删改查的实现 3.1 Mapper接口和映射文件的创建 3.2 增删改查的实现 3.2.1表结构 3.2.2 创建表User对应的实…...
【JS】怎么提取object类的内容
需求:在网页端中通过getElementsByClassName获取到一个元素,想提取其中的数字内容做个if判断,奈何一直提取不了 开始获取元素时,以为默认就是字符类型;但使用操作字符的函数就失败,然后就考虑数据类型是不是…...
分布式系统的 38 个知识点
天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢? 1. 架构设计 这一节将从一些经典的开源系统架…...
机器学习基础(二)
线性回归 误差是独立并且具有相同的分布通常认为服从均值为0方差为的高斯分布。 损失函数(loss Function)/代价函数(Cost Function) 其实两种叫法都可以,损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随…...
Java 实现Rtsp 转rtmp,hls,flv
服务支撑:FFmpeg srs(流媒体服务器) 整个流程是 FFmpeg 收流转码 推 rtmp 到流媒体服务 流媒体服务再 分发流到公网 搭建流媒体服务: 1. SRS (Simple Realtime Server) | SRS (本例子使用的是SrS 安装使用docker ) 2.GitHub - ZLMedi…...
机器学习基础(三)
逻辑回归 场景 垃圾邮件分类 预测肿瘤是良性还是恶性 预测某人的信用是否良好 正确率与召回率 正确率与召回率(Precision & Recall)是广泛应用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。 一般来说,正确率就是检索出来的条目有多少是正确的,召回率就…...
Kubeadm安装K8s集群
一、硬件环境 准备3台Linux服务器,此处用Vmware虚拟机。 主机名CPU内存k8smaster2核4Gk8snode12核4Gk8snode22核4G 二、系统前置准备 配置三台主机的hosts文件 cat << EOF > /etc/hosts 192.168.240.130 k8smaster 192.168.240.132 k8snode1 192.168.…...
【C++】开源:spdlog跨平台日志库配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍spdlog日志库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…...
[Azkaban] No active executors found
没有找到活动的executors,需在MySQL数据库里设置端口为12321的executors表的active为1: select * from executors;如果显示active0 则需要进行处理: update azkaban.executors set active1;当active0,更新为1时,用 n…...
无涯教程-Perl - recv函数
描述 This function receives a message on SOCKET attempting to read LENGTH bytes, placing the data read into variable SCALAR.The FLAGS argument takes the same values as the recvfrom( ) system function, on which the function is based. When communicating wit…...
算法练习-搜索 相关
文章目录 迷宫问题 迷宫问题 定义一个二维数组 m行 * n列 ,如 4 5 数组下所示: int arr[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, }; 它表示一个迷宫,1表示墙壁,0表示可以走的路,只…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
