Home Menu

Menu



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


 
Herramientas
  #1  
Viejo 14/08/15, 09:14:20
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Saber duracion de audio .

Tengo un ListView que muestra unos clips de audio alojados en la sd y queria saber como se puede saber la duracion total de cada audio y mostrarla en un TextView...
Responder Con Cita


  #2  
Viejo 14/08/15, 09:41:34
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Una forma, a partir del API 10, es con el MediaMetadataRetriever extrayendo el metadato METADATA_KEY_DURATION

Otra es crear un MediaPlayer para ese fichero, sin llegar a reproducirlo, y ver qué devuelve el método getDuration().
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 14/08/15, 13:10:48
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Ok, gracias mocelet, le pegare un vistazo...
Responder Con Cita
  #4  
Viejo 02/05/16, 11:58:14
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Aprovechando el post, tengo un array con 50 sonidos, como puedo mostrar la duracion de los audios en un textview que tengo en un adapter?, solo me interesaria mostrar en segundos ya que los audios son muy cortos.
Responder Con Cita
  #5  
Viejo 02/05/16, 12:31:12
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Cita:
Originalmente Escrito por kaiser75 Ver Mensaje
Aprovechando el post, tengo un array con 50 sonidos, como puedo mostrar la duracion de los audios en un textview que tengo en un adapter?, solo me interesaria mostrar en segundos ya que los audios son muy cortos.
¿Cuál es la duda exactamente? Entiendo que si ya tienes el adapter y el textview también tendrás la referencia al sonido en cuestión (sabiendo la posición del array).

También supongo que habrás conseguido averiguar la duración de cada sonido con lo que vimos el año pasado.

Los métodos normalmente dan la duración en milisegundos, si quieres en segundos divide entre 1000 o usa el TimeUnit de Java que hace lo mismo: TimeUnit.MILLISECONDS.toSeconds(duracion);
Responder Con Cita
  #6  
Viejo 02/05/16, 16:33:18
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
La duda es que solo me muestra la duracion del primer sonido en todos los elementos del listview, tengo esta clase para obtener la duracion del audio:

Código:
public String conDuration(long duration) {
        String out = null;
        long hours = 0;
        try {
            hours = (duration / 3600000);
        } catch (Exception e) {
            e.printStackTrace();
            return out;
        }
        long remaining_seconds = (duration - (hours * 3600000));
        String seconds = String.valueOf(remaining_seconds);
        if (seconds.length() < 2) {
            seconds = "00";
        } else {
            seconds = seconds.substring(0, 2);
        }

        if (hours > 0) {
            out = "0" + ":" + seconds;
        } else {
            out = "0" + ":" + seconds;
        }
        return out;
    }
y para mostrar la duracion uso:
Código:
viewHolder.titulo2.setText(conDuration(Utils.sonidos[position]) + " sec");
Los sonidos estan en una clase externa llamada Utils, como los puedo llamar desde el adapter?
Responder Con Cita
  #7  
Viejo 02/05/16, 17:25:28
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Si en todos te muestra la duración del primer sonido pueden ser tres cosas:
a) que siempre estás cogiendo el valor del primer sonido (que en algún sitio pases 0 en vez de position)
b) que tienes guardado el mismo valor para todos los sonidos (por un error similar, que leas la duración del sonido 0 en vez del sonido en posición position)
c) que el método de nombre poco intuitivo conDuration devuelve lo mismo para todos los sonidos porque haga mal las operaciones

Tendrías que comprobar que el array de longs que tienes para guardar las duraciones esté bien almacenado.

Lo segundo, el método conDuration tiene pinta de estar mal, además de ser algo lioso. El remaining_seconds en realidad son milisegundos, y la comparación esa de seconds.length() < 2 para poner "00" y luego el substring, a saber qué sale de ahí.

EDIT: Si lo que quieres es que un número te salga siempre con dos dígitos incluso si tiene uno, usa las funciones de formateo de String, no reinventes la rueda: String.format("%02d sec", seconds). Es más, mejor que no andes creando veinte strings intermedias, calcula los valores de horas, minutos y segundos y al final del todo devuelves una única String con los valores en su sitio, por ejemplo return String.format("%02d:%02d", minutes, seconds); Menos propenso a errores y más fácil de probar.
EDIT2: ¿Y qué excepción quieres que salte al dividir por algo que no es cero? :S

Última edición por mocelet Día 02/05/16 a las 17:32:16
Responder Con Cita
Gracias de parte de:
  #8  
Viejo 02/05/16, 19:20:42
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Gracias mocelet , lo pruebo a ver que tal
Responder Con Cita
  #9  
Viejo 06/05/16, 19:16:01
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
Al final he conseguido mostrar correctamente las duraciones de los audios, como bien dijo mocelet he simplificado el tema y he mandado a paseo la clase anterior que puse, por si a alguien le interesa o le pueda servir esto es lo que hice:
Código:
Uri u = Uri.parse(Sonidos.get(position).toString());
                mp = MediaPlayer.create(getApplicationContext(),u);
                int dur = mp.getDuration();
                int hrs = (dur / 3600000);
                int mns = (dur / 60000) % 60000;
                int scs = dur % 60000 / 1000;
                String tiempo = String.format("%02d:%02d:%02d", hrs,  mns, scs);                
                tv2.setText(tiempo);
Responder Con Cita
  #10  
Viejo 06/05/16, 20:24:48
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Lo del módulo es buena idea, pero tienes erratas en las cuentas (los minutos están mal, los otros es un lío de cuentas). Con el TimeUnit es más elegante...

[PHP]
int millis = mp.getDuration();
long h = TimeUnit.MILLISECONDS.toHours(millis);
long m = TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
long s = TimeUnit.MILLISECONDS.toSeconds(millis) % 60;
[/PHP]

EDIT: Se me olvidaron los puntos y comas, me he acostumbrado rápido a Swift XD
EDIT2: Cambiado a long los tipos por si alguien quiere copiar el ejemplo

Última edición por mocelet Día 09/05/16 a las 12:19:58
Responder Con Cita
Gracias de parte de:
  #11  
Viejo 07/05/16, 13:09:20
Avatar de kaiser75
kaiser75 kaiser75 no está en línea
Miembro del foro
Mensajes: 493
 
Fecha de registro: ene 2011
Mensajes: 493
Modelo de smartphone: Vernee Mars, Galaxy S3
Tu operador: Orange
Mencionado: 3 comentarios
Tagged: 0 hilos
He probado el TimeUnit pero me marca fallo "Add cast to int". Tambien me da un pequeño problema con los audios, leyendo los archivos de la SD me muestra todo correcto (el ultimo codigo que puse arriba) pero leyendo desde la carpeta raw no, tengo un array en una clase externa que hace referencia a esos audios en la carpeta raw, pero me muestra las duraciones equivocadas, supongo que me equivoco referenciando los sonidos?

Este es el codigo que tengo en un Adaptador:
[php]
mp = MediaPlayer.create(getContext(), Utils.sonidos[position]);
int millis = mp.getDuration();
int h = (int) TimeUnit.MILLISECONDS.toHours(millis);
int m = (int) TimeUnit.MILLISECONDS.toMinutes(millis) % 60;
int s = (int) TimeUnit.MILLISECONDS.toSeconds(millis) % 60;

String tiempo = String.format("%02d:%02d", m, s);
viewHolder.titulo2.setText(tiempo + "s");
[/php]
Responder Con Cita
  #12  
Viejo 07/05/16, 21:07:15
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Sí, devuelven long, o haces el cast o las declaras como long. Estaba escrito sobre la marcha.

Sobre los tiempos, si te dan los que no son será lo que comentas, si hubiera algún error o pondría 0 o saltaría una excepción. Si son "equivocados" es que el array no está como debería.
Responder Con Cita
Respuesta

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


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 22:28:55 (GMT +2)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007