ITmob-Ly
发布于 2024-05-12 / 245 阅读
0

Android 中怎样获取音频或视频文件的总播放时长?

mediahero.svg

本文我们介绍下 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 更复杂但在音视频播放时直接使用也很便捷。