android soundpool bitrate audacity

android - SoundPool: Error al crear AudioTrack



bitrate audacity (6)

En mi código tuve que reproducir unos 10 sonidos en paralelo (Drumkit-Simulation). Lo que hice fue poner cada sonido en un grupo de sonido propio y solía detener el mismo sonido ya reproducido, cuando se inició uno nuevo. Eso lo resolvió.

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

Que yo sepa, Soundpool descomprime los archivos de audio, para que pueda guardar el uso de la CPU con .wav. Creo que de esta manera, tal vez puedas superponer el mismo sonido varias veces.

Para cambiar los formatos de audio utilizo FormatFactory

Tengo un problema con SoundPool porque se niega a trabajar con mis archivos .ogg. Estoy recibiendo este error:

AudioFlinger no pudo crear pista, estado: -12
Error al crear AudioTrack

He encontrado un tema relacionado con esto y la answer (posible) es:

  • ¡Asegúrese de utilizar archivos de medios .ogg con una tasa de bits constante!

¿Es este el caso? (Alguien por favor confirme o cancele)
En caso afirmativo, qué aplicación utilizar (Audacity no admite la configuración de exportación personalizada .ogg).
Si no, ¿qué más podría estar mal?

Como nota al margen, antes de usar MediaPlayer, pero ahora quiero reproducir algunos sonidos en paralelo.


Hay un problema con el bucle: cuando configuro la repetición en -1 obtengo este error, pero con 0 todo funciona correctamente. He notado que algunos sonidos dan este error cuando intento reproducirlos uno por uno. Por ejemplo:

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

En tal caso, la primera pista se reproduce bien, pero cuando cambio los sonidos, la siguiente pista da este error. Parece que el uso de bucles, un búfer está sobrecargado de alguna manera, y mSoundPool.stop no puede liberar recursos inmediatamente.

Solución :

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

Y está funcionando, pero el retraso es diferente para diferentes dispositivos.


Me enfrenté a este error demasiado recientemente. El mío fue una colisión que en realidad tuvo lugar varias veces en un bucle, por lo que en realidad apilaría los sonidos hasta que abandonaran, lo que causó el error, pero seguiría reproduciéndose. Arreglé esto registrando un rebote como 1 cuando ocurre.

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

Dado que el juego se ejecuta a aproximadamente 60 fps, esto solo permite una instancia del sonido 3 veces por segundo y se puede ajustar fácilmente cambiando el 20. No solo esto redujo el jitter en el juego, sino que no se nota en lo más mínimo.

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

Espero que esto ayude a alguien.


Para mí, el estado -12 se debió a la especificación de demasiados canales al crear una instancia de SoundPool. Así que probablemente se estaba quedando sin memoria tratando de mantener demasiados canales alrededor.


Sigo esta respuesta: http://www.andengine.org/forums/gles2/sound-not-playing-t10820.html

La idea principal es que la clase SoundManager tiene un SoundPool con poca memoria permitida (en contraposición a MusicManager ), por lo que en "todos los mensajes" en logcat "fuera de la memoria" se puede ver.

Supongo que cada ".play ()" requiere cada sonido (no sé qué acerca de la música): asigna nuevo espacio de memoria en el grupo, y para evitar que pueda hacer lo siguiente:

- Use .play () solo una vez, luego .seekTo (0), luego .resume () (para jugar desde el principio)

- o use .play () solo una vez, luego .pause (), luego .resume () (para hacer bucles, por ejemplo)


EDICIÓN PRINCIPAL: ¡ENCONTRÓ UNA MANERA DE FIJAR SU DÍA! Desplácese hacia abajo por debajo!

Estoy en el mismo barco contigo. Antes de leer, debo informarle que no he podido proporcionar una respuesta que pueda solucionar este problema.

He visto muchos, muchos temas de desbordamiento de pila con respecto a SoundPool, pero no he visto muchos problemas de SoundPool con respecto a código Java en un libro de Android:

AudioTrack: AudioFlinger no pudo crear una pista, estado -12.
SoundPool: Error al crear AudioTrack.

Aquí está el código extraído del código fuente de Beginning Android 4 Game Development que se proporciona aquí (ver más abajo). Obtendrá el archivo explosion.ogg allí (en el tronco, busque la carpeta / asset del Capítulo 4 - Fundamentos de Android). Debe hacer clic en "Ver archivo sin procesar" a su derecha para obtener el archivo.

Todo lo que hice fue copiar el código fuente directamente en Eclipse y agregar el archivo explosion.ogg provisto desde el tronco, a mi proyecto. Ejecuté el emulador de Android, intenté reproducir el archivo y puedo decirle que todavía obtengo los mismos errores de Logcat citados anteriormente.

Una persona proporcionó un video en Youtube que indica que SoundPool funciona normalmente. El enlace del video se da a continuación. Hice lo que el video me indicó que codificara, agarré el mismo archivo explosion.ogg que obtuve del segundo enlace proporcionado anteriormente. Todavía tengo estos errores:

03-13 05: 17: 10.143: E / AudioTrack (3370): AudioFlinger no pudo crear una pista, estado: -12
03-13 05: 17: 10.143: E / SoundPool (3370): Error al crear AudioTrack

Sé que SoundPool existe desde Android 1.0, en el nivel de API 1. No debería haber ninguna razón para que SoundPool no funcione, incluso cuando tengo pruebas de que SoundPool funciona (el enlace del video, segundo).

Estos son mis hallazgos y pueden o no ayudar a otros de una buena manera. En resumen, no estás solo aquí.

Fuente:

  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

EDITAR: Soy capaz de reproducir sonidos de SoundPool.

Aquí está mi código:

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); } }

Lo que hice fue refactorizar mi código. Aprendí este consejo de uno de los comentarios en el enlace del video de Youtube, donde el autor del comentario lleva el nombre de "ErichLancaster". Todos los créditos van para él. Espero que esto te haya ayudado.

También configuro el tamaño de resolución del emulador de Android en QVGA, si realmente importa o no.