0

SoundPool にいくつかのトラックをロードし、いくつかの条件に基づいてそれらを切り替えようとしています。

最初のトラックでさえ再生が開始されず、次のエラーが表示されます。

10-23 22:11:07.240: E/AudioTrack(16803): AudioFlinger could not create track, status: -12
10-23 22:11:07.240: E/SoundPool(16803): Error creating AudioTrack

私はGoogleでいくつかの調査を行い、MP3ファイルをOGG形式で保存し、その期間を可能な限り短縮することに至りました. 各ファイルの長さは約 3 秒で、同じ SoundPool オブジェクトを使用して無限ループに入れました。Audacity を使用して OGG 形式でエクスポートしましたが、Audacity は ConstantBitRate をサポートしていません。これは、SoundPool について見つけたいくつかの記事/質問に従って使用することになっています。

これで 2 つのサウンド ファイルをロードできましたが、3 つ目のファイルを開始しようとすると、このエラーが再び発生します。

10-23 22:11:07.240: E/AudioTrack(16803): AudioFlinger could not create track, status: -12
10-23 22:11:07.240: E/SoundPool(16803): Error creating AudioTrack

3 つのファイルすべてを同時に再生するにはどうすればよいですか?

編集:アクティビティのコードは次のとおりです。

private SoundPool soundPool;
private AudioManager audioManager;
private float actVolume;
private float maxVolume;
private float volume;
private boolean mainPlaying;
private Integer clean = -1;
private Integer filter1 = -1;
private Integer filter2 = -1;
private Integer[] mainAudios = new Integer[] { clean, filter1, filter2 };
private int remaining;

// ...

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

    // /////////////////////////////// AUDIO
    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
    actVolume = (float) audioManager
            .getStreamVolume(AudioManager.STREAM_MUSIC);
    maxVolume = (float) audioManager
            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    volume = actVolume / maxVolume;
    setVolumeControlStream(AudioManager.STREAM_MUSIC);

    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {

        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId,
                int status) {
            remaining--;
            if (remaining == 0) {
                mainAudios = new Integer[] { clean, filter1, filter2 };
                for (int id : mainAudios)
                    soundPool.play(id, 0, 0, 1, -1, 1f);
                mainPlaying = true;
            }
        }
    });

    remaining = mainAudios.length;
    clean = soundPool.load(this, R.raw.angle_normal, 1);
    filter1 = soundPool.load(this, R.raw.filter2, 1);
    filter2 = soundPool.load(this, R.raw.filter5, 1);

    // //////////////////////////////////////////////////

    // ...

}
4

1 に答える 1

0

status: -12 は何らかのメモリ エラーです。3 つのサウンド ファイルがありますが、デバイスのメモリによってはメモリの制約があります。サウンド ファイルをそれぞれ 25kb かそれに近いサイズに圧縮します。小さなファイルを試してみてください。うまくいくはずです。非常に小さい独自のサウンド ファイルを使用しましたが、問題なく動作します。しかし、大きなファイルを入れると、ステータス-12エラーが発生しました。

ただし、コードをどのように構造化したかの例が必要な場合:

public class MainActivity extends Activity {

private AudioManager audioManager;
private float actVolume;
private float maxVolume;
private float volume;

SoundPool sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
    actVolume = (float) audioManager
            .getStreamVolume(AudioManager.STREAM_MUSIC);
    maxVolume = (float) audioManager
            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    volume = actVolume / maxVolume;
    setVolumeControlStream(AudioManager.STREAM_MUSIC);

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    sp.release();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

//put your own resources here
        int[] resources = {R.raw.whatsup, R.raw.monkey,
                R.raw.sneeze, R.raw.aww };
        sp = new SoundPool(resources.length, AudioManager.STREAM_MUSIC, 0);
        sp.setOnLoadCompleteListener(listener);

        for (int id : resources)
            sp.load(this, id, 1);

    }
OnLoadCompleteListener listener = new OnLoadCompleteListener() {
    String TAG = "main";

    @Override
public void onLoadComplete(SoundPool soundPool, int id, int status) {

            if (status == 0)
                switch (id) {
    //this switch is just to demo you can collect your variables here for each sound id thats loaded

            case 1:
                    Log.d(TAG, "sound id:"+ id +" loaded");
                    break;
                case 2:
                    Log.d(TAG, "sound id:"+ id +" loaded");
                    break;
            case 3:
                Log.d(TAG, "sound id:"+ id +" loaded");
                break;

            case 4:
                Log.d(TAG, "sound id:"+ id +" loaded");
                break;

            }
        Log.d(TAG, "playing:" + id);
        soundPool.play(id, volume, volume, 0, -1, 1f);

    }
};
}
于 2014-10-24T01:04:31.800 に答える