2010-10-14 13 views
38

Sono un principiante nella programmazione Android.Come ottenere la durata di un file video?

Sono stato in grado di scrivere un'applicazione per elencare tutti i file video in una cartella e visualizzare le informazioni di tutti i video nella cartella. Ma quando cerco di ottenere la durata del video restituisce null e non riesco a trovare il modo di ottenerlo.

Qualcuno può aiutarmi?

Qui di seguito è il mio codice:

Uri uri = Uri.parse("content://media/external/video/media/9"); 
Cursor cursor = MediaStore.Video.query(res, data.getData(), new String[]{MediaStore.Video.VideoColumns.DURATION}); 
if(cursor.moveToFirst()) { 
    String duration = cursor.getString(0); 
    System.out.println("Duration: " + duration); 
} 
+1

tuo codice funziona per il mio Android 2.3. Forse stai usando 2.2 o sotto? –

risposta

1

Non penso di postare il vostro URI nella query di video MediaStore

Uri uri = Uri.parse("content://media/external/video/media/9"); 

Cursor cursor = MediaStore.Video.query(res, data.getData(), new String[]{MediaStore.Video.VideoColumns.DURATION}); 
+0

grazie mille – vuhung3990

1
public static long getDurationOfSound(Context context, Object soundFile) 
    { 
    int millis = 0; 
    MediaPlayer mp = new MediaPlayer(); 
    try 
    { 
     Class<? extends Object> currentArgClass = soundFile.getClass(); 
     if(currentArgClass == Integer.class) 
     { 
     AssetFileDescriptor afd = context.getResources().openRawResourceFd((Integer)soundFile); 
      mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); 
     afd.close(); 
     } 
     else if(currentArgClass == String.class) 
     { 
     mp.setDataSource((String)soundFile); 
     } 
     else if(currentArgClass == File.class) 
     { 
     mp.setDataSource(((File)soundFile).getAbsolutePath()); 
     } 
     mp.prepare(); 
     millis = mp.getDuration(); 
    } 
    catch(Exception e) 
    { 
    // Logger.e(e.toString()); 
    } 
    finally 
    { 
     mp.release(); 
     mp = null; 
    } 
    return millis; 
    } 
3

È necessario visitare this Ho avuto lo stesso problema come il tuo. Questa è una risposta precisa al tuo problema.

Si tratta di un'alternativa per Media Store o cursore da Media Metadata Retriever sperando che questo vi aiuterà.

+0

Benvenuto in Stack Overflow! Si prega di citare la parte più rilevante del link, nel caso in cui il sito target non sia raggiungibile o sia permanentemente offline. Vedi [Come scrivere una buona risposta] (http://stackoverflow.com/help/how-to-answer). – Gattsu

29

Penso che il modo più semplice è:

MediaPlayer mp = MediaPlayer.create(this, Uri.parse(uriOfFile)); 
int duration = mp.getDuration(); 
mp.release(); 
/*convert millis to appropriate time*/ 
return String.format("%d min, %d sec", 
     TimeUnit.MILLISECONDS.toMinutes(duration), 
     TimeUnit.MILLISECONDS.toSeconds(duration) - 
     TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)) 
    ); 
+4

Non è necessario creare un'istanza di MediaPlayer solo per ottenere la durata del supporto. È possibile ottenere tutti i metadati necessari utilizzando MediaMetadataRetriever. Vedi la mia risposta qui sotto per maggiori dettagli. –

56

Usa MediaMetadataRetriever per recuperare supporti di dati specifici:

MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
//use one of overloaded setDataSource() functions to set your data source 
retriever.setDataSource(context, Uri.fromFile(videoFile)); 
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
long timeInMillisec = Long.parseLong(time); 

retriever.release() 
+2

questa è la soluzione migliore (per API 10+) – auval

+2

Questa è una buona soluzione, ma il metodo extractMetadata restituisce "null" su alcuni dispositivi con Android 4.4 o inferiore. Ho usato la classe MediaPlayer per recuperare la durata del file ... – Massimo

+0

@Massimo Grazie per il tuo momento clou. La mia ipotesi è che MediaMetadataRetriever non è in grado di decodificare il file a seconda dei codec disponibili che a loro volta dipendono dal dispositivo stesso che porta a restituire un valore null. Mi aspetto lo stesso comportamento per l'approccio MediaPlayer, ma forse MediaPlayer è personalizzato meglio in base al dispositivo. Comunque è solo un pensiero. Ho avuto un'esperienza simile con l'approccio di MediaPlayer quando la risoluzione video era troppo alta per non decodificarla e cadere con null per lunghezza in entrambi i casi. –

1
MediaPlayer mpl = MediaPlayer.create(this,R.raw.videoFile); 
int si = mpl.getDuration(); 

Questo darà la durata del file video

+0

MediaPlayer.create è un metodo pesante, MediaMetadataRetriever suggerito da "vir us" sembra più adatto. – Hrk

Problemi correlati