Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 11/02/14, 14:51:15
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Música de fondo?

Buenas.

Me gustaría poner algun tipo de melodia de fondo para un juego que estoy terminando pero ando bastante perdido en este tema.

Sabeis de alguna herramienta sencilla para sacar una melodía que ocupe poco? la idea luego es hacer un loop que se vaya repitiendo mientras siga la activity.

Un saludo.
Responder Con Cita


  #2  
Viejo 11/02/14, 21:14:29
Array

[xs_avatar]
jtsamper jtsamper no está en línea
Miembro del foro
 
Fecha de registro: abr 2013
Localización: Madrid
Mensajes: 149
Modelo de smartphone: Xperia Arc, Nexus 5
Tu operador: Movistar
Para esto que quieres te recomiendo, SoundPool http://developer.android.com/referen...SoundPool.html

Tu codigo seria algo asi
Código:
SoundPool sonidoBase = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
try{
AssetFileDescriptor afd = getAssets().openFd("base.mp3");
          Int  soundBaseGame = sonidoBase.load(afd, 0);
            afd.close();
} catch (IOException e) {
            e.printStackTrace();
        }
//PARA REPRODUCIRLO EN BUCLE ES
if(soundBaseGame!= -1){ // AQUI COMPRUEBA SI HA SIDO CARGADO BIEN
sonidoBase.play(soundBaseGame,0.5f, 0.5f, 1, -1, 1);
}
__________________
Controlador de Medicamentos 1.5 (https://play.google.com/store/apps/d...mentcontrolled)
Legislación Basica Española 1.1 (https://play.google.com/store/apps/d...islacionbasica)
Responder Con Cita
  #3  
Viejo 11/02/14, 21:53:51
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
El SoundPool es una mala solución para música MP3, sobre todo si son largos, lo mejor es usar MediaPlayer.

El SoundPool se usa para efectos de sonido, debido a su inmediatez al estar previamente cargados, mientras que para música es mucho mejor usar MediaPlayer.
Responder Con Cita
  #4  
Viejo 12/02/14, 10:11:50
Array

[xs_avatar]
jtsamper jtsamper no está en línea
Miembro del foro
 
Fecha de registro: abr 2013
Localización: Madrid
Mensajes: 149
Modelo de smartphone: Xperia Arc, Nexus 5
Tu operador: Movistar
Cierto, pero para un juego, con música de fondo, lo mas normal es usar SoundPool. porque la base suele ser breve pero repetitiva.

No obstante si te interesa MediaPlayer aqui tienes un manual de como cargarlo, y meterlo en bucle. http://www.plattysoft.com/2013/03/01...op-in-android

Ademas

SOUNDPOOL está diseñado para los clips cortos que se pueden mantener en la memoria descomprimido para un acceso rápido, este es el más adecuado para los efectos de sonido en aplicaciones o juegos.

MediaPlayer está diseñado para los más largos de archivos de sonido o arroyos, este es el más adecuado para los archivos de música o archivos de mayor tamaño. Los archivos se pueden cargar desde el disco cada vez que cree que se llama, esto le ahorrará espacio en la memoria, sino introducir un pequeño retraso (no es realmente notable).

Por lo tanto todo depende del tamaño, de archivo que vaya a usar de base.
__________________
Controlador de Medicamentos 1.5 (https://play.google.com/store/apps/d...mentcontrolled)
Legislación Basica Española 1.1 (https://play.google.com/store/apps/d...islacionbasica)

Última edición por jtsamper Día 12/02/14 a las 10:16:35.
Responder Con Cita
  #5  
Viejo 12/02/14, 12:05:38
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Buenas.

Al final lo que hice fue lo siguiente:
- Ir a la pagina www.jamendo.com que es una web de musica sin copyright y descargar un tema.
- A continuacion cortarlo a los 30 SEGUNDOS de tal forma que al repetirlo en bucle no se note apenas el corte (se nota pero muy poco).
- Bajar la calidad del mp3 para que me ocupe 200 Kb con un programa que me baja el bitrate.
- Implementar este codigo:

Código:
        int MAX_VOLUME = 100; //volumen máximo de referencia
	int soundVolume = 50; //volumen que queremos poner (la mitad del total de volumen) o  lo que queramos!!!

	float volume = (float) (1 - (Math.log(MAX_VOLUME - soundVolume) / Math.log(MAX_VOLUME))); 

En OnCreate: 

                musicafondo = MediaPlayer.create(this, R.raw.prueba53);				
		musicafondo.setLooping(true);
		musicafondo.setVolume(volume, volume);			
		new Timer().schedule(new TimerTask(){ 
			@Override
			public void run() {				
				musicafondo.start();		
			}			
		}, 1000);
Si quiero pausar el juego con un boton:

Código:
public void botonSonido (View v){
	    if(hasSound){
	    	hasSound = false;
	    	ImageViewSonido.setImageResource(R.drawable.boton_sonidoofffondo);
	    	musicafondo.pause();
	    }else{
	    	hasSound = true;
	    	ImageViewSonido.setImageResource(R.drawable.boton_sonidoonfondo);
	    	musicafondo.start();
	    }
	}
Como digo el mp3 tiene 30 segundos. Lo he probado y funciona bastante bien. Luego cuando quiero salir de la activity , antes del finish() llamo a musicadefondo.stop(); y listos.

Si hay algo mal comentadmelo gracias.

Última edición por manolazo Día 12/02/14 a las 12:08:46.
Responder Con Cita
  #6  
Viejo 28/02/14, 19:05:33
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Buenas..

Vaya putada. Resulta que quiero probar la aplicacion en el movil de mi sobrina (Samsung galaxy ace2 con version de android 2.3.3) y dentro del oncreate cuando pulso un boton para comenzar un nivel del juego me da un error NullPointerExcepcion en el MediaPlayer.create()

Lo raro es que con el avd de eclipse con la misma version de android 2.3.3 no salta ningun fallo y funciona perfectamente. Con el galaxy S3 mio de pruebas tampoco.

He estado mirando en stackoverflow y cada uno dice una cosa.
Este puede que se aproxime al problema :. http://stackoverflow.com/questions/1...e-returns-null pero yo uso mp3 y creo que no deberia de dar problemas.

Por que en avd funciona correcto y con termnal fisico no¿? Hasta que no venga la sobri no podre hacer pruebas.

ALguna sugerencia?

Un saludo.
Responder Con Cita
  #7  
Viejo 28/02/14, 22:05:56
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
¿Te da NullPointerException el Mediaplayer.create() o te devuelve Null como respuesta? Porque son cosas muy distintas.

Si es lo segundo, pueden ser 1000 cosas, lo más probable que el fichero sea muy grande y el Ace2 no tenga suficiente memoria para contenerlo y por eso devuelve Null. Si le estás pasando un Uri en vez de un Resource puede ser que la ruta no le llegue correctamente al Ace2.

Si es la primera, la cosa cambia, lo más probable es que cuando ejecutas el MediaPlayer.create() el Context que le estás pasando aún no esté inicializado.
Responder Con Cita
  #8  
Viejo 02/03/14, 01:33:33
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Buenas.

Me devuelve Null como respuesta y el caso es que no se como enfocarlo.

A grosso modo y resumiendo es una activity donde en onCreate():

Código:
public class ActivitySonidos extends Activity{
    protected void onCreate(Bundle savedInstanceState) {		
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.activitysonidos);		
		
		setUpSounds();
		
		botonclick = (Button)this.findViewById(R.id.buutonsoniduu);
		botonclick.setOnClickListener(new View.OnClickListener() {			
			@Override
			public void onClick(View arg0) {
				Intent i = new Intent(ActivitySonidos.this, ActivitySonidos.class);
				ActivitySonidos.this.startActivity(i);					
				ActivitySonidos.this.finish();
			}
		});
		
	}
//Conjunto de sonidos a usar en el juego
public void setUpSounds(){ 
		prueba1 = MediaPlayer.create(this, R.raw.prueba1);
                prueba1.start();
		prueba2 = MediaPlayer.create(this, R.raw.prueba2);
		prueba3 = MediaPlayer.create(this, R.raw.prueba3);
		prueba4 = MediaPlayer.create(this, R.raw.prueba4);
		prueba5 = MediaPlayer.create(this, R.raw.prueba5);
		prueba6 = MediaPlayer.create(this, R.raw.prueba6);
}
Cuando se inicia la activity por primera vez NO APARECE el error NullPointerExcepcion. Este aparece cuando se pulsa el botón que finaliza la actividad y abre la misma de nuevo en el prueba1 = MediaPlayer.create(this, R.raw.prueba1); prueba1.start();

Como digo este error no sale con galaxy s3 o xperia z1 sino con terminal tipo ace 2 o galaxy s con versiones 2.2 o 2.3.3 mas bien antiguos y me huelo que es algo relativo a la memoria de estos teléfonos pero no estoy seguro.

Posteriormente he hecho uso de la clase SoundPool tal y como comenta el forero jtsamper con este método:

Código:
public SoundPool crearSonido(int id){		
		SoundPool soundpool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
		
		try{				
			AssetFileDescriptor asset = getResources().openRawResourceFd(id);		
			sonido = soundpool.load(asset,0);			
		    asset.close();
		} catch (IOException e) {
		    e.printStackTrace();
		}
		if(sonido != -1){ // AQUI COMPRUEBA SI HA SIDO CARGADO BIEN
			return soundpool;			
		}
		return null;
	}
en OnCreate() hago sonar el archivo:

crearSonido(R.raw.prueba1).play(sonido,0.5f, 0.5f, 1, 0, 1);

pero cuando pulso el boton click para cerrar la actividad y abrirla de nuevo resulta que no se escucha el sonido dando un error en soundpool de sample not ready!!!

Leyendo en stackoverflow hay que hacer uso de un listener pero ni por esas se escucha en estos terminales mas antiguos:

Código:
crearSonido(R.raw.prueba1).setOnLoadCompleteListener(new OnLoadCompleteListener(){
			@Override
			public void onLoadComplete(SoundPool soundPool, int sampleId,
					int status) {
				crearSonido(R.raw.prueba1).play(sonido,0.5f, 0.5f, 1, 0, 1);				
			}			
		});
Alguna sugerencia sobre como enfocar esto?
Por que no suena con soundpool en un galaxy s y si suena en un s3?
Un saludo.

Última edición por manolazo Día 02/03/14 a las 01:56:17.
Responder Con Cita
  #9  
Viejo 02/03/14, 08:57:01
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Tiene toda la pinta de que no se libera correctamente la memoria al cerrar la Activity, y lo que es peor, tampoco ha liberado el acceso al fichero, por eso devuelve Null. Al menos es lo que parece.

En el onDestroy de la Activity llama a "release()" sobre todos los objetos MediaPlayer, de esa forma debería liberarse la memoria y los accesos al fichero y en el siguiente onCreate debería funcionar bien.
Responder Con Cita
  #10  
Viejo 02/03/14, 11:14:28
Array

[xs_avatar]
jtsamper jtsamper no está en línea
Miembro del foro
 
Fecha de registro: abr 2013
Localización: Madrid
Mensajes: 149
Modelo de smartphone: Xperia Arc, Nexus 5
Tu operador: Movistar
En vez de meterlo en el onCreate metelo en onResume.

Este es llamado si o si, es decir, si se crea por primera vez la activity como si se vuelve a acceder a ella.


No obstante te dejo un pequeño script de como lo haria yo.

Meteria los sonidos en asserts y no en raw.

En onResume meteria reloadSound();


[php]SoundPool sp;

int soundBaseGame;

//recargamos los sonidos, para tenerlos preparados.

private void reloadSound() {
spBase = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
try {
AssetFileDescriptor afd = getAssets().openFd("ColorDisk/base.mp3");
soundBaseGame = spBase.load(afd, 0);
afd.close();

} catch (IOException e) {
e.printStackTrace();
}
}
//y para escucharlo
private void playSound(){
if(soundBaseGame!= -1){
spBase.play(soundBaseGame,0.5f,0.5f,1,0,1);
}
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if(spBase!=null){
spBase.release();
}


}

[/php]

De esta forma liberas memoria cuando no esta en uso, y la recargaras de nuevo cuando sea necesaria.
__________________
Controlador de Medicamentos 1.5 (https://play.google.com/store/apps/d...mentcontrolled)
Legislación Basica Española 1.1 (https://play.google.com/store/apps/d...islacionbasica)
Responder Con Cita
  #11  
Viejo 02/03/14, 14:35:21
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
A ver si me dejan esta tarde estos moviles y lo pruebo con los dos metodos , mediaplayer y soundpool. Un saludo
Responder Con Cita
  #12  
Viejo 02/03/14, 15:41:57
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Como cargues un fichero MP3 muy grande con SoundPool en un móvil pequeño vas a ver la risa que le va a dar...

Cada cosa es para lo que es, SoundPool para efectos de sonido, MediaPlayer para música. ¿Funciona al revés? Si, pero no es lo recomendable en ninguno de los 2 casos.
Responder Con Cita
  #13  
Viejo 02/03/14, 17:24:08
Array

[xs_avatar]
jtsamper jtsamper no está en línea
Miembro del foro
 
Fecha de registro: abr 2013
Localización: Madrid
Mensajes: 149
Modelo de smartphone: Xperia Arc, Nexus 5
Tu operador: Movistar
Yo uso SoundPool porque dime tu que un archivo de 74kb es necesario usar MediaPlayer??
Todo depende del tamaño del archivo a reproducir, para archivos grandes por muy poco que duren usaría MediaPlayer.
__________________
Controlador de Medicamentos 1.5 (https://play.google.com/store/apps/d...mentcontrolled)
Legislación Basica Española 1.1 (https://play.google.com/store/apps/d...islacionbasica)
Responder Con Cita
  #14  
Viejo 02/03/14, 17:56:04
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Buenas ya lo he probado y efectivamente, en el onDestroy() liberando con release() todos los mediaplayer creados se libera la memoria y ya funciona (al menos en un galaxy ace2) supongo que en terminales de menos memoria funcionara también.
De momento lo hare con MediaPlayer y mas adelante hare uso de soundpool que ya se como va para archivos mas pequeños.

Es recomendable entonces poner la creacion de los mediaplayer en onResume() en vez de onCreate() ?

Un saludo y gracias.
Responder Con Cita
  #15  
Viejo 02/03/14, 19:08:09
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
No, no es recomendable poner la creación en el onResume, porque por eso el onCreate se llama onCreate.

Y en el caso de que lo pongas en el onResume tendrías que hacer la liberación en el onPause, lo que significa que si tu aplicación abre otra Activity, aunque sólo sea para mostrar cualquier chorrada, al abrir esa Activity liberaría los MediaPlayer, y al pulsar atrás los volvería a crear, cosa totalmente innecesaria.
Responder Con Cita
  #16  
Viejo 02/03/14, 19:09:00
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Se ha duplicado.
Responder Con Cita
  #17  
Viejo 03/03/14, 00:33:48
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Hola de nuevo.

Hay algún problema en usar MediaPlayer con archivos pequeños tales como sonidos de clicks?
He estado haciendo pruebas y no veo problemas salvo que salen warnigs con info (1, 44) en los mediaplayer create de todos los sonidos. He mirado en stackoverflow y dicen que no es preocupante.

Lo digo porque no tendria inconveniente en usar SoundPool ya que funcina perfectamente con versiones altas de android pero en un galaxy S con 2.2 no suena nada.
He probado metiendo los sonidos en assets AssetFileDescriptor afd = getAssets().openFd("ColorDisk/base.mp3"); o en raws como hice antes pero no hay manera....
en 2.2 no suena.. y en 4.2 si. y por lo que decis lo suyo seria usar soundpool para sonidos pequeños y mediaplayer para mas grandes.

Alguna solucion? si no la hay pasa algo por usar mediaplayer con sonidos tipo click de boton?

Un saludo.
Responder Con Cita
  #18  
Viejo 03/03/14, 12:16:21
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
No pasa nada por usar MediaPlayer para sonidos, el problema es la inmediatez.

Con MediaPlayer cuando le das a start() lo que hace es coger el fichero, abrirlo e ir descomprimiéndolo "on the fly" mientras lo reproduce. Con SoundPool cuando cargas el fichero hace todo ese proceso y ya lo deja listo en memoria para que cuando hagas play() suene al instante.

Así que volviendo a lo de antes, el problema es como de inmediato quieres que sea el fichero, para música de fondo da igual que empiece a sonar 0.5 segundos después de darle a que comience, y por eso da igual usar MediaPlayer. En cambio si estás haciendo un juego, chocas y el sonido del choque suena 0.5 segundos después del choque se nota.
Responder Con Cita
  #19  
Viejo 03/03/14, 18:23:17
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 219
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Vale, como no se nota apenas diferencia lo dejo asi.

Gracias!! Un saludo.
Responder Con Cita


Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 19:20:46 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /