2016-04-19 7 views
2

Ich arbeite an einer App, wo der Benutzer alle Informationen und Titel des Videos, die auf einem Server gespeichert sind, sehen kann. Ich bin fast fertig damit, aber egal wie ich es code, kann ich die Videodauer von einer gegebenen URL nicht bekommen. Nehmen wir dieses Demo-Video von irgendwo im Internet: CLICK HERE FOR VIDEO PATH Ich möchte, dass die App die Videodauer erhält, ohne dass das Video selbst geöffnet werden muss.Videodauer von URL in Android-App erhalten

Der Code, den ich auf Android verwenden ist versucht, ist dies:

MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
    retriever.setDataSource("https://12-lvl3-pdl.vimeocdn.com/01/1386/0/6932347/10573836.mp4?expires=1461047937&token=037972137fdfc4c2d9902"); 
    String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    long timeInmillisec = Long.parseLong(time); 
    long duration = timeInmillisec/1000; 
    long hours = duration/3600; 
    long minutes = (duration - hours * 3600)/60; 
    long seconds = duration - (hours * 3600 + minutes * 60); 
    Toast.makeText(context,Long.toString(timeInmillisec),Toast.LENGTH_SHORT).show(); 

Aber das Ergebnis, das ich erhalte ein: java.lang.IllegalArgumentException in Zeile 2, die "Retriever sind. setDataSource() ". Kann mir jemand helfen, herauszufinden, was ich falsch mache, oder stellt Android eine andere Möglichkeit bereit, um die erforderlichen Informationen zu erhalten?

+0

haben Sie rufen '' setDataSource es auf Mainthread oder Netzwerk-Thread? – Kathi

Antwort

4

Vielleicht für die FFmpegMediaMetadataRetriever

FFmpegMediaMetadataRetriever Klasse suchen Sie bietet eine einheitliche Schnittstelle für den abruf Rahmen und Metadaten aus einer Eingabemediendatei.

von METADATA_KEY_DURATION Konstante von FFmpegMediaMetadataRetriever verwenden Sie die Dauer Ihres video.It die Zeichenfolge an Sie zurück erhalten können, dann können Sie es in LONG konvertieren Zeit zu bekommen.

Hier ist der Code, die Sie verwenden sollten:

FFmpegMediaMetadataRetriever mFFmpegMediaMetadataRetriever = new MediaMetadataRetriever(); 
mFFmpegMediaMetadataRetriever .setDataSource("Your video url"); 
String mVideoDuration = mFFmpegMediaMetadataRetriever .extractMetadata(FFmpegMediaMetadataRetriever .METADATA_KEY_DURATION); 
long mTimeInMilliseconds= Long.parseLong(mVideoDuration); 

wenn oben noch nicht dann

MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
if (Build.VERSION.SDK_INT >= 14) 
retriever.setDataSource("Your video url", new HashMap<String, String>()); 
else 
retriever.setDataSource("Your video url"); 

Von Ihrem Code verwenden, arbeiten.

Ich hoffe, es wird Ihnen helfen. Viel Glück.

+0

Nimm das nicht in die falsche Richtung, ....... LEMME GEBE IHNEN EINE UMARMUNG ...... Ich habe seit Tagen versucht, ein Ergebnis zu bekommen und habe java.lang.IllegalArgumentException bekommen. Sie hatten recht. FFmpegMediaMetadataRetriever bietet tatsächlich eine bessere Schnittstelle. Deine erste Lösung wirkt wie ein Zauber. vielen Dank –

1

Dies ist für mich arbeiten,

MediaMetadataRetriever retriever = new MediaMetadataRetriever(); 
    retriever.setDataSource("YourVideofileUrl", new HashMap<String, String>()); 
    String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION); 
    long timeInMillisec = Long.parseLong(time); 
    retriever.release(); 
    String duration=convertMillieToHMmSs(timeInMillisec); //use this duration 

und

public static String convertMillieToHMmSs(long millie) { 
    long seconds = (millie/1000); 
    long second = seconds % 60; 
    long minute = (seconds/60) % 60; 
    long hour = (seconds/(60 * 60)) % 24; 

    String result = ""; 
    if (hour > 0) { 
     return String.format("%02d:%02d:%02d", hour, minute, second); 
    } 
    else { 
     return String.format("%02d:%02d" , minute, second); 
    } 

}