欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深度解析:播放器操作与基础功能详解

时间:11-13 民间故事 提交错误

大家好,今天小编来为大家解答以下的问题,关于深度解析:播放器操作与基础功能详解,这个很多人还不知道,现在让我们一起来看看吧!

OpenSL ES(嵌入式系统开放声音库)是用于嵌入式系统的免许可、跨平台、硬件加速的音频API。它提供了一套标准化、高性能、低延迟的方法。本地应用程序(C/C++)的开发者可以使用该方法操作音频,实现软/硬件音频性能的直接跨平台部署,并减少执行时间。困难,推动高级音响市场发展

NDK 包包含由Khronos Group 开发的OpenSL ES 1.0.1 API 规范的Android 特定实现。该库允许您使用C 或C++ 实现高性能、低延迟的音频应用程序。

标准OpenSL ES 接头并允许音频输入和输出。和中提供了其他Android 特定功能。

如何在Android中使用OpenSL ES

添加OpenSL ES 参考target_link_libraries( # 指定目标库。

开放式SLES

) 添加必要的头文件

添加核心OpenSL ES 功能集OpenSLES.h

添加OpenSL ES [Android 扩展]OpenSLES_Android.h

代码示例

GitHub 页面上提供了以下示例应用程序:

音频回声创建从输入到输出的往返循环。 native-audio 是一个简单的录音机/播放器。Note that OpenSL ES isdeprecated from Android 11, developers are recommended to useOboelibrary instead.

OpenSL ES简单使用

使用OpenSL相关API的一般步骤为: 1.创建对象(通过带create的函数)

2.初始化(通过Realize函数)

3.获取使用相关函数的接口(通过GetInterface函数)

OpenSL 使用回调机制来访问音频IO。回调方法只是告诉我们:BufferQueue 已准备好并且可以接受/获取数据。

OpenSL 使用SLBufferQueueItf。排队函数从音频设备获取(放入)数据。

关于使用FFmpeg + opensl实现Android播放器音频播放,可以在回调函数中获取解码后的音频数据,并调用Enqueue函数进行播放。开始播放时,需要手动启动回调机制,否则回调不会被调用。到达。

一个简单的音频播放大概需要下面的object://engine

SLObjectItf 引擎对象=0;

//引擎接口

SLEngineItf 引擎接口=0;

//混合器

SLObjectItf 输出混合对象=0;

//玩家

SLObjectItf bqPlayerObject=0;

//播放器接口

SLPlayItf bqPlayerPlay=0;

//玩家队列接口

SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue=0;基本流程

opensles.png代码还在整理中,先简单贴一下。

无效AudioChannel:audio_play(){

/**

* 1.创建引擎并获取引擎接口

*/

SLresult结果;

//1.1 创建引擎对象:SLObjectItf engineObject

结果=slCreateEngine(engineObject, 0, NULL, 0, NULL, NULL);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

//1.2 初始化引擎

结果=(*engineObject)-Realize(engineObject, SL_BOOLEAN_FALSE);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

//1.3 获取引擎接口SLEngineItf engineInterface

结果=(*engineObject)-GetInterface(engineObject,SL_IID_ENGINE,engineInterface);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

/**

* 2. 设置混音器

*/

//2.1 创建混音器:SLObjectItf outputMixObject

结果=(*engineInterface)-CreateOutputMix(engineInterface,outputMixObject,0,

0, 0);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

//2.2 初始化混音器

结果=(*outputMixObject)-Realize(outputMixObject, SL_BOOLEAN_FALSE);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

/**

* 3.创建播放器

*/

//3.1 配置输入声音信息

//创建buffer缓冲类型队列2队列

SLDataLocator_AndroidSimpleBufferQueue loc_bufq={SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE,

2};

//pcm数据格式

//SL_DATAFORMAT_PCM:数据格式为pcm格式

//2:双通道

//SL_SAMPLINGRATE_44_1:采样率44100

//SL_PCMSAMPLEFORMAT_FIXED_16:采样格式为16bit

//SL_PCMSAMPLEFORMAT_FIXED_16:数据大小为16bit

//SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT:左右声道(双声道)

//SL_BYTEORDER_LITTLEENDIAN:小端模式

SLDataFormat_PCM format_pcm={SL_DATAFORMAT_PCM, 2, SL_SAMPLINGRATE_44_1,

SL_PCMSAMPLEFORMAT_FIXED_16,

SL_PCMSAMPLEFORMAT_FIXED_16,

SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT,

SL_BYTEORDER_LITTLEENDIAN};

//数据源将上面的配置信息放入到这个数据源中

SLDataSource audioSrc={loc_bufq, format_pcm};

//3.2 配置音轨(输出)

//设置混音器

SLDataLocator_OutputMix loc_outmix={SL_DATALOCATOR_OUTPUTMIX,outputMixObject};

SLDataSink audioSnk={loc_outmix, NULL};

//所需接口:操作队列接口

const SLInterfaceID ids[1]={SL_IID_BUFFERQUEUE};

const SLboolean req[1]={SL_BOOLEAN_TRUE};

//3.3 创建玩家

结果=(*engineInterface)-CreateAudioPlayer(engineInterface,bqPlayerObject,audioSrc,

audioSnk, 1, ids, 请求);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

//3.4 初始化播放器:SLObjectItf bqPlayerObject

结果=(*bqPlayerObject)-Realize(bqPlayerObject, SL_BOOLEAN_FALSE);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

//3.5 获取播放器接口:SLPlayItf bqPlayerPlay

结果=(*bqPlayerObject)-GetInterface(bqPlayerObject, SL_IID_PLAY, bqPlayerPlay);

如果(SL_RESULT_SUCCESS!=结果){

返回;

}

/**

* 4.设置播放回调函数

*/

//4.1 获取播放器队列接口:SLAndroidSimpleBufferQueueItf bqPlayerBufferQueue

(*bqPlayerObject)-GetInterface(bqPlayerObject, SL_IID_BUFFERQUEUE, bqPlayerBufferQueue);

//4.2 设置回调void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context)

(*bqPlayerBufferQueue)-RegisterCallback(bqPlayerBufferQueue, bqPlayerCallback, this);

/**

* 5.设置播放器状态为播放状态

*/

(*bqPlayerPlay)-SetPlayState(bqPlayerPlay, SL_PLAYSTATE_PLAYING);

/**

* 6.手动激活回调函数

*/

bqPlayerCallback(bqPlayerBufferQueue, 这个);

}void bqPlayerCallback(SLAndroidSimpleBufferQueueItf bq, void *context) {

AudioChannel *audioChannel=static_cast(context);

int pcm_size=audioChannel-getPCM();

如果(pcm_size 0){

(*bq)-Enqueue(bq,audioChannel-out_buffers,pcm_size);

}

}代码还在整理中https://github.com/yizhongliu/FFMediaPlayer

官方网站

https://www.khronos.org/opensles/

https://developer.android.google.cn/ndk/guides/audio/opensl

文章分享结束,深度解析:播放器操作与基础功能详解和的答案你都知道了吗?欢迎再次光临本站哦!

用户评论

野兽之美

这个标题听起来像是学习视频剪辑或音频处理的基础知识。

    有12位网友表示赞同!

终究会走-

我想了解一下各种类型的播放器都有哪些特性能量!

    有13位网友表示赞同!

泡泡龙

刚开始学习用某个播放器软件,感觉很有难度呢。

    有13位网友表示赞同!

青墨断笺み

基础课程通常对新手很友好啊,希望能够系统地学习一遍。

    有5位网友表示赞同!

你身上有刺,别扎我

我记得小时候玩游戏的时候经常用到播放器,这个标题是不是有点怀旧的味道?

    有10位网友表示赞同!

ヅ她的身影若隐若现

学习播放器的基础知识能让我更好地去理解音频和视频的处理原理吧?

    有11位网友表示赞同!

未来未必来

如果能学到如何制作自己的播放器就好了!

    有7位网友表示赞同!

あ浅浅の嘚僾

我觉得播放器基础课程应该包括常见操作和一些小技巧。

    有16位网友表示赞同!

余温散尽ぺ

最近项目用到播放器功能,想学习一下操作方法。

    有19位网友表示赞同!

西瓜贩子

不知道这个播放器基础课程难度是怎样的,会不会太深入?

    有6位网友表示赞同!

不离我

希望这个课程能教会我控制速度、音量等等的基本操作!

    有17位网友表示赞同!

虚伪了的真心

我想学习如何使用不同的格式的音频文件。

    有13位网友表示赞同!

今非昔比'

播放器的功能越来越多,基础知识真的非常重要呀。

    有6位网友表示赞同!

坠入深海i

这课应该也会介绍一些常见的播放器软件吧?

    有13位网友表示赞同!

放血

学习基础知识能让我的操作更加得心应手!

    有15位网友表示赞同!

别在我面前犯贱

听名字就知道肯定是要从入门开始的课程,适合没有经验的人学习。

    有5位网友表示赞同!

青衫负雪

期待学习这个充满无限可能的内容!

    有15位网友表示赞同!

夜晟洛

播放器基础就是玩儿视频和小音频的开头吧?

    有15位网友表示赞同!

葵雨

这个标题让我想到要自己制作一个播放器!

    有12位网友表示赞同!

【深度解析:播放器操作与基础功能详解】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活