OpenHarmony OpenSl ES音频录制

该文介绍了在OpenHarmony操作系统中使用OpenSLES进行音频录制的步骤,包括创建引擎对象、配置录音器信息、创建录音对象、获取接口以及开始和停止录音的操作。开发者需要注意,目前并非所有OpenSLES接口都已实现,调用未支持的接口会返回错误代码。
摘要由CSDN通过智能技术生成

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;
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大王算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值