FFmpeg(13)-创建OpenSLES混音器CreateOutputMix初始化

一.包含头文件和库文件

CMakeLists

target_link_libraries( # Specifies the target library.
                       native-lib
                       OpenSLES

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

代码

#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>

二.示例代码

复制代码
#include <jni.h>
#include <string>
#include <android/log.h>
#include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Android.h>


#define LOG_TAG "xp.chen"
#ifdef LOG_TAG
    #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
    #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    #define LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__)
#else
    #define LOGI(...)
    #define LOGE(...)
    #define LOGV(...)
#endif


static SLObjectItf engineSL = NULL;
SLEngineItf CreateSL()
{
    SLresult ret;
    SLEngineItf en;
    // 创建引擎
    ret = slCreateEngine(&engineSL, 0, 0, 0, 0, 0);
    if (ret != SL_RESULT_SUCCESS) {
        LOGE("slCreateEngine() failed ");
        return NULL;
    }
    // 实例化
    ret = (*engineSL)->Realize(engineSL, SL_BOOLEAN_FALSE);
    if (ret != SL_RESULT_SUCCESS) {
        LOGE("Realize failed");
        return NULL;
    }
    // 获取接口
    ret = (*engineSL)->GetInterface(engineSL, SL_IID_ENGINE, &en);
    if (ret != SL_RESULT_SUCCESS) {
        LOGE("GetInterface failed");
        return NULL;
    }
    return en;
}


extern "C" JNIEXPORT jstring
JNICALL
Java_com_yuneec_yongdaimi_testopensl_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    // 创建引擎
    SLEngineItf eng = CreateSL();
    if (eng) {
        LOGI("CreateSL success");
    } else {
        LOGE("CreateSL failed");
    }
    // 创建混音器
    SLObjectItf mix = NULL;
    SLresult ret = 0;
    ret = (*eng)->CreateOutputMix(eng, &mix, 0, 0, 0);
    if (ret != SL_RESULT_SUCCESS) {
        LOGE("CreateOutputMix failed");
    }
    ret = (*mix)->Realize(mix, SL_BOOLEAN_FALSE);
    if (ret != SL_BOOLEAN_FALSE) {
        LOGE("(*mix)->Realize failed!");
    }
    SLDataLocator_OutputMix outmix = {SL_DATALOCATOR_OUTPUTMIX, mix};
    SLDataSink audioSink = {&outmix, 0};

    return env->NewStringUTF(hello.c_str());
}
复制代码

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(1089)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示