SoundPool“AudioFlinger 无法创建音轨,状态:-12”

Posted

技术标签:

【中文标题】SoundPool“AudioFlinger 无法创建音轨,状态:-12”【英文标题】:SoundPool "AudioFlinger could not create track, status: -12" 【发布时间】:2017-03-25 14:45:33 【问题描述】:

我有一个带有单个按钮的 android 应用。单击按钮时,应用程序开始播放(循环)使用 SoundPool 加载的声音。再次单击按钮时,声音停止,然后再次开始。

但问题是声音只每隔一次播放一次。

第一次点击 -> 声音开始播放 第二次点击 -> 声音停止但不再响起 第三次点击 -> 声音开始播放 第四次点击 -> 声音停止但不开始播放 等等……

不播放声音时,logcat中出现此错误:

E/AudioTrack: AudioFlinger could not create track, status: -12
E/SoundPool: Error creating AudioTrack

当我删除循环(将 -1 更改为 0)时,一切正常!

我正在播放的声音是一个 MP3 文件,大小为 71.6 KiB。

我已经在运行 Android 4.1.2 的 Sony Xperia U 上对此进行了测试(不工作)。但在我的 Huawei Honor 6 (Android 6.0) 中一切正常,包括循环!

我做错了什么?


这是我的代码:

import android.media.AudioManager;
import android.media.SoundPool;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity 

    private int lastStreamId = 0;
    private int soundID;
    private SoundPool soundPool;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        soundID  = soundPool.load(this, R.raw.sound01, 1);


        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                soundPool.stop(lastStreamId);
                lastStreamId = soundPool.play(soundID, 1, 1, 1, -1, 1);
            
        );
    

编辑:

我不允许在这里上传原始声音,但这里有另一个声音可以做同样的事情。 除了现在声音只在第一次点击时播放;以下所有点击只是使其静音并吐出上述错误。

声音在这里:sound01.mp3

【问题讨论】:

你能发帖sound01吗? 编辑了问题:) 【参考方案1】:

如您所见here,错误代码12在Linux环境中代表Out of memory。显然,它们是关于 Jelly Bean(我想是棒棒糖前)设备上的内存分配的一些问题。

我已将您的原始文件从 177808kbps 降低到 32000kbps,它开始在棒棒糖之前的设备上按预期工作。

因此,您必须对棒棒糖前设备的音频文件进行下采样。最好有一个raw-v21 用于原始音频文件,并将下采样放入raw。因此,从 API 21 开始的设备将使用原始版本。

Here's 下采样文件。

【讨论】:

您知道文件大小是否有确切的限制,或者有任何其他相关文档吗? @TuomasK,不,还没有遇到过这样的事情。【参考方案2】:

我遇到了同样的问题。执行以下操作:

(1) 确保您的文件小于 1 MB

(2) 更重要的是在使用 SoundPool 实例释放内存空间后释放它们

soundPool.release();

【讨论】:

以上是关于SoundPool“AudioFlinger 无法创建音轨,状态:-12”的主要内容,如果未能解决你的问题,请参考以下文章

AudioTrack:AudioFlinger 无法创建轨道,状态:-32

LibGDX:AudioFlinger 无法创建轨道,状态 -12

有效地为 SoundPool 加载声音(全局 SoundPool?)

SoundPool 没有播放?

Android自助餐之SoundPool

使用 SoundPool 进行游戏