SoundPool: ошибка при создании AudioTrack - PullRequest
17 голосов
/ 07 марта 2012

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

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

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

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

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

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

Ответы [ 6 ]

16 голосов
/ 15 марта 2012

ОСНОВНОЕ РЕДАКТИРОВАНИЕ: НАЙДЕН СПОСОБ УСТАНОВИТЬ ДЕНЬ !! ПРОКРУТКА ВНИЗ НИЖЕ !!

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

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

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

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

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

Человек предоставил видео на Youtube, в котором говорится, что SoundPool работает нормально. Ссылка на видео приведена ниже. Я сделал то, что видео указало мне, чтобы кодировать, я взял тот же файл Explosion.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 работает (ссылка на видео, 2-я).

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

Источник:

  1. http://code.google.com/p/beginning-android-games/source/browse/trunk/ch04-android-basics/src/com/badlogic/androidgames/SoundPoolTest.java
  2. http://www.youtube.com/watch?v=ioGWpu8Ud7A

РЕДАКТИРОВАТЬ: я могу воспроизводить звуки из 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 голосов
/ 13 июня 2015

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

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

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

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

2 голосов
/ 16 июля 2012

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

1 голос
/ 06 апреля 2012

Я столкнулся с этой ошибкой слишком недавно.У меня было столкновение, которое происходило несколько раз в цикле, так что на самом деле он складывал звуки до тех пор, пока они не выпали, что приводило к ошибке, но продолжало играть.Я исправил это, зарегистрировав отскок как 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;}}

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

0 голосов
/ 01 июля 2015

Есть проблема с циклом: когда я устанавливаю повтор в -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);

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

0 голосов
/ 27 января 2014

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

Основная идея состоит в том, что SoundManager класс имеет SoundPool с небольшим объемом памяти (в отличие от MusicManager ),так что в «всех сообщениях» в logcat «нехватка памяти» видно.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...