SoundPool AudioFlinger не может создать трек, статус: -12

У меня есть приложение для Android с одной кнопкой. При нажатии кнопки приложение начинает воспроизводить (зацикливать) звук, загруженный с помощью SoundPool. При повторном нажатии кнопки звук прекращается, а затем снова включается.

Но проблема в том, что звук воспроизводится только через раз.

  • Нажмите 1 раз -> начинает воспроизводиться звук
  • Нажмите второй раз -> звук прекращается, но не запускается снова
  • Нажмите 3-й раз -> начинает играть звук
  • Нажмите 4-й раз -> звук останавливается, но не воспроизводится
  • и так далее...

Когда звук не воспроизводится, в logcat появляется эта ошибка:

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

Когда я убираю зацикливание (меняю -1 на 0), все работает полностью правильно!

Звук, который я проигрываю, представляет собой MP3-файл размером 71,6 Кбайт.

Я тестировал это на Sony Xperia U под управлением Android 4.1.2 (не работает). Но в моем 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


person TuomasK    schedule 25.03.2017    source источник
comment
Вы можете опубликовать sound01?   -  person azizbekian    schedule 28.03.2017
comment
Отредактировал вопрос :)   -  person TuomasK    schedule 28.03.2017


Ответы (2)


Как вы можете видеть здесь, код ошибки 12 означает Out of memory в среде Linux. По-видимому, это некоторые проблемы, связанные с распределением памяти на устройствах Jelly Bean (я полагаю, для pre-lollipop) устройств.

Я уменьшил размер вашего исходного файла с 177808 кбит / с до 32000 кбит / с, и он начал работать, как и ожидалось, на устройствах, предшествующих Lollipop.

Итак, вам нужно уменьшить разрешение вашего аудиофайла для устройств, предшествующих Lollipop. Лучше иметь raw-v21 для исходных аудиофайлов и помещать субдискретизированные в raw. Таким образом, устройства, начиная с API 21, будут использовать исходную версию.

введите описание изображения здесь

Вот файл с пониженной дискретизацией.

person azizbekian    schedule 28.03.2017
comment
Вы знаете, есть ли точное ограничение на размер файла или что-нибудь еще по этому поводу? - person TuomasK; 29.03.2017
comment
@TuomasK, нет, ничего подобного не встречал. - person azizbekian; 29.03.2017

Я была такая же проблема. Сделайте следующее:

(1) убедитесь, что размер ваших файлов меньше 1 МБ

(2) что более важно, освободите экземпляры SoundPool после их использования для освобождения места в памяти.

soundPool.release();
person Chris8447    schedule 16.03.2019