首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓2.3.4,OpenSL ES和巨大的日志垃圾邮件,原因不明

安卓2.3.4,OpenSL ES和巨大的日志垃圾邮件,原因不明
EN

Stack Overflow用户
提问于 2013-06-06 03:59:17
回答 2查看 594关注 0票数 4

我创建的一个应用程序会在客户的设备上导致大量的日志垃圾邮件:

我在NDK环境中使用OpenSL进行实时音频生成。每次我使用SLAndroidSimpleBufferQueueItf的Enqueue()函数时,android都会创建一个日志条目,因为该调用隐式地调用音频接口上的play()。

这看起来像这样:

代码语言:javascript
运行
复制
........app start........
06-05 21:36:48.619: I/System.out(10081): Debugger has connected
06-05 21:36:48.619: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:48.819: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.419: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.619: I/System.out(10081): waiting for debugger to settle...
06-05 21:36:50.829: I/System.out(10081): debugger has settled (1491)
// ....some other unimportant logging stuff was here ....
06-05 21:36:53.359: D/execute(10081): Creating audio output OpenSLES
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating the engine
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Realizing engine
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): retrieving engine interface
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating output mix
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Realizing output mix
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Configuring audio source
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Configuring audio sink
06-05 21:36:53.369: D/AudioOutputOpenSLES(10081): Creating audio player
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): realizing the player
// Who is that? I assume Android itself....
06-05 21:36:53.379: D/AudioTrack(10081): Request AudioFlinger to create track
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): Retrieving play interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): get buffer queue interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): registering buffer queue callback
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): Retrieving effect send interface
06-05 21:36:53.379: D/AudioOutputOpenSLES(10081): getting volume interface
06-05 21:36:53.379: D/execute(10081): First process call...
06-05 21:36:53.379: D/execute(10081): Will start playback
06-05 21:36:53.379: D/play(10081): Starting playback
// And the show starts here: Every time I Enqueue audio data in my C++ code, this log entry appears.
06-05 21:36:53.379: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.389: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.409: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.609: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.629: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.679: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.739: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.759: D/AudioTrack(10081): start 0x1f7bf8
06-05 21:36:53.819: D/AudioTrack(10081): start 0x1f7bf8
....... and so on

这就是我如何将一个新的音频缓冲区排队到OpenSLES:

代码语言:javascript
运行
复制
bool SE::AudioOutputOpenSLES::enqueueBuffer( void* _buffer, unsigned int _byteSize )
{
    SLresult result = (*bqPlayerBufferQueue)->Enqueue(bqPlayerBufferQueue, _buffer, _byteSize );

    return( result == SL_RESULT_SUCCESS );
}

OpenSLES不会抱怨该调用,并返回SL_RESULT_SUCCESS。

我用谷歌搜索了一下,发现日志条目来自Android源AudioTrack,我在这里找到了它:

https://android.googlesource.com/platform/frameworks/base/+/android-2.2.3_r2.1/media/libmedia/AudioTrack.cpp

start()函数的开头是日志记录:

代码语言:javascript
运行
复制
LOGV("start %p", this);

但是,是什么让OpenSL在每次新缓冲区入队时都隐式调用play()?我在这里看了一下OpenSL的规范:http://www.khronos.org/registry/sles/specs/OpenSL_ES_Specification_1.0.1.pdf

在第174页,他们说“当播放器处于SL_PLAYSTATE_PLAYING状态时,增加缓冲区将隐含地启动播放。在由于队列中缓冲区不足而导致饥饿的情况下,音频数据停止播放。播放器保持在SL_PLAYSTATE_PLAYING状态。当额外的缓冲区排队时,音频数据恢复播放。请注意,排队的缓冲区不足会导致音频数据流出现可听间隙。在播放器不处于播放状态的情况下,添加缓冲区不会启动音频播放。”

由于手机没有爆裂,我假设音频仍然播放得很好,文档中的描述听起来就像他们总是隐含地开始播放,这实际上意味着我没有机会阻止这种日志垃圾邮件。

有什么想法吗?

EN

Stack Overflow用户

发布于 2013-09-03 15:13:05

我的意思是,这很依赖于Android,不同的Android版本,不同的制造商,不同的Android版本会有所不同。

我不确定为什么最终客户会为日志而烦恼,但我会在logcat中进行筛选以忽略它。简单的解决方案可能是最好的,特别是当垃圾邮件的来源是android :s

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16948749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档