2011-11-07 2 views
9

Come ottenere la durata della traccia mp3 senza creare l'istanza di MediaPlayer? Ho solo bisogno di mostrare la lunghezza mp3 canzone nella lista di file mp3, quindi penso che non dovrei creare l'oggetto MediaPlayer per ognuno dei brani della listaOttieni durata mp3 in android

E un altro:

volte MediaPlayer ritorna la durata sbagliata della canzone (Penso che sia così perché il bitrate di quei file è dinamico). Come posso ottenere la giusta durata della canzone?

risposta

6

È possibile utilizzare lo MediaMetadataRetriever per ottenere la durata di un brano. Utilizzare METADATA_KEY_DURATION in combinazione con la funzione extractMetadata().

+0

ringrazio molto, questa classe è molto utile, ma il suo lavoro da API di livello 10, Android 2.3.3 e superiori. Ho bisogno di più soluzioni universali ( – pleerock

+0

Hmmm, mi spiace, non so in nessun altro modo: –

+0

Questo non è molto utile poiché la maggior parte delle persone ha ancora Eclair o Froyo. Forse tra qualche anno .. – miq

1

Se si desidera supportare versioni precedenti di Android, è possibile utilizzare una libreria di terze parti. Ad esempio, http://www.jthink.net/jaudiotagger/ funziona correttamente, anche se è relativamente poco ingombrante per un'applicazione Android (poco meno di 1 MB).

I veri programmatori ovviamente analizzerebbero la durata dal file binario senza utilizzare alcuna libreria;) Non avevo abbastanza capacità per questo.

+0

'jaudiotagger' non è compatibile con Android –

+1

jaudiotagger è compatibile con Android.Ho provato. – miq

25
 // load data file 
     MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever(); 
     metaRetriever.setDataSource(filePath); 

String out = ""; 
     // get mp3 info 

     // convert duration to minute:seconds 
String duration = 
    metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    Log.v("time", duration); 
    long dur = Long.parseLong(duration); 
    String seconds = String.valueOf((dur % 60000)/1000); 

    Log.v("seconds", seconds); 
    String minutes = String.valueOf(dur/60000); 
    out = minutes + ":" + seconds; 
    if (seconds.length() == 1) { 
     txtTime.setText("0" + minutes + ":0" + seconds); 
    }else { 
     txtTime.setText("0" + minutes + ":" + seconds); 
    } 
    Log.v("minutes", minutes); 
     // close object 
     metaRetriever.release(); 
+0

fantastico! grazie :) Devo ammettere che sono sorpreso ci vuole così tanto codice ... –

+0

Non richiede tanto codice, praticamente tutto dopo aver chiamato per estrarreMetaData non è rilevante per la domanda. – IcedDante

0

ho trovato questo più accurata getLength with FFmpeg

int soundLength = (int) new SoxController(context, new File(""), shell).getLength(soundPath);