当前位置: 首页 > news >正文

Flutter开发笔记 —— 语音消息功能实现

前言

最近在开发一款即时通讯(IM)的聊天App,在实现语音消息功能模块后,写下该文章以做记录。

注:本文不提供相关图片资源以及IM聊天中具体实现代码,单论语音功能实现思路

需求分析
效果图

比起上来直接贴代码,我们先来逐步分析一下一个正常语音消息的需求是如何的?

  • 长按语音按钮录制用户语音内容

  • 松开按钮后发送语音消息至目标

从上可得,我们需要针对于用户的语音 录制 & 播放 方面下手!

Flutter_sound

目标地址:https://pub.dev/packages/flutter_sound

简介:Flutter_sound 是一款可以处理用户声音库

通过该插件的GitHub示例中可以了解到实现录制语音和播放的相关API为

  • FlutterSoundPlayer下的startRecorder方法 (录制)

  • FlutterSoundPlayer下的startPlayer方法 (播放)

实现思路

初始化Flutter_Sound配置

定义相关变量

  • FlutterSoundPlayer flutterSoundPlayer = FlutterSoundPlayer(); //声音播放器

  • FlutterSoundRecorder recordSound = FlutterSoundRecorder(); //声音录制器

  • Timer? recordTimer // 计时器,用来控制录音时长;

  • String timeString = “” // 用来做回显时长

  • List voicePlayList =[]; //用来控制语音播放列表

  • String voicePath = “”; //临时储存语音文件路径

初始化声音配置方法

/** @author Marinda* @date 2023/6/26 15:25* @description 初始化声音设置*/initSoundSetting() async{await flutterSoundPlayer.openPlayer();await recordSound.openRecorder();}

录制用户语音

/** @author Marinda* @date 2023/6/26 15:31* @description 录音*/recordSound() async{PermissionStatus status = await Permission.microphone.request();int time = 0;//权限校验if (status != PermissionStatus.granted) throw RecordingPermissionException("麦克风权限未授权!");var dir = await getExternalStorageDirectory();Uuid uuid = Uuid();String filePath = p.join(dir?.path ?? "",uuid.v4()+".mp4");File file = File(filePath);file.openWrite();state.voicePath.value = filePath;Log.i("录音保存的位置:${filePath}");await state.recordSound.startRecorder(//目标文件位置toFile: filePath,//这里可以认为是那种源codec: Codec.aacMP4,//采样率bitRate: 8000,//为1即可numChannels: 1);recordTimer = Timer.periodic(Duration(seconds: 1), (_) {time++;timeString = time.toString();});}

播放实现

/** @author Marinda* @date 2023/10/7 14:28* @description 播放语音信息 目前先做本地语音缓存处理*/playVoice(String voiceUrl) async{Uint8List uint8list = Uint8List(0);//视为网络httpif(voiceUrl.startsWith("http")){uint8list = ...获取MP4文件二进;}else{File voiceFile = File(voiceUrl);//如果不存在if(!voiceFile.existsSync()){BotToast.showText(text: "语音播放失败");return;}uint8list  = await voiceFile.readAsBytes();}//如果存在则进行移除播放if(voicePlayList.contains(tag)){voicePlayList.remove(tag);await flutterSoundPlayer.stopPlayer();return;}//加入语音信息队列voicePlayList.add(tag);await flutterSoundPlayer.startPlayer(fromURI: data.expandAddress,fromDataBuffer: uint8list,codec: Codec.aacMP4,sampleRate: 8000,numChannels: 1,whenFinished: (){//  播放完毕state.voicePlayList.remove(tag);});}

结束录制

/** @author Marinda* @date 2023/6/26 15:33* @description*/stopRecordSound() async{await recordSound.stopRecorder();if(recordTimer!.isActive){recordTimer!.cancel();recordTimer = null;}// 这里实现你的语音消息发送逻辑Log.i("停止录制!");timeString.value = "";voicePath.value = "";}

结束语

难度不大,主要是围绕着录音文件进行处理

值得注意的点是在播放录音文件时
记得获取目标的二进制流一并携带至startPlayer方法fromDataBuffer字段中
否则可能会出现无法播放或程序未响应等危险情况!

感谢你的观看!

相关文章:

Flutter开发笔记 —— 语音消息功能实现

前言 最近在开发一款即时通讯(IM)的聊天App,在实现语音消息功能模块后,写下该文章以做记录。 注:本文不提供相关图片资源以及IM聊天中具体实现代码,单论语音功能实现思路 需求分析 比起上来直接贴代码,我们先来逐步…...

冒泡排序和选择排序

目录 一、冒泡排序 1.冒泡排序的原理 2.实现冒泡排序 1.交换函数 2.单躺排序 3.冒泡排序实现 4.测试 5.升级冒泡排序 6.升级版代码 7.升级版测试 二、选择排序 1.选择排序的原理 2.实现选择排序 1.单躺排序 2.选择排序实现 3.测试 ​4.修改 5.测试 一、冒泡排序…...

【深度学习】UNIT-DDPM核心讲解

文章目录 大致介绍:扩散损失:转换损失:循环一致性损失:推理过程:优缺点: 参考文章: https://blog.csdn.net/ssshyeong/article/details/127210086 这篇文章对整个文章 UNIT-DDPM: UNpaired Imag…...

Java 线程的优先级

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…...

金融数学方法:牛顿法

目录 1.牛顿法1.1 牛顿法介绍1.2 算法步骤 2. 具体算例3.总结 1.牛顿法 1.1 牛顿法介绍 牛顿法(Newton’s method),也被称为牛顿-拉夫森方法(Newton-Raphson method),是一种用于数值逼近根的迭代方法。它是…...

MongoTemplate | 多条件查询

MongoTemplate查询 Resource private MongoTemplate mongoTemplate;public <T> List<T> getDataList(String param1, Long param2, Class<T> clazz) {// 构建queryQuery query constructQuery(param1, param2);// 查询return mongoTemplate.find(query, cl…...

优秀程序员是怎么思考的?

首发日更公 Z 号&#xff1a;十二又十三 作为一名优秀的程序员&#xff0c;思考是我们工作中最重要的一部分。它不仅能够帮助我们解决问题&#xff0c;还能够提升我们的技术水平和职业发展。那么&#xff0c;优秀程序员是如何思考的呢&#xff1f;本文将为您介绍一个思考框架和…...

【juc】countdownlatch实现游戏进度

目录 一、截图示例二、代码示例 一、截图示例 二、代码示例 package com.learning.countdownlatch;import java.util.Arrays; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurr…...

Spring Webflux HttpHandler源码整理

HttpHandler的构造 自动启动配置类&#xff1a;HttpHandlerAutoConfigurationBean public HttpHandler httpHandler(ObjectProvider<WebFluxProperties> propsProvider) {HttpHandler httpHandler WebHttpHandlerBuilder.applicationContext(this.applicationContext).…...

Qt扩展-Advanced-Docking 简介及配置

Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能&#xff0c;这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…...

Decorator

Decorator 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c; 由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b; 并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff…...

分布式文件系统HDFS(林子雨慕课课程)

文章目录 3. 分布式文件系统HDFS3.1 分布式文件系统HDFS简介3.2 HDFS相关概念3.3 HDFS的体系结构3.4 HDFS的存储原理3.5 HDFS数据读写3.5.1 HDFS的读数据过程3.5.2 HDFS的写数据过程 3.6 HDFS编程实战 3. 分布式文件系统HDFS 3.1 分布式文件系统HDFS简介 HDFS就是解决海量数据…...

CSS中:root伪类的使用

在CSS中&#xff0c;:root是一个伪类选择器&#xff0c;它选择的是文档树的根元素。在HTML文档中&#xff0c;这个根元素通常是<html>。:root伪类选择器常常被用于定义全局的CSS变量或者设置全局的CSS样式。 例如&#xff0c;你可以使用:root来定义一个全局的字体大小&a…...

VulnHub JANGOW

提示&#xff08;主机ip分配问题&#xff09; 因为直接在VulnHub上下载的盒子&#xff0c;在VMware上打开&#xff0c;默认是不分配主机的 所以我们可以在VirtualBox上打开 一、信息收集 发现开放了21和80端口&#xff0c;查看一下80端口 80端口&#xff1a; 检查页面后发现…...

OpenMesh 获取网格面片各个顶点

文章目录 一、简介二、实现代码三、实现效果一、简介 OpenMesh中有很多循环器,这里便是其中一种面顶点循环器,以此来获得面片的各个顶点。 二、实现代码 #define _USE_MATH_DEFINES #include <iostream> #include <unordered_map>...

【前端设计模式】之原型模式

原型模式特性 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过克隆现有对象来创建新对象&#xff0c;而不是通过实例化类。原型模式的主要特性包括&#xff1a; 原型对象&#xff1a;原型对象是一个已经存在的对象&#xff0c;它作…...

软件设计原则

设计原则 一、单一原则 1. 如何理解单一职责原则 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;简称SRP&#xff09;&#xff0c;它要求一个类或模块应该只负责一个特定的功能。实现代码的高内聚和低耦合&#xff0c;提高代码的可读性和可维护性。 …...

【面试HOT100】哈希双指针滑动窗口

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于LeetCodeHot100进行的&#xff0c;每个知识点的修正和深入主要参考…...

Ubuntu20.04 配置 yolov5_ros 功能包记录

文章目录 本文参考自博主源801,结合自己踩坑后修改 项目地址:https://github.com/mats-robotics/yolov5_ros 1.新建工作空间 新建一个工作空间 yolo_ros(名字可自定义),在 yolo_ros 下新建文件夹 src 并catkin_make进行编译 2. 安装相机驱动,可以选用较为主流的 usb_cam 或…...

Flink的处理函数——processFunction

目录 一、处理函数概述 二、Process函数分类——8个 &#xff08;1&#xff09;ProcessFunction &#xff08;2&#xff09;KeyedProcessFunction &#xff08;3&#xff09;ProcessWindowFunction &#xff08;4&#xff09;ProcessAllWindowFunction &#xff…...

Qwen3-ASR-1.7B在数学建模竞赛中的语音数据处理应用

Qwen3-ASR-1.7B在数学建模竞赛中的语音数据处理应用 数学建模竞赛&#xff0c;听起来是不是有点“高大上”&#xff1f;其实说白了&#xff0c;就是给你一个现实世界的问题&#xff0c;让你用数学和计算机的方法去解决。这几年&#xff0c;竞赛题目越来越贴近生活&#xff0c;…...

雪女-斗罗大陆-造相Z-Turbo社区实践:在CSDN分享自定义风格LoRA训练心得

雪女-斗罗大陆-造相Z-Turbo社区实践&#xff1a;在CSDN分享自定义风格LoRA训练心得 最近在CSDN社区看到不少朋友在讨论用AI模型生成特定风格的角色图&#xff0c;尤其是像“斗罗大陆”这类有大量粉丝基础的作品。大家普遍有个痛点&#xff1a;直接用通用模型生成&#xff0c;角…...

Rufus高效使用实战指南:精通ext2/ext3/ext4文件系统格式化

Rufus高效使用实战指南&#xff1a;精通ext2/ext3/ext4文件系统格式化 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 在Linux系统管理和开发工作中&#xff0c;USB设备的格式化与启动盘制作是一…...

构建边缘AI小语言模型

大型语言模型&#xff08;LLM&#xff09;在任何场合、任何设备上都可访问。 但拥有数千亿参数的LLM对于低延迟应用来说过于昂贵&#xff0c;而普通的SLM在保真度和一致性响应方面往往表现不佳。 为应对这一挑战&#xff0c;我将调优一个紧凑的Llama 3.2–3B模型&#xff0c;…...

Youtu-Parsing快速部署指南:一键启动Web服务,开箱即用解析工具

Youtu-Parsing快速部署指南&#xff1a;一键启动Web服务&#xff0c;开箱即用解析工具 1. 项目概述与核心价值 Youtu-Parsing是腾讯优图实验室推出的多模态文档智能解析模型&#xff0c;基于Youtu-LLM-2B构建&#xff0c;专为解决复杂文档解析难题而设计。不同于传统OCR工具&…...

Windows环境下SpringBoot Jar包热更新实战:从配置文件到Class文件的动态替换

1. Windows下SpringBoot Jar包热更新核心原理 SpringBoot应用打包成Jar后&#xff0c;本质上是个压缩文件。在Windows环境下&#xff0c;我们可以利用JDK自带的jar命令直接操作这个压缩包。热更新的本质就是在不重启服务的情况下&#xff0c;通过替换Jar包内部文件来实现配置或…...

SiameseAOE中文-base实战教程:ABSA结果用于A/B测试——新旧版本UI情感变化分析

SiameseAOE中文-base实战教程&#xff1a;ABSA结果用于A/B测试——新旧版本UI情感变化分析 1. 快速了解SiameseAOE模型 SiameseAOE是一个专门用于中文属性情感抽取的模型&#xff0c;它能从文本中自动识别出属性词和对应的情感词。简单来说&#xff0c;就是能从用户评论中找出…...

OpenClaw配置优化:提升GLM-4.7-Flash响应速度的3个技巧

OpenClaw配置优化&#xff1a;提升GLM-4.7-Flash响应速度的3个技巧 1. 为什么需要优化GLM-4.7-Flash的响应速度 上个月我在本地部署了OpenClaw对接GLM-4.7-Flash模型&#xff0c;最初的使用体验并不理想。一个简单的文件整理任务需要等待近20秒才能开始执行&#xff0c;而复杂…...

OpenClaw新手避坑:Qwen3-32B镜像部署的10个常见错误

OpenClaw新手避坑&#xff1a;Qwen3-32B镜像部署的10个常见错误 1. 为什么Qwen3-32B镜像部署容易踩坑&#xff1f; 第一次在本地部署Qwen3-32B镜像对接OpenClaw时&#xff0c;我天真地以为只要按照文档操作就能一帆风顺。结果从环境配置到服务启动&#xff0c;整整折腾了两天…...

Datart BI 工具数据库连接优化:解决 wait millis 5001 报错与连接池配置调整

1. 遇到 wait millis 5001 报错怎么办&#xff1f; 最近在帮客户部署 Datart BI 工具时&#xff0c;遇到了一个典型的数据库连接问题。每天早上业务高峰期&#xff0c;系统日志里就会频繁出现"wait millis 5001"的报错&#xff0c;但奇怪的是直接登录数据库服务器检查…...