【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录

【ArkTS】关于ForEach的第三个参数键值
【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】
【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案”
【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码
【ArkTS】技能提高–“用户授权”跳转设置页的两种方式详解


文章目录

  • 系列文章目录
  • 一、录音授权
  • 二、使用 AvRecorder 录音
    • 1.创建一个文件, 准备用来存储音频数据
    • 2.参考官网, cv配置
    • 3.创建录音实例对象
    • 4.开始准备状态 💥💥 注意些await
    • 5.整合开始录制代码
    • 6.停止录制代码
  • 总结


一、录音授权

目标:使用权限请求工具,在录音页面实现请求权限,无权限不可进入
录音授权有在别的文章里详解过,大家可以点下面两个链接看一下。我们这里就直接放封装好的代码。
【鸿蒙开发】超全面解读 带你充分掌握—“向用户申请授权”

import { promptAction, router } from '@kit.ArkUI'
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'class permission{confirmConfig: promptAction.ShowDialogOptions = {title: "温馨提示",message: "未授权使用麦克风将无法使用该面试录音功能,是否前往设置进行授权?",buttons: [{ text: '离开', color: '#ffaeabab' },{ text: '去授权', color: '#000000' }]}/** 请求权限 */async getPermission(permissions:Permissions[]) {//   . requestPermissionsFromUser()const mgr = abilityAccessCtrl.createAtManager()const ctx = getContext(this)const res = await mgr.requestPermissionsFromUser(ctx, permissions)if (res.authResults[0] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {return}// 第一次没有授权const res2 = await promptAction.showDialog(this.confirmConfig)// 用户选了离开, 没有选二次授权if (res2.index === 0) {router.back()return}//拉起授权页const res3 = await mgr.requestPermissionOnSetting(ctx, permissions)if (res3[0] === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {router.back()}}
}export const Permission=new permission()

效果示例图:
在这里插入图片描述

二、使用 AvRecorder 录音

目标:使用 AvRecorder 实现音频录制存储到应用沙箱

在这里插入图片描述

实现步骤:

在这里插入图片描述

1.创建一个文件, 准备用来存储音频数据

 // 1. 创建一个文件, 准备用来存储音频数据const context = getContext(this)const filePath = `${context.filesDir}/${Date.now()}.m4a`this.file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)

2.参考官网, cv配置

开发步骤及注意事项

let avProfile: media.AVRecorderProfile = {audioBitrate: 100000, // 音频比特率audioChannels: 2, // 音频声道数audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前支持ACC,MP3,G711MUaudioSampleRate: 48000, // 音频采样率fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前支持MP4,M4A,MP3,WAV}let avConfig: media.AVRecorderConfig = {audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风profile: avProfile,//改为自己的文件url: 'fd://' + this.file.fd, // 参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处}

3.创建录音实例对象

this.record = await media.createAVRecorder()

4.开始准备状态 💥💥 注意些await

 	await this.record.prepare(avConfig)this.record.start()

5.整合开始录制代码

async startRecord() {// 1. 创建一个文件, 准备用来存储音频数据const context = getContext(this)const filePath = `${context.filesDir}/${Date.now()}.m4a`this.file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)// 2. 参考官网,  cv配置let avProfile: media.AVRecorderProfile = {audioBitrate: 100000, // 音频比特率audioChannels: 2, // 音频声道数audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前支持ACC,MP3,G711MUaudioSampleRate: 48000, // 音频采样率fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前支持MP4,M4A,MP3,WAV}let avConfig: media.AVRecorderConfig = {audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风profile: avProfile,// 3. 改为自己的文件url: 'fd://' + this.file.fd, // 参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处}// 4. 创建录音实例对象this.record = await media.createAVRecorder()// 5. 开始准备状态  💥💥 注意些awaitawait this.record.prepare(avConfig)this.record.start()}

6.停止录制代码

 async stopRecord() {await this.record?.stop()// 销毁实例await this.record?.release();fileIo.closeSync(this.file?.fd)promptAction.showToast({ message: '音频录制成功' })}

总结

以上就是录音机部分代码,明日更新完整版

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

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

相关文章

P1319 压缩技术 P1320 压缩技术(续集版)

题目传送门 P1319 压缩技术 P1320 压缩技术(续集版) P1319 压缩技术 输入格式 数据输入一行,由空格隔开的若干个整数,表示压缩码。 其中,压缩码的第一个数字就是 N N N,表示这个点阵应当是 N N N\t…

【CSS】一篇掌握CSS

不是因为有了希望才去坚持,而是坚持了才有了希望 目录 一.导入方式 1.行内样式 2.内部样式 3.外部样式(常用) 二.选择器 1.基本选择器(常用) 1.1标签选择器 1.2类选择器 1.3id选择器 2.层次选择器 2.1后代选择器 2.2子选择器 2.3相邻兄弟选择器 2.4通用兄弟选择器…

linux 获取公网流量 tcpdump + python + C++

前言 需求为,统计linux上得上下行公网流量,常规得命令如iftop 、sar、ifstat、nload等只能获取流量得大小,不能区分公私网,所以需要通过抓取网络包并排除私网段才能拿到公网流量。下面提供了一些有效得解决思路,提供了…

Rain后台权限管理系统,快速开发

这段时间一直没有更新,因为在写一个脚手架,今天Rain项目终于完工,已经发布到github,免费使用 项目github链接 https://github.com/Rain-hechang/Rain 简介 前端采用Vue3.x、Element UI。 后端采用Spring Boot、Spring Security、Redis &…

scroll-view组件,在iOS设备上禁用橡皮筋回弹效果

问题描述 在实现uniapp微信小程序的一个项目时,ios真机测试,scroll-view组件可以向下拉动一段距离然后又回弹。 如下图 解决方法: 可以通过设置scroll-view组件的属性来禁用橡皮筋回弹效果。如下,设置enhanced"true&…

【AI系统】昇腾异构计算架构 CANN

昇腾异构计算架构 CANN 本文将介绍昇腾 AI 异构计算架构 CANN(Compute Architecture for Neural Networks),这是一套为高性能神经网络计算需求专门设计和优化的架构。CANN 包括硬件层面的达芬奇架构和软件层面的全栈支持,旨在提供…

7-17 列出连通集

给定一个有 n 个顶点和 m 条边的无向图,请用深度优先遍历(DFS)和广度优先遍历(BFS)分别列出其所有的连通集。假设顶点从 0 到 n−1 编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递…

华为NPU服务器昇腾Ascend 910B2部署通义千问Qwen2.5——基于mindie镜像一路试错版(二)

文章目录 前言使用docker run总结前言 我们在上一篇文章华为NPU服务器昇腾Ascend 910B2部署通义千问Qwen2.5——基于mindie镜像一路试错版(一)中,介绍了一些准备工作。 我估计这些东西下载好还是需要一点时间的,如果你幸运地通过了这些考验,还想继续的话,就来看看这一篇…

在macOS上从源码部署RAGFlow-0.14.1

一、macOS配置 1. macOS配置 我使用MacBook Pro,chip 是 Apple M3 Pro,Memory是18GB,macOS是 Sonoma 14.6.1。 2.安装Docker和Docker compose 官方要求 Docker ≥ 24.0.0 & Docker Compose ≥ v2.26.1,我的版本如下&#x…

大数据量接口的异步处理方案详解

在现代分布式系统中,处理大数据量的接口是一个常见但复杂的场景。同步操作容易导致接口响应时间过长甚至超时,因此采用异步处理成为主流选择。本文将详细分析大数据量接口异步处理的常见方案,并结合实际应用场景进行优缺点对比。 1. 背景与挑…

csv文件的上传、解析和获得最后的数据

前端和node端解析、读取csv文件的区别 1、前端 运行环境为浏览器,受到浏览器安全策略的限制,例如跨域请求、文件访问权限等。对于大型CSV文件的处理可能会受到性能瓶颈的影响。前端运行在用户的浏览器中,受到浏览器安全策略的限制&#xff…

在 Windows Server 2022 Datacenter 上配置 MySQL 8.0 的主从复制

在 Windows Server 2022 Datacenter 上配置 MySQL 8.0 的主从复制。以下是详细的步骤: 1. 使用 root 用户登录 确保你以 root 用户登录到 MySQL 服务器。 mysql -u root -p输入你的 root 密码后进入 MySQL 命令行界面。 2. 配置主服务器 (master) 2.1 编辑 my.…

Git忽略除了指定文件以外的所有文件

前言:最近发现vs很多杂七杂八的文件都被传到gitee上了,但是我本意只是想把一些主要的文件如 .cpp文件传到gitee,因此考虑到了.gitignore文件的使用。 .gitignore文件的作用 .gitignore是一个特殊的文件,用于告诉Git哪些文件或目录…

Python学习------第十五天

1.异常的捕获方式: #基本捕获语法 try:f open("D:/abc.txt","r",encoding"UTF-8") except:print("出现异常了,因为文件不存在,我将open模式改为w模式去打开")f open("D:/abc.txt", &quo…

Android 俩个主题的不同之处 “Theme.AppCompat vs android:Theme.Material.Light.NoActionBar”

这两种主题继承关系有明显的不同,具体区别如下: Theme.AppCompat vs android:Theme.Material.Light.NoActionBar Theme.AppCompat 是 AppCompat 支持库提供的主题,目的是提供向后兼容的支持,适用于较早版本的 Android&#xff08…

什么是java方法

在Java编程语言中,方法(Method)是类(Class)中的一个函数,用于执行特定的任务或计算。方法封装了一段代码,使其可以重复调用,从而提高代码的可读性和可维护性。方法的基本结构包括方法…

THENA大涨将对整个DeFi市场产生怎样的影响?

引言 近期,区块链行业的一个热门项目——THENA(THE)代币,在短时间内吸引了大量投资者的目光。THE代币的价格在短短几个月内经历了显著的上涨,引发了市场对其背后机制的浓厚兴趣。而在THENA生态系统的成功背后&#xf…

Kubernetes命名空间详解

目录 目标 版本 官网 概述 namespace(命名空间、名称空间) 注意事项 基本命令 查看namespace列表 查看所有Pod的namespace 查看单个Pod的namespace 查看同一个namespace下的所有Pod 查看单个namespace资源配额 查看单个Pod详情 查看所有na…

【开源】A059-基于SpringBoot的社区养老服务系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看项目链接获取⬇️,记得注明来意哦~🌹 赠送计算机毕业设计600个选题ex…

MySQL(三)

1、内置函数 1.1、日期函数 current_date()当前的日期current_time()当前的时间current_timestamp()当前的时间戳,即日期+时间date(datetime)返回参数中的日期部分date_add(date ,interval x date_type)在date的基础上增加x时间,date_type的单位可以是year、minute、second、…