Ich bin ein Anfänger in der Android-Programmierung.
Ich schreibe eine Anwendung, um alle Videodateien in einem Ordner aufzulisten und Informationen aller Videos im Ordner anzuzeigen. Aber wenn ich versuche, die Videodauer zu erhalten, gibt sie null zurück und ich kann den Weg nicht finden, um sie zu erhalten.
Kann mir jemand helfen?
Unten ist mein Code:
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);
}
Antworten:
Verwenden Sie
MediaMetadataRetriever
diese Option , um medienspezifische Daten abzurufen: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()
quelle
Ich denke, der einfachste Weg ist:
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)) );
quelle
String.format()
Ich glaube nicht, dass Sie Ihre URI in der Mediastore-Videoabfrage veröffentlichen
Uri uri = Uri.parse("content://media/external/video/media/9"); Cursor cursor = MediaStore.Video.query(res, data.getData(), new String[]{MediaStore.Video.VideoColumns.DURATION});
quelle
Kotlin-Erweiterungslösung
Hier erfahren Sie, wie Sie die Dauer von Mediendateien in Kotlin abrufen können
fun File.getMediaDuration(context: Context): Long { if (!exists()) return 0 val retriever = MediaMetadataRetriever() retriever.setDataSource(context, Uri.parse(absolutePath)) val duration = retriever.extractMetadata(METADATA_KEY_DURATION) retriever.release() return duration.toLongOrNull() ?: 0 }
Wenn Sie es sicherer machen möchten (Uri.parse könnte eine Ausnahme auslösen), verwenden Sie diese Kombination. Die anderen sind im Allgemeinen auch nur nützlich :)
fun String?.asUri(): Uri? { try { return Uri.parse(this) } catch (e: Exception) { } return null } val File.uri get() = this.absolutePath.asUri() fun File.getMediaDuration(context: Context): Long { if (!exists()) return 0 val retriever = MediaMetadataRetriever() retriever.setDataSource(context, uri) val duration = retriever.extractMetadata(METADATA_KEY_DURATION) retriever.release() return duration.toLongOrNull() ?: 0 }
Hier nicht notwendig, aber generell hilfreiche zusätzliche Uri-Erweiterungen
val Uri?.exists get() = if (this == null) false else asFile().exists() fun Uri.asFile(): File = File(toString())
quelle
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; }
quelle
MediaPlayer mpl = MediaPlayer.create(this,R.raw.videoFile); int si = mpl.getDuration();
Dies gibt die Dauer der Videodatei an
quelle
MediaMetadataRetriever retriever = new MediaMetadataRetriever(); retriever.setDataSource(uriOfFile); long duration = Long.parseLong(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)) int width = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)); int height = Integer.valueOf(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)); retriever.release();
quelle