SoundPool: ошибка при создании AudioTrack - программирование
Подтвердить что ты не робот

SoundPool: ошибка при создании AudioTrack

У меня проблема с SoundPool, поскольку он отказывается работать с моими .ogg файлами. Я получаю эту ошибку:

AudioFlinger не смог создать трек, статус: -12
 Ошибка при создании AudioTrack

Я нашел поток, касающийся этого, и (возможно) ответ:

  • Убедитесь, что вы используете медиафайлы .ogg с постоянным битрейтом!

Это так? (кто-то пожалуйста, подтвердите или отмените)
Если да - какое приложение использовать (Audacity не поддерживает параметры пользовательского экспорта .ogg).
Если нет - что еще может быть неправильным?

В качестве побочного примечания - до того, как я использовал MediaPlayer, но теперь я хочу воспроизвести несколько параллельных звуков.

4b9b3361

Ответ 1

ОСНОВНАЯ РЕДАКТИЗАЦИЯ: НАЙДЕН ПУТЬ, ЧТОБЫ ЗАПРЕЩАЕТ ВАШ ДЕНЬ! SCROLL DOWN НИЖЕ!

Я нахожусь в одной лодке с тобой. Прежде чем читать, я должен сообщить вам, что я не смог дать ответ, который может решить эту проблему.

Я видел много, много вопросов в отношении SoundPool, но я не видел много проблем SoundPool с этим в отношении кода Java из книги Android:

AudioTrack: AudioFlinger не смог создать трек, статус -12.
SoundPool: Ошибка при создании AudioTrack.

Здесь код, который вырезал из Начального исходного кода Android 4, представленного здесь (см. ниже). Вы получаете файл explosion.ogg(в багажнике, найдите папку /asset в главе 4 - Основы Android). Чтобы получить файл, вам нужно щелкнуть "Просмотр необработанного файла" справа.

Все, что я делал, это то, что я скопировал исходный код непосредственно в Eclipse и добавил файл expl.ogg из сундука в свой проект. Я выполнил Android-эмулятор, попытался воспроизвести файл, и могу сказать, что у меня все еще есть те же ошибки Logcat, которые были указаны выше.

Человек предоставил видео на Youtube, в котором говорится, что SoundPool работает нормально. Видео ссылка приведена ниже. Я сделал то, что видео проинструктировал меня кодировать, я схватил тот же самый файл взрыва .ogg, который я получил из второй ссылки, приведенной выше. Я все еще получаю следующие ошибки:

03-13 05: 17: 10.143: E/AudioTrack (3370): AudioFlinger не смог создать трек, статус: -12
03-13 05: 17: 10.143: E/SoundPool (3370): Ошибка при создании AudioTrack

Я знаю, что SoundPool существует с Android 1.0 на уровне API 1. Не должно быть никаких причин, по которым SoundPool не сможет работать, даже если у меня есть доказательства того, что SoundPool работает (ссылка на видео, вторая).

Это мои выводы и могут или не могут помочь другим в хорошем смысле. Короче говоря, вы не одиноки здесь.

Источник:

EDIT: я могу воспроизводить звуки из SoundPool.

Здесь мой код:

package nttu.edu.test;

import nttu.edu.R;
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class SoundPoolTest extends Activity implements OnClickListener {
    SoundPool soundPool = null;
    int explosionId = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView v = new TextView(this);
        v.setOnClickListener(this);
        setContentView(v);
        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        v.setText("Click anywhere to play the sound.");
    }

    protected void onResume() {
        super.onResume();
        if (soundPool == null) {
            soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
            explosionId = soundPool.load(this, R.raw.explosion, 1);
        }
    }

    protected void onPause() {
        super.onPause();
        if (soundPool != null) {
            soundPool.release();
            soundPool = null;
        }
    }

    public void onClick(View v) {
        if (explosionId != 0)
            soundPool.play(explosionId, 1, 1, 0, 0, 1);
    }
}

То, что я сделал, это рефакторинг моего кода. Я узнал этот отзыв из одного из комментариев в видео-ссылке Youtube, где автор комментария идет по имени "ErichLancaster". Все кредиты идут к нему. Я надеялся, что это поможет вам.

Я также установил размер разрешения эмулятора Android в QVGA, если это действительно имеет значение или нет.

Ответ 2

Для меня статус -12 был вызван указанием слишком большого количества каналов при создании экземпляра SoundPool. Так что, вероятно, просто закончилась нехватка памяти, пытаясь сохранить слишком много каналов.

Ответ 3

Я слишком часто сталкивался с этой ошибкой. У меня было столкновение, которое происходило несколько раз в цикле, поэтому оно фактически складывало бы звуки, пока они не выпадут, что вызовет ошибку, но все равно продолжит играть. Я исправил это, зарегистрировав отскок как 1, когда это произойдет.

 // bouncecount=
 // 0=no bounce
 // 1=set when bounce occurs and plays the sound
 // 21=reset

Так как игра проходит со скоростью примерно 60 кадров в секунду, это позволяет только один экземпляр звука 3 раза в секунду, и его можно легко отрегулировать, изменив значение 20. Это не только уменьшило дрожание в игре, но и не пошло заметно.

if(bouncecount==1){
   sounds.play(sbump,1,1, 0, 0, 1);bouncecount++;}
else{if(bouncecount<20&&bouncecount!=0){bouncecount++;}
     else{bouncecount=0;}}

Надеюсь, это поможет кому-то.

Ответ 4

В моем коде мне пришлось играть около 10 звуков параллельно (Drumkit-Simulation). То, что я сделал, я помещаю каждый звук в собственный звуковой пул и использовал для остановки того же самого уже звучавшего звука, когда был запущен новый. Это решило.

        int newStreamID = soundPool.play(soundIDs.get(0), volume, volume, 1, 0, randomFloatRate);
        if (StreamID != null) {
            soundPool.stop(StreamID);
        }
        StreamID = newStreamID;

Насколько я знаю, Soundpool распаковывает звуковые файлы, поэтому вы можете сохранить CPU-использование с помощью .wav. Я думаю, что по этой причине вы, возможно, могли бы накладывать один и тот же звук несколько раз.

Для изменения аудиоформатов я использую FormatFactory

Ответ 5

Возникла проблема с циклом: когда я устанавливаю повтор -1, я получаю эту ошибку, но с 0 все работает правильно. Я заметил, что некоторые звуки дают эту ошибку, когда я пытаюсь воспроизвести их по одному. Например:

mSoundPool.stop(mStreamID);
mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f);

В этом случае первый трек воспроизводится нормально, но когда я переключаю звуки, следующая дорожка дает эту ошибку. Похоже, что использование цикла, буфера как-то перегружено, и mSoundPool.stop не может немедленно освободить ресурсы.

Решение

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
   @Override
   public void run() {
      mStreamID = mSoundPool.play(mRandID, mVolume, mVolume, 1, -1, 1f);
}, 350);

И он работает, но задержка отличается для разных устройств.

Ответ 6

Я следую этому ответу: http://www.andengine.org/forums/gles2/sound-not-playing-t10820.html

Основная идея заключается в том, что SoundManager имеет SoundPool с небольшой памятью (в отличие от MusicManager), поэтому в "всех сообщениях" в logcat "вне памяти" можно увидеть.

Я полагаю, каждый ".play()", вызываемый для каждого звука (не знаю, что относительно музыки) - выделяет новое пространство памяти в пуле, и чтобы избежать этого, вы можете сделать следующий:

- используйте .play() только один раз, затем .seekTo(0), затем .resume() (чтобы играть с самого начала)

- или используйте .play() только один раз, затем .pause(), затем .resume() (например, для цикла)