OpenHarmony OpenSl ES音频录制
Posted Geek.Fan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: %publiclu.", pSize);
fwrite(buffer, 1, pSize, wavFile);
(*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, pSize);
else
AUDIO_INFO_LOG("CaptureStart, buffer is null or pSize: %publiclu.", 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音频录制的主要内容,如果未能解决你的问题,请参考以下文章
Android音视频十三OpenSL ES介绍&基于OpenSL ES实现音频采集
Android音视频十三OpenSL ES介绍&基于OpenSL ES实现音频采集
Android音视频十三OpenSL ES介绍&基于OpenSL ES实现音频采集