AudioFlinger не смог создать трек. Статус: -12

Я программирую для Android 2.2, и я пытаюсь использовать класс SoundPool для воспроизведения нескольких звуков одновременно, но при том, что кажется случайным, звук перестает выходить из динамиков.

Для каждого звука, который был бы воспроизведен, это печатается в логарифме:

AudioFlinger could not create track. status: -12 Error creating AudioTrack Audio track delete 

Никакое исключение не выбрасывается, и программа продолжает выполняться без каких-либо изменений, за исключением недостатка тома. Мне было очень трудно определить, какие условия вызывают ошибку или воссоздают ее после ее возникновения. Я не могу найти ошибку в документации в любом месте и в значительной степени не понимаю.

Любая помощь будет принята с благодарностью!

Edit: Я забыл упомянуть, что загружаю файлы mp3, а не ogg.

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

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

Одна вещь, которую я заметил: когда я загрузил цикл из -1, он потерпел неудачу с ошибкой «статус 12», но когда я загрузил его в цикл 0 раз, это будет успешным. Даже попытка загрузить 1 раз не удалась.

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

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

https://groups.google.com/forum/#!topic/android-platform/tyITQ09vV3s/discussion%5B1-25%5D

Для аудио есть жесткий предел из 32 активных объектов AudioTrack для каждого устройства (не для приложения: вам нужно разделить эти 32 с остальной частью системы), а AudioTrack используется внутри под SoundPool, ToneGenerator, MediaPlayer, собственный звук на основе OpenSL ES И т. Д. Но фактический предел AudioTrack составляет <32; Это зависит в большей степени от мягких факторов, таких как память, загрузка процессора и т. Д. Также обратите внимание, что ограничитель в аудиомикшерном устройстве Android в настоящее время не имеет сжатия динамического диапазона, поэтому можно закрепить, если у вас есть большое количество активных звуков, и они Все громко.

Для видеоплееров предел намного ниже из-за интенсивной нагрузки, которую видео ставит на устройство.

Я буду использовать это как возможность напомнить разработчикам средств массовой информации: не забудьте вызвать release () для медиа-объектов, когда ваше приложение приостановлено. Это освобождает основные ресурсы, которые потребуются другим приложениям. Не полагайтесь на объекты мультимедиа, очищаемые при завершении сборщиком мусора, поскольку это имеет непредсказуемое время.

John.k.doe прав. Вы должны уменьшить размер своего mp3-файла. Вы должны сохранить размер менее 100 кб за файл. Мне пришлось сократить 200kb-файл до 72kb с использованием постоянной скорости передачи данных (CBR) 32 кбит / с вместо обычных 128 Кбит / с. Это сработало для меня!

У меня была аналогичная проблема, когда музыкальный трекер в моей игре для Android записывал заметки, и я получил ошибку Audioflinger (хотя мой статус был -22). Я получил его работу, так что это может помочь некоторым людям.

Проблема возникла, когда один образец выводился несколько раз одновременно. Так что в моем случае это был единственный образец, который воспроизводится на двух или более дорожках. Казалось, что это иногда тупик или что-то еще, и одна из двух нот будет сброшена. Решение состояло в том, чтобы иметь две копии образца (два фактических файла ogg – идентичные, но оба в активах). Затем на каждом треке, хотя я играл один и тот же образец, он поступал из другого файла. Это полностью решило проблему для меня.

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

Я уверен, что это не поможет всем, и это не самое красивое решение, но это может помочь кому-то.

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

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

В моем случае снижение качества и, следовательно, размеры файлов в формате MP3 до уровня менее 100 КБ были недостаточными, так как некоторые файлы на 51 КБ работали, а некоторые более длинные файлы 41 КБ все еще не делали.

Что помогло нам снизить частоту дискретизации с 44100 до 22050 или сократить продолжительность до менее 5 секунд.

Пытаться

  final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 50); tg.startTone(ToneGenerator.TONE_PROP_BEEP, 200); tg.release(); 

Освобождение должно содержать ваши ресурсы.

У одного soundPool есть ограничение внутренней памяти 1 (один) Мб. Возможно, вы заметите это, если ваш звук очень высокого качества. Если у вас много звуков и они нажимают этот предел, просто создайте больше звуковых пультов и раздавайте свои звуки через них.

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

Эта ошибка появляется не только при достижении предела потока или дорожки, но и в пределе памяти. Soundpool перестанет воспроизводить старые и / или де-приоритетные звуки, чтобы воспроизводить новый звук.

Я был с этой проблемой. Чтобы решить эту проблему, я запускаю метод .release () объекта SoundPool после завершения воспроизведения звука.

Вот мой код:

 SoundPool pool = new SoundPool(10, AudioManager.STREAM_MUSIC, 50); final int teste = pool.load(this.ctx,this.soundS,1); pool.setOnLoadCompleteListener(new OnLoadCompleteListener(){ @Override public void onLoadComplete(SoundPool sound,int sampleId,int status){ pool.play(teste, 20,20, 1, 0, 1); new Thread(new Runnable(){ @Override public void run(){ try { Thread.sleep(2000); pool.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }); 

Обратите внимание, что в моем случае мои звуки имели длину 1-2 секунды, поэтому я ставлю значение 2000 miliseconds в Thread.sleep (), чтобы только освободить ресурсы после того, как игрок закончил.

Intereting Posts