You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AndroidX Media3中无需启动播放器获取MediaItem时长?

AndroidX Media3 无需启动播放器获取视频时长的方案

你可以通过解析Media3的MediaSource获取SeekMap来拿到视频时长,完全不需要启动完整的播放器实例,具体实现如下:

方法一:通过MediaSource解析获取SeekMap

  1. 先构建目标视频的MediaItem:

    val mediaItem = MediaItem.fromUri(videoUri)
    
  2. 创建DefaultMediaSourceFactory并生成MediaSource:

    val mediaSourceFactory = DefaultMediaSourceFactory(context)
    val mediaSource = mediaSourceFactory.createMediaSource(mediaItem)
    
  3. 异步解析媒体源获取时长:

    mediaSource.prepareSource(object : MediaSource.MediaSourceCallbacks {
        override fun onMediaSourceInfoRefreshed(mediaSource: MediaSource, mediaItem: MediaItem) {
            val timeline = mediaSource.timeline
            if (!timeline.isEmpty) {
                val window = Timeline.Window()
                timeline.getWindow(0, window)
                // 从Window直接拿时长(微秒),转毫秒除以1000即可
                val durationUs = window.durationUs
                // 或者通过SeekMap获取
                val seekMap = window.seekMap
                if (seekMap.isSeekable) {
                    val durationFromSeekMap = seekMap.durationUs
                }
                // 用完释放资源
                mediaSource.releaseSource(this)
            }
        }
    
        override fun onMediaSourceError(mediaSource: MediaSource, mediaItem: MediaItem, error: IOException) {
            // 处理解析失败的情况
            mediaSource.releaseSource(this)
        }
    })
    

方法二:使用Media3自带的MediaMetadataRetriever

如果你觉得上面的步骤繁琐,Media3提供了自家的MediaMetadataRetriever,不属于旧版Media API,用法更简洁:

val retriever = MediaMetadataRetriever()
try {
    retriever.setDataSource(context, videoUri)
    val durationMs = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLong()
} finally {
    retriever.release()
}

注意点

  • 两种方法均为非阻塞/异步逻辑,不要在主线程做同步等待
  • 解析完成后务必释放相关资源,避免内存泄漏
  • 网络媒体的解析速度依赖元数据加载进度,本地文件解析几乎瞬时完成

内容的提问来源于stack exchange,提问作者big_m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:57:28