鸿蒙中使用 AvRecorder-完成录音功能

news/2025/3/25 7:44:30/文章来源:https://www.cnblogs.com/cbnh/p/18787985


应用场景
在一些应用中,我们可能需要用到录音功能,记录用户的对话,阅读,或者唱歌。不过录音需要用到麦克风权限。在上一篇文章中,我们已经通过封装的通用权限工具,获取到了麦克风的权限,如果不清除可以点击跳转

鸿蒙中封装一个通用的权限工具-弹窗请求授权和二次授权
https://blog.csdn.net/weixin_50513060/article/details/146428205?fromshare=blogdetail&sharetype=blogdetail&sharerId=146428205&sharerefer=PC&sharesource=weixin_50513060&sharefrom=from_link

核心API
使用 AvRecorder 实现音频录制存储到应用沙箱。

下面是一个简单的录制流程,不考虑暂停或重录。

创建AVRecorder实例,实例创建完成进入idle状态。
设置业务需要的监听事件,监听状态变化及错误上报。
配置音频录制参数,调用prepare()接口,此时进入prepared状态。
开始录制,调用start()接口,此时进入started状态。
停止录制,调用stop()接口,此时进入stopped状态。
销毁实例,调用release()进入released状态,退出录制。

准备页面结构

这里准备两个按钮,一个用来开始录制,一个用来结束录制,用轻提示提醒录制开始或结束。

// 开始录制方法
startRecord() {

}
// 停止录制方法

stopRecord() {

}

build() {
Column({ space: 10 }) {
Button('开始录制')
.onClick(() => {
this.startRecord()
promptAction.showToast({ message: '开始录制' })
})
Button('停止录制')
.onClick(() => {
this.stopRecord()
promptAction.showToast({ message: '停止录制' })
})
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}

录制方法步骤
首先准备上下文对象,用来创建一个文件路径filePath
再使用 fileIo 创建或打开这个文件,并记录文件的 fd 用于后续关闭文件
准备录音配置对象,基本属于固定写法
创建 avRecorder 实例对象,等待实例根据录音配置对象准备完成
开始录音,并记录下avRecorder实例用于后续停止录音
点击停止录音,判断是否存在avRecorder实例,存在再关闭并释放资源。
现在我们实现这两个方法

avRecorder?: media.AVRecorder
fd?: number
filePath?: string

// 开始录制方法
async startRecord() {
// 1. 准备一个文件接收录音
const ctx = getContext(this)
// 创建一个唯一的文件路径
const filePath = ctx.filesDir + '/' + Date.now() + '.m4a'
this.filePath = filePath
// 借助 fileIo 创建或打开这个文件
const file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE)
// 记录文件的 fd,用来关闭文件
this.fd = file.fd
// 2. 准备录音配置对象 基本固定写法
const config: media.AVRecorderConfig = {
audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
profile: {
audioBitrate: 100000, // 音频比特率
audioChannels: 1, // 音频声道数
audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac
audioSampleRate: 48000, // 音频采样率
fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a
},
url: fd://${file.fd}
}
// 3. 开始录制
const avRecorder = await media.createAVRecorder()
// 等待 prepare 完成
await avRecorder.prepare(config)
// 开始录制
await avRecorder.start()
// 记录 avRecorder,用来停止录制和释放
this.avRecorder = avRecorder
}

// 停止录制方法
async stopRecord() {
// 判断是否有 正在录制
if (this.avRecorder) {
// 停止录制
await this.avRecorder.stop()
// 释放 avRecorder 和 关闭文件
await this.avRecorder.release()
fileIo.closeSync(this.fd)
}
}

然后就可以点击开始录制,录制一段时间和点击停止,会产出一个文件,找到该文件的具体方法是如下。将该文件保存在桌面,可以使用播放器播放。

包名就是你创建项目的时候定义的。

保存到电脑上

可以暂时保存到桌面,当然这是随意的。

点击即可播放

好的,下一篇文章我们再给录音组件做一个可视化的振幅,可以根据声音的大小来实时变化。

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

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

相关文章

PolarCTF网络安全2025春季个人挑战赛 WRITE UP

1-1 可老师签到 本题思路如下: 提示“发送的内容为双写字符串拼接”公众号发送flagflag即可1-2 find 本题思路如下: 把表格文件当压缩包解压,找到flag.xlsx\xl\worksheets\sheet1.xml 发现里面存了数据,于是考虑把数据格子上色以得到flag 先将xml文件处理以获得纯数据代码:…

Go红队开发—CLI框架(一)

CLI命令行工具编写基础学习(一)。CLI开发框架 命令行工具开发,主要是介绍开发用到的包,集成了一个框架,只要学会了基本每个人都能开发安全工具了。 该文章先学flags包,是比较经典的一个包,相比后面要学习的集成框架这个比较自由比较细化点,自定义可能高一些,后续会学到一…

WSL2安装Ubuntu

本文是介绍如何使用任意一台Windows主机借助WSL2创建Ubuntu虚拟系统并开放局域网内SSH连接的操作指南!先决条件拥有能够访问github.com的网络环境; 必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11版本;安装WSL2 以管理员身份运行Powe…

人工‘够好就行’智能(AGEI)就快来了!

比尔弗兰克斯 前言:本文作者的观点是在真正的通用人工智能(AGI)到来之前,一种“够好就行”的人工智能(AGEI)就已经足以引发我们原本担心 AGI 才会带来的重大社会变革、正面效益,甚至潜在危机。 换句话说: AI 不需要达到像人类一样全面智能的程度; 只要在足够多的任务上…

List集合--java进阶day09

1.List集合以下面的例子来解释存储有序和存储重复如上图,我们是怎么添加这些字符串的,打印的时候就是按照这个顺序打印的--存取有序 并且“张三”出现了两次,也存入了两次--存储重复 因为List有索引,所以该接口有关于索引的独特的api..1.remove注意事项 List有两个remove方…

Pydantic字段级校验:解锁@validator的12种应用

title: Pydantic字段级校验:解锁@validator的12种应用 date: 2025/3/23 updated: 2025/3/23 author: cmdragon excerpt: Pydantic校验系统支持通过pre验证器实现原始数据预处理,在类型转换前完成字符清洗等操作。格式验证涵盖正则表达式匹配与枚举值约束,确保护照编号等字…

20244126 2024-2025-2 《python程序设计》实验一报告

课程:《Python程序设计》 班级:2441 姓名:马晓霞 学号:20244126 实验教师:王志强 实验日期:2025年3月23日 必修/选修:公选课 (一)实验内容 1.熟悉Python开发环境 2.练习Python运行,调试技能 3.编写技能,练习变量和类型、字符串、对象、缩进和注释等 4.编写一个猜数字…

1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!

Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开…

leetcode每日一题:判断一个括号字符串是否有效

题目 一个括号字符串是只由 ( 和 ) 组成的 非空 字符串。如果一个字符串满足下面 任意 一个条件,那么它就是有效的:字符串为 (). 它可以表示为 AB(A 与 B 连接),其中A 和 B 都是有效括号字符串。 它可以表示为 (A) ,其中 A 是一个有效括号字符串。给你一个括号字符串 s 和…

实验2c语言分支与循环基础应用编程

任务一:1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 nu…

矿用人员违规闯入监控报警系统

矿用人员违规闯入监控报警系统,设置警戒预警功能,巷道正在行车时,当有行人闯入时,及时抓拍、识别现场违章入侵人员同时闪光警示和音箱报警提示禁止进入,在绞车运行期间人员误入斜巷能够及时报警,自动停止绞车运行。该系统做到绞车运行和行人的安全隔离,有力保障了煤矿斜…

工厂车间人员违规闯入禁区报警系统

工厂车间人员违规闯入禁区报警系统前端设备嵌入AI人体识别算法,对人员的检测、跟踪,实现对人体检测分析识别,实时预警周界区域内人员入侵事件。当有可疑人员进入监测范围内可对其自动识别,即对其抓拍并将当时图像传输到管理中心,在管理中心输出报警信号。工厂车间人员违规…