本文我们介绍下 Android 开发怎样获取音视频文件的时长信息。Android SDK 提供了多种方式来获取媒体文件的播放时长信息,如下时常用的三种获取音频、视频文件的播放时长的方法:
1. 使用 MediaMetadataRetriever
使用 MediaMetadataRetriever
类从音频、视频文件获取播放时长。获取的播放时长是以毫秒为单位的。
package cn.itmob.example
fun getMediaDuration(filePath: String): Long {
return try {
val retriever = MediaMetadataRetriever()
retriever.setDataSource(filePath)
val metaData = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
var duration = 0L
if (metaData != null) {
duration = metaData.toLong()
}
retriever.close()
duration
} catch (e: Exception) {
e.printStackTrace()
0
}
}
2. 使用 MediaPlayer
也可以使用 MediaPlayer
类来获取音频、视频的播放时长。
package cn.itmob.example
fun getMediaDuration(context: Context, filePath: String): Int {
return try {
val mediaPlayer = MediaPlayer.create(context, Uri.parse(filePath))
val duration = mediaPlayer.duration
mediaPlayer.release()
duration
} catch (e: Exception) {
0
}
}
3. 使用 MediaStore
也可以使用 MediaStore
获取视频文件的播放时长。但是 MediaStore
是 Android 系统维护的一个文件系统的数据库,它记录了存储上所有的文件索引,可以通过它,快速的查找当前系统的文件。但是创建或保存一个文件 MediaStore
并不会立即自动刷新,所以刚创建的文件可能查询不到。
package cn.itmob.example
fun getMediaDuration(context: Context, filePath: String): Long {
return try {
val cursor: Cursor? = context.contentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
arrayOf(MediaStore.Video.Media.DURATION),
MediaStore.MediaColumns.DATA + " in " + "(?)",
arrayOf(filePath),
null,
)
var duration: Long = 0
if (cursor != null && cursor.moveToFirst()) {
val durationColumnIndex = cursor.getColumnIndex(MediaStore.Video.Media.DURATION)
duration = cursor.getLong(durationColumnIndex)
cursor.close()
}
duration
} catch (e: Exception) {
0
}
}
总结
这三种方式都可以用来获取音频、视频文件的总播放时长,要使用哪种方法取决于具体的应用场景。
如果用于获取多个媒体文件的时长,更倾向于使用 MediaMetadataRetriever
它是一种轻量高效的方式,MediaPlayer 更复杂但在音视频播放时直接使用也很便捷。