鸿蒙媒体开发系列07——AVRecorder音频录制

 如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

在HarmonyOS系统中,多种API都提供了音频录制开发的支持,不同的API适用于不同录音输出格式、音频使用场景或不同开发语言。因此,选择合适的音频录制API,有助于降低开发工作量,实现更佳的音频录制效果。

  • AVRecorder:功能较完善的音频、视频录制ArkTS/JS API,集成了音频输入录制、音频编码和媒体封装的功能。开发者可以直接调用设备硬件如麦克风录音,并生成m4a音频文件。

  • AudioCapturer:用于音频输入的的ArkTS/JS API,仅支持PCM格式,需要应用持续读取音频数据进行工作。应用可以在音频输出后添加数据处理,要求开发者具备音频处理的基础知识,适用于更专业、更多样化的媒体录制应用开发。

  • OpenSL ES:一套跨平台标准化的音频Native API,目前阶段唯一的音频类Native API,同样提供音频输入原子能力,仅支持PCM格式,适用于从其他嵌入式平台移植,或依赖在Native层实现音频输入功能的录音应用使用。

注意:

应用可以调用麦克风录制音频,但该行为属于隐私敏感行为,在调用麦克风前,需要先向用户申请权限“ohos.permission.MICROPHONE”。

2、使用AVRecorder音频录制

使用AVRecorder可以实现音频录制功能,本文将以“开始录制-暂停录制-恢复录制-停止录制”的一次流程为示例,介绍AVRecorder音频录制相关功能。

在进行应用开发的过程中,我们可以通过AVRecorder的state属性,主动获取当前状态或使用on('stateChange')方法监听状态变化。开发过程中应该严格遵循状态机要求,例如只能在started状态下调用pause()接口,只能在paused状态下调用resume()接口。

AVRecorderState主要的状态罗列如下:

图片

AVRecorderState各个状态的流转变化如下图所示👇🏻👇🏻。

图片

3、开发步骤

1、创建AVRecorder实例

实例创建完成后,State将会进入idle状态。

import media from '@ohos.multimedia.media';let avRecorder = undefined;media.createAVRecorder().then((recorder) => {  avRecorder = recorder;}, (err) => {  console.error(`Invoke createAVRecorder failed, code is ${err.code}, message is ${err.message}`);})

2、设置业务需要监听的事件,监听状态变化及错误上报

图片

// 状态上报回调函数avRecorder.on('stateChange', (state, reason) => {  console.log(`current state is ${state}`);  // 用户可以在此补充状态发生切换后想要进行的动作})// 错误上报回调函数avRecorder.on('error', (err) => {  console.error(`avRecorder failed, code is ${err.code}, message is ${err.message}`);})

3、配置音频录制参数,调用prepare()接口,此时进入prepared状态。​​​​​​​

let avProfile = {  audioBitrate: 100000, // 音频比特率  audioChannels: 2, // 音频声道数  audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac  audioSampleRate: 48000, // 音频采样率  fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a}let avConfig = {  audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风  profile: avProfile,  url: 'fd://35', // 参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处}avRecorder.prepare(avConfig).then(() => {  console.log('Invoke prepare succeeded.');}, (err) => {  console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`);})

4、开始录制,调用start()接口,此时进入started状态。

5、暂停录制,调用pause()接口,此时进入paused状态。

6、恢复录制,调用resume()接口,此时再次进入started状态。

7、停止录制,调用stop()接口,此时进入stopped状态。

8、重置资源,调用reset()重新进入idle状态,允许重新配置录制参数。

9、销毁实例,调用release()进入released状态,退出录制。

以一个“开始录制-暂停录制-恢复录制-停止录制”的流程为例,demo如下:​​​​​​​

import media from '@ohos.multimedia.media';export class AudioRecorderDemo {  private avRecorder;  private avProfile = {    audioBitrate: 100000, // 音频比特率    audioChannels: 2, // 音频声道数    audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac    audioSampleRate: 48000, // 音频采样率    fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a  };  private avConfig = {    audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风    profile: this.avProfile,    url: 'fd://35', // 参考应用文件访问与管理开发示例新建并读写一个文件  };  // 注册audioRecorder回调函数  setAudioRecorderCallback() {    // 状态机变化回调函数    this.avRecorder.on('stateChange', (state, reason) => {      console.log(`AudioRecorder current state is ${state}`);    })    // 错误上报回调函数    this.avRecorder.on('error', (err) => {      console.error(`AudioRecorder failed, code is ${err.code}, message is ${err.message}`);    })  }  // 开始录制对应的流程  async startRecordingProcess() {    // 1.创建录制实例    this.avRecorder = await media.createAVRecorder();    this.setAudioRecorderCallback();    // 2.获取录制文件fd赋予avConfig里的url;参考FilePicker文档    // 3.配置录制参数完成准备工作    await this.avRecorder.prepare(this.avConfig);    // 4.开始录制    await this.avRecorder.start();  }  // 暂停录制对应的流程  async pauseRecordingProcess() {    if (this.avRecorder.state === 'started') { // 仅在started状态下调用pause为合理状态切换      await this.avRecorder.pause();    }  }  // 恢复录制对应的流程  async resumeRecordingProcess() {    if (this.avRecorder.state === 'paused') { // 仅在paused状态下调用resume为合理状态切换      await this.avRecorder.resume();    }  }  // 停止录制对应的流程  async stopRecordingProcess() {    // 1. 停止录制    if (this.avRecorder.state === 'started'    || this.avRecorder.state === 'paused') { // 仅在started或者paused状态下调用stop为合理状态切换      await this.avRecorder.stop();    }    // 2.重置    await this.avRecorder.reset();    // 3.释放录制实例    await this.avRecorder.release();    // 4.关闭录制文件fd  }  // 一个完整的【开始录制-暂停录制-恢复录制-停止录制】示例  async audioRecorderDemo() {    await this.startRecordingProcess(); // 开始录制    // 用户此处可以自行设置录制时长,例如通过设置休眠阻止代码执行    await this.pauseRecordingProcess(); //暂停录制    await this.resumeRecordingProcess(); // 恢复录制    await this.stopRecordingProcess(); // 停止录制  }}

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

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

相关文章

2024永久激活版 Studio One 6 Pro for mac 音乐创作编辑软件 完美兼容

Studio One 6是一款功能强大的音乐制作软件,由PreSonus公司开发。它提供了全面的音频录制、编辑、混音和母带处理工具,适用于音乐制作人、音频工程师和创作人员。 Studio One 6拥有直观的用户界面,使用户能够快速而流畅地进行音乐创作。它采…

ubuntu安装emqx

目录 1.预先下载好emqx压缩包 2.使用tar命令解压 3.进入bin目录 5.放开访问端口18083 6.从通过ip地址访问emqx后台 7.默认用户名密码为admin/public 8.登录后台 9.资源包绑定在此博文可自取 1.预先下载好emqx压缩包 2.使用tar命令解压 sudo tar -xzvf emqx-5.0.8-el8-…

莱卡相机sd内存卡格式化了怎么恢复数据

在数字化时代,相机已成为我们记录生活、捕捉瞬间的重要设备。而SD内存卡,作为相机的存储媒介,承载着我们的珍贵记忆和重要数据。然而,有时由于误操作、系统错误或其他原因,我们可能会不小心格式化SD内存卡,…

一个基于VB的期刊信息管理系统

一个基本的期刊信息管理系统的示例,使用 Visual Basic (VB.NET) 编写。这个示例将展示如何创建一个简单的期刊信息管理系统,其中包括添加、查看、编辑和删除期刊的功能。 系统需求 添加期刊:允许用户输入期刊的信息(如标题、作者…

OpenAI GPT o1技术报告阅读(3)-英文阅读及理解

✨继续阅读报告:使用大模型来学习推理(Reason) 原文链接:https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个英文阅读理解的案例。 原问题: The following passage is the draft of an excerpt from a contempora…

条件编译代码记录

#include <iostream>// 基类模板 template<typename T> class Base { public:void func() {std::cout << "Base function" << std::endl;} };// 特化的子类 template<typename T> class Derived : public Base<T> { public:void…

MYSQL数据库——MYSQL管理

MYSQL数据库安装完成后&#xff0c;自带四个数据库&#xff0c;具体作用如下&#xff1a; 常用工具 1.mysql 不是指mysql服务&#xff0c;而是指mysql的客户端工具 例如&#xff1a; 2.mysqladmin 这是一个执行管理操作的客户端程序&#xff0c;可以用它来检查服务器的配置和…

多线程篇六

多线程篇六 如笔者理解有误欢迎交流指正~⭐ 什么是单例模式&#xff1f; 单例模式是最常见的 设计模式. 顾名思义&#xff0c;单例模式指的就是单个实例的模式.&#xff08;针对某些类只能使用一个对象的场景【如MySQL、JDBC、DataSource】&#xff09; 设计模式 设计模式是…

数据结构之二叉树(1)

数据结构之二叉树&#xff08;1&#xff09; 一、树 1、树的概念与结构 &#xff08;1&#xff09;树是一种非线性的数据结构&#xff0c;由n(n>0)个有限结点组成一个具有层次关系的集合。 &#xff08;2&#xff09;树有一个特殊的结点&#xff0c;叫做根结点&#xff…

Linux:Bash中的文件描述符

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

【Mac】系统环境配置

常用工具 Navicat PJ版本&#xff1a;this 提取密码&#xff1a;v31p Host切换器 SwitchHosts termius 一款好用的Linux服务器连接工具&#xff1a; termius 小飞机 dddd&#xff1a;&#x1fa9c; Git mac安装git有好多种方式&#xff0c;自带的xcode或者通过Homebr…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;802 标注数量(xml文件个数)&#xff1a;802 标注数量(txt文件个数)&#xff1a;802 标注类别…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…

C++的封装

手动封装一个顺序表&#xff08;SeqList&#xff09;,分文件编译实现 有私有成员&#xff1a;顺序表数组的起始地址 ptr、 顺序表的总长度&#xff1a;size、顺序表的实际长度&#xff1a;len 成员函数&#xff1a;初始化 init(int n) 判空&#xff1a;empty 判满&#xff1a;f…

【计算机网络 - 基础问题】每日 3 题(一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

云手机的便捷性和安全性体现在哪?

随着5G技术的迅速发展&#xff0c;云手机在游戏、电商以及新媒体营销等领域中的应用日益广泛。它不仅能够显著降低成本、提升效率&#xff0c;还随着边缘计算和云技术的进步&#xff0c;展现出无限的增长潜力。 云手机的便捷性体现在哪里&#xff1f; 云手机的便捷性毋庸置疑。…

基于ExtendSim的 电子制造 仿真模型

说明&#xff1a; 此模型表示电路板制造设施。该过程有4个步骤&#xff1a; *焊料制备 *组件放置 *烤箱 *检查 详情&#xff1a; *烤箱的容量为10张卡&#xff0c;但如果烤箱循环开始时仅能处理5张卡&#xff0c;则最多只能处理5张。 *如果检查员发现问题&#xff0c;他们将修理…

大数据新视界 --大数据大厂之 Cassandra 分布式数据库:高可用数据存储的新选择

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【matlab】将程序打包为exe文件(matlab r2023a为例)

文章目录 一、安装运行时环境1.1 安装1.2 简介 二、打包三、打包文件为什么很大 一、安装运行时环境 使用 Application Compiler 来将程序打包为exe&#xff0c;相当于你使用C编译器把C语言编译成可执行程序。 在matlab菜单栏–App下面可以看到Application Compiler。 或者在…

数据结构和算法之线性结构

原文出处:数据结构和算法之线性结构 关注码农爱刷题&#xff0c;看更多技术文章&#xff01;&#xff01;&#xff01; 线性结构是一种逻辑结构&#xff0c;是我们编程开发工作应用最广泛的数据结构之一。线性结构是包含n个相同性质数据元素的有限序列。它的基本特征是&…