OpenHarmony OpenSl ES音频录制
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音频录制相关推荐
- OpenHarmony OpenSl ES音频播放开发
1.OpenHarmony OpenSl ES音频播放简介 开发者可以通过本博文了解在OpenHarmony中如何使用OpenSL ES接口进行音频播放相关操作:当前仅实现了部分OpenSL ES接口 ...
- OpenSL ES音频库学习
OpenSL ES音频库学习 简介 什么是OpenSL ES? openSL ES是一个专用于嵌入式系统的音频库,可以提供对音频的播放和录制等相关功能,在Android上Aduio Recoder都是 ...
- 音视频学习 AudioTrack、OpenSL ES 音频渲染
前言 在讲解音频渲染之前,需要对音频的基础知识有所了解,所以该篇分为基础概念和AudioTrack 以及 OpenSL ES Demo 实例讲解,这样有助于更好的理解 Android 中音频渲染. 音 ...
- 浅聊OpenSL ES音频开发
浅聊OpenSL ES音频开发 导语 开发Android上的音频应用,一般是使用Android提供的AudioRecord采集音频,使用AudioTrack播放音频,使用MediaCodec来编解码, ...
- 播放器基础--OpenSL ES音频播放
介绍 官网 OpenSL ES (Open Sound Library for Embedded Systems)是针对嵌入式系统的一套无授权费,跨平台, 硬件加速的音频API.它提供了一套标准化,高 ...
- 【Android音视频】OpenSL ES音频播放示例一
本文将实现一个使用OpenSL ES来播放assets目录下mp3歌曲的demo(实际推荐大家使用oboe库). Android NDK之高性能音频https://developer.android. ...
- Android 音频 OpenSL ES 录音 采集
1,创建引擎 2,创建AudioRecorder并开始录音 3,暂停录音 4,释放资源 5,数据是通过回调函数处理的. 好处:缓冲区不用通过AudioRecord.getMinBufferSize获取 ...
- Android音视频学习系列(五) — 掌握音频基础知识并使用AudioTrack、OpenSL ES渲染PCM数据
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
- 音视频开发之旅(36) -FFmpeg +OpenSL ES实现音频解码和播放
目录 OpenSL ES基本介绍 OpenSL ES播放音频流程 代码实现 遇到的问题 资料 收获 上一篇我们通过AudioTrack实现了FFmpeg解码后的PCM音频数据的播放,在Android上 ...
最新文章
- MySQL Antelope和Barracuda的区别分析
- 刚刚写了一个评星的脚本插件,分享给大家
- unity android 集成指南
- 多项式相乘快速算法原理及相应C代码实现
- 电商活动难么多,不怕一个电商素材网站解救你,赶紧收藏
- 轻松学习理解ACL访问控制列表(转)
- RNN denoise
- zer0pts CTF 2022 VishwaCTF 2022
- -webkit-scrollbar 滚动条样式设置
- 01.尚硅谷网课1-前端简介
- 速读《构建之法 现代软件工程》的五个问题
- 详谈静态库和动态库的区别
- 远程桌面连接怎么使用?
- 华为HCIE RS笔记-17以太网技术PPoE
- 一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储
- 网卡工作在OSI的第几层?[转]
- AV多媒体管理控制中心,AV媒体矩阵
- 脑机接口给医疗带来了奇迹
- 视频教程-Scratch3.0趣味编程L3X-大型案例《王者荣耀》-其他
- 华为耳机android系统通知,华为freelace耳机如何连接安卓手机?华为freelace连接安卓手机的方法...