Android es la forma más rápida de cargar y reproducir sonido en la aplicación
Estoy trabajando en un proyecto en el que tengo que cargar 6 sonidos diferentes en una actividad y reproducir todo el sonido en el botón de clic.El archivo de sonido no son tan grandes, pero el problema es que tal vez será más. Que es la forma más rápida de cargar archivos de sonido en una sola actividad. Para fines de prueba he utilizado res / raw carpeta para almacenar los archivos de sonido y probado con dos métodos diferentes para reproducir los archivos, pero el resultado no me satisfizo. Dos tipos diferentes de código:
Método 1:
- Soundpool reproduce sólo los primeros 5 segundos del archivo. ¿Por qué?
- El sonido no se reproduce en la versión de Android superior a 4,0
- ¿Cuál es la mejor manera de obtener una duración de archivo de audio en Android?
- Cómo reproducir sonidos en períodos de tiempo precisos entre dispositivos diferentes en Android
- Volumen de secuencia en SoundPool vs volumen en AudioManager
Button first = (Button) findViewById(R.id.one); Button second = (Button) findViewById(R.id.two); first.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumtwo); mp.start(); mp.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub mp.release(); } }); } }); second.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumone); mp.start(); mp.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub mp.release(); } }); } });
Método 2:
private SoundPool spool; private int soundID,soundID2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setVolumeControlStream(AudioManager.STREAM_MUSIC); spool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); soundID = spool.load(this, R.raw.drumone, 1); soundID2 = spool.load(this, R.raw.drumtwo, 1); Button three = (Button) findViewById(R.id.three); three.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Sound(); } }); } public void Sound(){ AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); float volume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); spool.play(soundID, volume, volume, 1, 0, 1f); };
Pero el problema es que los dos métodos son lentos .. Necesito encontrar una forma de una forma más rápida de reproducir los sonidos .. pero ahora hay como casi un segundo después de que haga clic en el botón para reproducir el sonido.
¿Puedes darme algún consejo sobre cómo reproducir el sounda más rápido. Debería cargarlos en una memoria caché cuando la aplicación se inicia o guardarlos en la base de datos o en otro lugar (no creo que la base de datos sea una buena opción, de hecho, pero Quiero escuchar algunas sugerencias). O tal vez cargarlos de la carpeta de activos, pero creo que todavía va a ser lento.
¿Alguna idea o sugerencia? ¡Gracias por adelantado!
- Android 2.2 - La muestra 0 de SoundPool no está LISTA
- ¿Por qué varias llamadas de Android SoundPool.unload devuelven true / false dependiendo del pedido?
- Android SoundPool.play () a veces se retrasa
- SoundPool "AudioFlinger no pudo crear pista, estado: -12"
- Sincronización de sonidos Android
- Reproducción de sonido de una frecuencia en android
- La muestra de Soundpool no está lista
- Error SoundPool: no hay más nombres de pista disponibles
Usted podría crear los reproductores multimedia en su onCreate
y luego los botones sólo les hará jugar. Eso sería la solución más fácil, diría yo.
Alternativamente, dependiendo de lo importante que sea para usted y la cantidad de trabajo que desea hacer, podría considerar el uso de JetPlayer:
Aquí está la página de desarrollo de android para los medios:
http://developer.android.com/guide/topics/media/index.html
La página de la clase JetPlayer:
http://developer.android.com/reference/android/media/JetPlayer.html
Y la página sobre la creación de los archivos JET:
http://developer.android.com/guide/topics/media/jet/jetcreator_manual.html
Si implementó esto probablemente funcionaría mejor, pero definitivamente sería el trabajo más.
JetPlayer básicamente le permite tener un archivo de audio (creo que es un archivo MIDI) con varias pistas que silenciar y unmute como le plazca. No tengo experiencia personal con él y acabo de leer algunos documentos, pero parece que sería muy útil para cualquier situación con más de un sonido.
Editar: Además, vale la pena mencionar esta lista de correo y en caso de que el vínculo siempre cambia esta búsqueda de google en caso de que alguien está interesado en temas de audio android.
Si desea tener el menor retraso debe utilizar OpenSL en c + +, De jelly bean es el reproductor de sonido más rápido
SoundPool está funcionando bien, puedes ver un ejemplo con el proyecto Hexiano . Sin embargo, debe precargar los sonidos en SoundPool, ya que tarda mucho tiempo en decodificar el archivo y almacenarlos en memoria antes de poder utilizarlos. Pero una vez que los sonidos se cargan, no hay demora notable entre la pulsación de teclas y la salida de sonido.