1、OpenHarmony OpenSl ES音频录制开发简介

开发者可以通过本博文了解在OpenHarmony中如何使用OpenSL ES进行录音相关操作;当前仅实现了部分OpenSL ES接口,因此调用未实现接口后会返回。SL_RESULT_FEATURE_UNSUPPORTED。

2、OpenHarmony OpenSl ES音频录制开发指导

以下步骤描述了在OpenHarmony如何使用 OpenSL ES 开发音频录音功能:

(1).添加头文件

#include <OpenSLES.h>
#include <OpenSLES_OpenHarmony.h>
#include <OpenSLES_Platform.h>

(2).使用 slCreateEngine 接口创建引擎对象和实例化引擎对象 engine

SLObjectItf engineObject = nullptr;
slCreateEngine(&engineObject, 0, nullptr, 0, nullptr, nullptr);
(*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE);

(3).获取接口 SL_IID_ENGINE 的引擎接口 engineEngine 实例

SLEngineItf engineItf = nullptr;
result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineItf);

(4).配置录音器信息(配置输入源audiosource、输出源audiosink),创建录音对象pcmCapturerObject

SLDataLocator_IODevice io_device = {SL_DATALOCATOR_IODEVICE,SL_IODEVICE_AUDIOINPUT,SL_DEFAULTDEVICEID_AUDIOINPUT,NULL
};SLDataSource audioSource = {&io_device,NULL
};SLDataLocator_BufferQueue buffer_queue = {SL_DATALOCATOR_BUFFERQUEUE,3
};//具体参数需要根据音频文件格式进行适配
SLDataFormat_PCM format_pcm = {SL_DATAFORMAT_PCM,OHOS::AudioStandard::AudioChannel::MONO,OHOS::AudioStandard::AudioSamplingRate::SAMPLE_RATE_44100,OHOS::AudioStandard::AudioSampleFormat::SAMPLE_S16LE,0,0,0
};SLDataSink audioSink = {&buffer_queue,&format_pcm
};SLObjectItf pcmCapturerObject = nullptr;
result = (*engineItf)->CreateAudioRecorder(engineItf, &pcmCapturerObject,&audioSource, &audioSink, 0, nullptr, nullptr);
(*pcmCapturerObject)->Realize(pcmCapturerObject, SL_BOOLEAN_FALSE);

(5).获取录音接口SL_IID_RECORD 的 recordItf 接口实例

SLRecordItf  recordItf;
(*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_RECORD, &recordItf);

(6).获取接口 SL_IID_OH_BUFFERQUEUE 的 bufferQueueItf 实例

SLOHBufferQueueItf bufferQueueItf;
(*pcmCapturerObject)->GetInterface(pcmCapturerObject, SL_IID_OH_BUFFERQUEUE, &bufferQueueItf);

(7).注册 BufferQueueCallback 回调

static void BufferQueueCallback(SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size)
{AUDIO_INFO_LOG("BufferQueueCallback");FILE *wavFile = (FILE *)pContext;if (wavFile != nullptr) {SLuint8 *buffer = nullptr;SLuint32 pSize = 0;(*bufferQueueItf)->GetBuffer(bufferQueueItf, &buffer, pSize);if (buffer != nullptr) {fwrite(buffer, 1, pSize, wavFile);(*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, size);} }return;
}//wavFile_ 需要设置为用户想要录音的文件描述符
(*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, wavFile_);

(8).开始录音

static void CaptureStart(SLRecordItf recordItf, SLOHBufferQueueItf bufferQueueItf, FILE *wavFile)
{AUDIO_INFO_LOG("CaptureStart");(*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_RECORDING);if (wavFile != nullptr) {SLuint8* buffer = nullptr;SLuint32 pSize = 0;(*bufferQueueItf)->GetBuffer(bufferQueueItf, &buffer, pSize);if (buffer != nullptr) {AUDIO_INFO_LOG("CaptureStart, enqueue buffer length: %{public}lu.", pSize);fwrite(buffer, 1, pSize, wavFile);(*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, pSize);} else {AUDIO_INFO_LOG("CaptureStart, buffer is null or pSize: %{public}lu.", pSize);}}return;
}

(9). 结束录音

static void CaptureStop(SLRecordItf recordItf)
{AUDIO_INFO_LOG("Enter CaptureStop");fflush(wavFile_);(*recordItf)->SetRecordState(recordItf, SL_RECORDSTATE_STOPPED);(*pcmCapturerObject)->Destroy(pcmCapturerObject);fclose(wavFile_);wavFile_ = nullptr;return;
}  

OpenHarmony OpenSl ES音频录制相关推荐

  1. OpenHarmony OpenSl ES音频播放开发

    1.OpenHarmony OpenSl ES音频播放简介 开发者可以通过本博文了解在OpenHarmony中如何使用OpenSL ES接口进行音频播放相关操作:当前仅实现了部分OpenSL ES接口 ...

  2. OpenSL ES音频库学习

    OpenSL ES音频库学习 简介 什么是OpenSL ES? openSL ES是一个专用于嵌入式系统的音频库,可以提供对音频的播放和录制等相关功能,在Android上Aduio Recoder都是 ...

  3. 音视频学习 AudioTrack、OpenSL ES 音频渲染

    前言 在讲解音频渲染之前,需要对音频的基础知识有所了解,所以该篇分为基础概念和AudioTrack 以及 OpenSL ES Demo 实例讲解,这样有助于更好的理解 Android 中音频渲染. 音 ...

  4. 浅聊OpenSL ES音频开发

    浅聊OpenSL ES音频开发 导语 开发Android上的音频应用,一般是使用Android提供的AudioRecord采集音频,使用AudioTrack播放音频,使用MediaCodec来编解码, ...

  5. 播放器基础--OpenSL ES音频播放

    介绍 官网 OpenSL ES (Open Sound Library for Embedded Systems)是针对嵌入式系统的一套无授权费,跨平台, 硬件加速的音频API.它提供了一套标准化,高 ...

  6. 【Android音视频】OpenSL ES音频播放示例一

    本文将实现一个使用OpenSL ES来播放assets目录下mp3歌曲的demo(实际推荐大家使用oboe库). Android NDK之高性能音频https://developer.android. ...

  7. Android 音频 OpenSL ES 录音 采集

    1,创建引擎 2,创建AudioRecorder并开始录音 3,暂停录音 4,释放资源 5,数据是通过回调函数处理的. 好处:缓冲区不用通过AudioRecord.getMinBufferSize获取 ...

  8. Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  9. 音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放

    目录 OpenSL ES基本介绍 OpenSL ES播放音频流程 代码实现 遇到的问题 资料 收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上 ...

最新文章

  1. MySQL Antelope和Barracuda的区别分析
  2. 刚刚写了一个评星的脚本插件,分享给大家
  3. unity android 集成指南
  4. 多项式相乘快速算法原理及相应C代码实现
  5. 电商活动难么多,不怕一个电商素材网站解救你,赶紧收藏
  6. 轻松学习理解ACL访问控制列表(转)
  7. RNN denoise
  8. zer0pts CTF 2022 VishwaCTF 2022
  9. -webkit-scrollbar 滚动条样式设置
  10. 01.尚硅谷网课1-前端简介
  11. 速读《构建之法 现代软件工程》的五个问题
  12. 详谈静态库和动态库的区别
  13. 远程桌面连接怎么使用?
  14. 华为HCIE RS笔记-17以太网技术PPoE
  15. 一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储
  16. 网卡工作在OSI的第几层?[转]
  17. AV多媒体管理控制中心,AV媒体矩阵
  18. 脑机接口给医疗带来了奇迹
  19. 视频教程-Scratch3.0趣味编程L3X-大型案例《王者荣耀》-其他
  20. 华为耳机android系统通知,华为freelace耳机如何连接安卓手机?华为freelace连接安卓手机的方法...

热门文章

  1. 服务器pci-e硬盘,PCI-E固态硬盘在客户端的机会_希捷硬盘_服务器评测与技术-中关村在线...
  2. 生信技能9 - 生物信息分析必须掌握的生物学基本概念(建议收藏)
  3. 关于 Github.io 域名访问遭拒解决记录
  4. springboot监听器
  5. 概率函数和概率密度函数
  6. Java 的设计模式
  7. win10任务栏透明_Win10原生实现全透明任务栏
  8. 基于Python读取Excel表格文件数据并转换为字典dict格式
  9. jmeter-连接数据库
  10. Python基础语法1-8章