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 engineEngine = nullptr;
(*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine);

(4).配置播放器信息,创建 AudioPlayer

SLDataLocator_BufferQueue slBufferQueue = 
    SL_DATALOCATOR_BUFFERQUEUE,
    0
;

// 具体参数需要根据音频文件格式进行适配
SLDataFormat_PCM pcmFormat = 
    SL_DATAFORMAT_PCM,
    2,
    48000,
    16,
    0,
    0,
    0
;
SLDataSource slSource = &slBufferQueue, &pcmFormat;

SLObjectItf pcmPlayerObject = nullptr;
(*engineEngine)->CreateAudioPlayer(engineEngine, &pcmPlayerObject, &slSource, null, 0, nullptr, nullptr);
(*pcmPlayerObject)->Realize(pcmPlayerObject, SL_BOOLEAN_FALSE);

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

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

(6).打开音频文件,注册 BufferQueueCallback 回调

FILE *wavFile_ = nullptr;

static void BufferQueueCallback (SLOHBufferQueueItf bufferQueueItf, void *pContext, SLuint32 size)

    FILE *wavFile = (FILE *)pContext;
    if (!feof(wavFile)) 
        SLuint8 *buffer = nullptr;
        SLuint32 pSize = 0;
        (*bufferQueueItf)->GetBuffer(bufferQueueItf, &buffer, pSize);
        //从文件读取数据
        fread(buffer, 1, size, wavFile);
        (*bufferQueueItf)->Enqueue(bufferQueueItf, buffer, size);
    
    return;


// wavFile_ 需要设置为用户想要播放的文件描述符
wavFile_ = fopen(path, "rb");
(*bufferQueueItf)->RegisterCallback(bufferQueueItf, BufferQueueCallback, wavFile_);

(7).获取接口 SL_PLAYSTATE_PLAYING 的 playItf 实例,开始播放

SLPlayItf playItf = nullptr;
(*pcmPlayerObject)->GetInterface(pcmPlayerObject, SL_IID_PLAY, &playItf);
(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING);

(8).结束音频播放

(*playItf)->SetPlayState(playItf, SL_PLAYSTATE_STOPPED);
(*pcmPlayerObject)->Destroy(pcmPlayerObject);
(*engineObject)->Destroy(engineObject);

以上是关于OpenHarmony OpenSl ES音频播放开发的主要内容,如果未能解决你的问题,请参考以下文章

Android音视频OpenSL ES音频播放示例一

(原)关于OpenSL ES播放音频数据的一个奇怪的问题

Android 自定义音频播放器,用 libPd 或 OpenSL ES 或 AudioTrack 替换 MediaPlayer

:使用OpenSL ES进行音频解码

:使用OpenSL ES进行音频解码

Android音视频学习第7章:使用OpenSL ES进行音频解码