我开始在C ++中实现我的游戏音频部分,并且我已经看到了2个音频框架可用( https://developer.android.com/ndk/guides/aaudio/aaudio/aaudio/aaudio.html )和opensl( 这两个之间有哪些区别? 解决方案 opensl es OpenSL由从Android 2.3(姜饼)开始的设备支持.但是,自Android 4.2(或4.3?)以来,可以使用OpenSL的快速混合器(高性能音频),并且并非所有设备都在本地支持. 这是什么意思?根据我的观察结果,当不使用快速混合器时,Java audiotrack (延迟较低). 当使用快速混合器时,音频延迟实际上很好且低.为了实现它,您的设备必须支持快速混合器,并且配置参数应匹配. 要考虑的另一个问题是在GearVr上" crack",这可能是由于线程优先级的变化. 要使用openSL实现音频,您可能需要参考NDK样本,甚至在这里更好地 ht
以下是关于 opensl 的编程技术问答
Android应该通过opensl es API支持3D音频,该音频可通过NDK获得.或多或少地工作,我设法通过创建的播放器和输出组合来播放声音.但是,当我尝试实现具有3D位置界面(SL_IID_3DLOCATION常数)的侦听器时,这是播放3D声音的强制性.但是,当我尝试将常数设置为sl_boolean_true时,crevelistener方法的结果为12,将其传递给logcat. 12是opensl es常数sl_result_feature_unsupport的值.在下面您可以找到代码的短部分,任何人都可以确认我是否做错了什么或是否真的不操纵,这意味着OpenSL ES实现不支持3D音频? #define SL_RESULT_FEATURE_UNSUPPORTED ((SLuint32) 0x0000000C) const SLInterfaceID listener_ids[] = {SL_IID_3DLOCATION}; const SLboolean l
我想使用opensl es filedescriptor对象从音频资产获取一个字节缓冲区,所以我可以反复延时到一个单调的bumplebufferqueue,而不是使用sl接口播放/停止/寻找文件. 为什么我想直接管理样本字节的三个主要原因: opensl使用audiot rack图层播放/停止/等播放器对象.这不仅介绍了不必要的开销,但它也有几个错误,并且播放器的快速启动/停止导致很多问题. 我需要直接操纵字节缓冲区以进行自定义DSP效果. 我将播放的剪辑很小,并且都可以加载到内存中以避免文件I/O开销.另外,eNUTUEING我自己的缓冲区将允许我通过将0写入输出接收器来减少延迟,并在播放时简单地切换到样本字节,而不是停止,暂停和播放座面架. 好的,所以resefications完整 - 这是我尝试的 - 我有一个 sample 结构,它基本上是一个输入和输出轨道,以及一个字节数组来保存样本.输入是我的filedescriptor播放器,输出是一个单调的bumpl
我正在使用mediarecorder dueve_call 音频源在呼叫记录器应用程序上,在一些棉花手机设备崩溃中,然后我将源更改为麦克风在这里传入的声音不是记录.由于此Java限制现在我正在研究母语的Android代码来记录语音呼叫. 我设法使用 native-audio 呼叫记录器的录像机.问题是在本机代码中,它也只是录制一个侧面的声音,传入的声音没有记录.然后我尝试了语音通信预设配置,它不是录制.以下是预设配置代码. const SLInterfaceID id[2] = { SL_IID_ANDROIDSIMPLEBUFFERQUEUE,SL_IID_ANDROIDCONFIGURATION}; const SLboolean req[2] = { SL_BOOLEAN_TRUE,SL_BOOLEAN_TRUE}; result = (*engineEngine)->CreateAudioRecorder(engineEngine, &recorderObject, &a
我需要创建一个VoIP应用程序,我正在使用opensl es.我需要以8kHz采样率捕获并播放PCM音频数据,适用于所有Android设备.但是,当我在采样率时捕获音频8kHz并同时播放(语音通信)时,它会产生噪音,音频对Samsung Galaxy S3,S4等的某些设备失真.我知道,有特定的首选采样率对于每个设备,我想知道有没有解决方法或任何方法,只能使用8khz采样率没有任何失真? 我尝试越来越多的缓冲区大小和许多其他东西,但无法找到最佳和通用解决方案.我需要在8kHz上采样的音频数据,以为我的编码器和解码器.我在第二次思想将其传递给我的编码器或解码器之前重新采样音频数据,但它不是我正在寻找的解决方案. 我发现CSIPSimple使用了Opensl,我也经历了一些代码.但是,但我找不到一个解决方案,可能是我未能理解在哪里集中注意力. 我在这里陷入困境! 解决方案 这就是我解决问题的方式: 我正在使用opensl es和这个教程帮助了我很多.我跟着这里的指示
我一直在尝试使用带有Android 2.3的opensl es库,该库可用于使用Android 2.3来进行本机音频,但它似乎是标题文件和规范的600页PDF是唯一可用的文档. 我应该在哪里寻找示例,教程或能力的简要概述? 解决方案 是一个名为其他解决方案 您还可以检查Victor Lazzarini的音频编程博客,它有一个Android部分: http://audioprograming.wordpress .com/类别/android/ 在那里你会找到工作的例子,他们对我来说非常有用,以便使用opensl,可以用作与ndk开发音频应用程序的基础. 也,不要忽略规格文档,这不是很长的一部分,第一部分不超过五十页,并为您提供所需的角度来了解一切如何运作,其余的是用于参考使用.小心Android OpenSL实现中的一些东西不同于规格:请参阅您的NDK-Directory/docs/oppensles/indexles/index.html以获取更多信息.
是否有人有经验(使用OpenSL es,Alsa等),通过重定向音频或在Android中创建新的声音路径?最终目标是创建一个虚拟麦克风来替换外部麦克风,其中一个人可以播放音频文件,就像他们在麦克风中讲话一样.使用AudioSource.MIC访问麦克风的应用程序应使用此备用流.它没有必要使用语音呼叫,我相信实现这种功能更加困难,因为它在收音机内完成. 在哪里开始的任何想法?我用OpenSL和Alsa完成了一些研究,但它看起来像是需要打包新的固件(ROM)以定义自定义音频路径.如果可以避免,我想创建一个应用程序级解决方案.手机是'植根的'(有苏二十内部).目标设备是三星Galaxy S4谷歌版(GT-I9505G).具体而言,我正在寻找音频驱动程序配置/源代码或I9505G的任何引用. 提前感谢! 编辑 - 我已经检查过CyanogenMod 10.2源树,以及JFLTEXX驱动程序和内核.以下是内核/三星/jf/sound的内容: http://pastebin.com
我目前正在尝试最小化简单应用程序的音频延迟: 我在PC上有一个视频,我正在通过RTP将视频的音频传输到移动客户端.使用非常类似的缓冲算法,我可以在iOS上达到90毫秒,但是Android上的可怕±180ms. 我猜测来自众所周知延迟问题在android. 但是,在读取左右后,我来到了这篇文章,哪些指出: 由于某些设备中的Android 4.1/4.2以来,低延迟音频可用. 使用 libpd可以实现低延迟音频,这是纯数据库的Android . 我有2个问题,直接与这些陈述有关: 我在哪里可以在果冻中找到有关新的低延迟音频的更多信息? 这就是我所能找到的,但它非常缺乏特定信息.如果更改对我来说是透明的,或者有一些新的类/API调用我应该为我实施,以注意我的申请中的任何变化?我正在使用Audiot rack API,我甚至不确定它是否应该从这个改进中获益,或者如果我应该调查音频播放的其他一些机制. 我应该使用libpd吗?在我看来,我就是我唯一实现较
我已经尝试了几个星期.我正在尝试通过sl_datalocator_uri在SDCARD上播放文件时访问缓冲区,作为源.我想写一些自己的效果,需要缓冲区. 当前在代码中,我正在创建两个音频播放器.一个是将文件读取到缓冲区,另一个是将缓冲区写入输出.当我用麦克风(录音机)测试代码时,一切都很好.声音在外面工作如预期的. 当我使用URI AudioPlayer切换录音机时,队列会出现干草.流媒体不听线锁(据我所知,这是异步的),并且缓冲呼叫未正确触发,时间飞逝. 我已经将日志放在每个方法上,因此结果出现类似的结果: V/PDecoder( 1292): Position : 15023 V/PDecoder( 1292): Position : 16044 V/PDecoder( 1292): Position : 17043 V/PDecoder Native PL1( 1292): bqPlayerCallback V/PDecoder Native PL1( 12
我正在尝试使用Bufferqueue源和OutputMix接收器创建AudioPlayer.我已经使用与NDK样本中所示的PCM格式配置了PCM格式,但是OpenSL拒绝SL_DATAFORMAT_PCM("数据格式2").这对我没有任何意义. 这是错误(在三星Galaxy S2上): 02-27 15:43:47.315: E/libOpenSLES(12681): pAudioSrc: data format 2 not allowed 02-27 15:43:47.315: W/libOpenSLES(12681): Leaving Engine::CreateAudioPlayer (SL_RESULT_CONTENT_UNSUPPORTED) 这是相关代码: SLuint32 channels = 2; SLuint32 speakers = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; SLuint32
我初始化了一个androidsimplebufferqueue,如值: SLDataLocator_AndroidSimpleBufferQueue bufferLocator = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2}; SLDataFormat_PCM pcmFormat = { SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_44_1, SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN}; SLDataSource audioSource = {&bufferLocator, &pcmFormat}; SLDataLocator_OutputMi
我正在使用opensl es在我的项目中播放音乐和声音.我使用了本机 - 音频样本开始,它对于再现背景音乐和单个声音很好,但是当我尝试同时再现两个或更多个声音时,声音不会同时再现在播放所有先前的缓冲区时,声音缓冲区会延长播放. 然后,在一点研究之后,我发现了两种方法来修复它,简称: 使用多个音频播放器(以及因此缓冲区队列)来重现声音. 将声音效果缓冲在一起混合到单个缓冲器中,然后将缓冲区. 我的问题是: 你认为最好的方法是什么?有一种更好的方法,我被忽略了? 提前感谢. 解决方案 我也使用opensl es.一点点复杂的一开始... 无论如何,您可以创建您想要的ObjectPlayer,始终记住对象的最大Ammount为32. 所以,理想情况下,如果您想同时播放4个声音,则需要4个PlayerObject和1个OutputMixObject 希望您可以找到有用的方法 其他解决方案 这是一种完全不同的方法:我正在使用 soundp
我已经尝试了Android NDK中的本机音频代码样本.当我尝试录制一些演讲然后播放它时,它可以正常工作.它使用主扬声器(扬声器)进行语音播放.我想修改代码,以便在耳鸣而不是主扬声器中播放语音.任何帮助? 解决方案 我解决了这个问题,我找到了一个Google的相关主题组.这真的很有帮助.这是链接: https://groups.google.com/forum/#! topic/Android-ndk/O-hufem20cu 我在使用Android NDK提供的本机音频示例中测试了它.您可以首先拍摄Android配置的界面,然后在创建音频播放器后将Stream -Voice设置为Stream_Voice. // Code for working with ear speaker by setting stream type to STREAM_VOICE SLAndroidConfigurationItf playerConfig; result = (*bqPlay
我想要使用原生Android NDK,并同时扮演多个声音.我已经查看了NDK中的本机音频示例,但没有能够弄清楚如何概括它,以便我可以同时播放不同的音频剪辑.我能够通过最后50个或如此搜索尝试在线找到在线的大多数例子似乎似乎依赖于诸如第三方图书馆的附加代码,以Java编写(我是搜索本机解决方案),否则似乎没有旨在立即处理多个声音. 如果它对如何接近的情况有任何差异,对于我想要播放的每种声音,我已经有一些原始的PCM数据(小endian)在内存中准备好播放,并且每个我都知道它的内存采样率,每个样本(8或16)的比特和通道数(1或2). 任何人可以提供的任何帮助都会得到很大的赞赏. 提前谢谢. 解决方案 您可以创建多个简单的缓冲区队列audiopleAlayers.您应该有一个机制来知道队列何时完成播放,以便您可以使用池中的免费池.您可以使用回调机制来执行此操作.原生音频示例涵盖此回调.
我使用opensl es新的Android本机音频,我需要你的帮助. 现在我想编写一个应用程序来实时录制和播放.在录制部分中,我们必须首先在创建音频记录器时配置音频源.像这样. SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE,SL_IODEVICE_AUDIOINPUT,SL_DEFAULTDEVICEID_AUDIOINPUT, NULL}; SLDataSource audioSrc = {&loc_dev, NULL}; sl_defaultdeviced_audioInput是默认麦克风的地址.我想在Android手机上使用其他麦克风(我使用有三个不同麦克风的Nexus 6),但我找不到其他MICS的地址. 欣赏任何反应! 解决方案 从 opensles.h 我们有一些类型的iodevice .. /** IODevice-types */ #define SL_IODEVIC