Android 上 SoundPool 的奇怪错误
Posted
技术标签:
【中文标题】Android 上 SoundPool 的奇怪错误【英文标题】:Strange Error with SoundPool on Android 【发布时间】:2015-06-17 18:01:54 【问题描述】:我的 android 应用中的 SoundPool 出现问题。
在我使用 Soundpool 的 play() 方法中的参数之前,它一直在工作。我已将播放速率设置为 2f 并收到此警告:
06-17 19:53:13.359: W/AudioTrack(11526): AUDIO_OUTPUT_FLAG_FAST denied by client
再次将其设置回 1f 后,我现在遇到了这些错误:
06-17 19:53:13.359: W/AudioTrack(11526): AUDIO_OUTPUT_FLAG_FAST denied by client
06-17 19:53:13.359: E/AudioTrack(11526): AudioFlinger could not create track, status: -12
06-17 19:53:13.359: E/SoundPool(11526): Error creating AudioTrack
这一切都发生在我的带有 Android L 和 Eclipse 的三星 Note 4 上。 在我的三星 s3 上运行正常,但我没有通过 USB 安装应用程序,而速率仍设置为 2f。
这是所有必要的代码:
设置声音池
public void setUpSounds()
soundPool=new SoundPool(20,AudioManager.STREAM_MUSIC,0);
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener()
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,int status)
if(sampleId==beepID)
if(status==0)
beepLoaded=true;
else if(sampleId==buttonClickID)
if(status==0)
buttonClickLoaded=true;
else if(sampleId==menuEnterID)
if(status==0)
menuEnterLoaded=true;
else if(sampleId==menuExitID)
if(status==0)
menuExitLoaded=true;
);
buttonClickID=soundPool.load(this,R.raw.buttonclick, 0);
beepID=soundPool.load(this, R.raw.beep,0);
menuEnterID=soundPool.load(this, R.raw.menuenter,0);
menuExitID=soundPool.load(this, R.raw.menuexit,0);
播放声音:
/**
* play the menu exit sound
*/
public void playMenuExitSound()
if(soundFXOn&&mAct.menuExitLoaded)
mAct.soundPool.play(mAct.menuExitID, 0.2f, 0.2f, 0, 0, 1.0f);
/**
* play the menu entered sound
*/
public void playMenuEnterSound()
if(soundFXOn&&mAct.menuEnterLoaded)
mAct.soundPool.play(mAct.menuEnterID, 0.2f, 0.2f, 0, 0, 1.0f);
/**
* plays the button click sound
*/
public void playButtonClick()
if(soundFXOn&&mAct.buttonClickLoaded)
mAct.soundPool.play(mAct.buttonClickID, 1f, 1f, 0, 0, 1.0f);
线程内的哔声
if(mView.soundFXOn&&mView.mAct.beepLoaded)
mView.mAct.soundPool.play(mView.mAct.beepID, 0.05f, 0.05f, 0, 0, 1);
我只是看不出有什么问题,它一定是在我的 Note 内部,不会再播放声音了!
或者 Eclipse 中的某些东西完全出错了,所以它会发送错误的标志或类似的东西
【问题讨论】:
我现在已经在我的 S3 上尝试过了,它甚至可以在设置为 2.0f 的速率下运行!!! WTF???Note 不允许,但我的 2012 S3 允许?Th8is 是这里发生的一些乱七八糟的事情!!! 【参考方案1】:Android 拒绝该标志,然后由于从 SoundPool 中删除该标志而出现后续错误消息。初始错误是您应该密切注意的错误。
根据您运行软件的 Android 版本,错误消息可能是特定的或通用的(您的似乎是通用的)。但是您收到的错误通常是由于设备硬件和音池之间的采样率不匹配造成的。其他一些原因可能是: 影响决策的因素包括:
存在用于此输出的快速混合器线程(见下文) 跟踪采样率 存在用于执行此轨道的回调处理程序的客户端线程 跟踪缓冲区大小 可用的快速通道插槽(见下文)两种可能的解决方案: 首先尝试使用 AudioManager.getProperty(PROPERTY_OUTPUT_SAMPLE_RATE) 提供的采样率。否则,您的缓冲区会绕过系统重采样器。
或者尝试通过 Builder 设置 SoundPool 并手动设置所有属性,如下所示:
AudioAttributes attributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
.setUsage(AudioAttributes.USAGE_GAME)
.build();
pool = new SoundPool.Builder().setAudioAttributes(attributes).setMaxStreams(2).build()
;
这是我为解决同一问题而阅读的所有页面的杂记。
https://code.google.com/p/android/issues/detail?id=160879 AudioTrack: AUDIO_OUTPUT_FLAG_FAST denied by client due to mismatching sample rate https://code.google.com/p/android/issues/detail?id=58113
【讨论】:
#嘿,我将您的答案标记为正确的答案,但我刚刚重新启动了我的设备,它再次以 1.0f 的采样率工作,这很奇怪,即使在新安装的应用程序中它也能保持跟踪! !不幸的是,SoundPool.Builder 仅适用于 API 21+,因此我使用“已弃用” 但看在上帝的份上,它是三星 Note 4...为什么它在 S3 上正常工作,但 Note 4 说不,或者我应该谈论 KitKat vs Lollipop 我不知道!!!以上是关于Android 上 SoundPool 的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章
Android SoundPool:AudioFlinger 错误
SoundPool 加载缓慢,MotionEvent 很奇怪