如何在AndroidX Media3中无需启动播放器获取MediaItem时长?
AndroidX Media3 无需启动播放器获取视频时长的方案
你可以通过解析Media3的MediaSource获取SeekMap来拿到视频时长,完全不需要启动完整的播放器实例,具体实现如下:
方法一:通过MediaSource解析获取SeekMap
先构建目标视频的
MediaItem:val mediaItem = MediaItem.fromUri(videoUri)创建
DefaultMediaSourceFactory并生成MediaSource:val mediaSourceFactory = DefaultMediaSourceFactory(context) val mediaSource = mediaSourceFactory.createMediaSource(mediaItem)异步解析媒体源获取时长:
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
相关产品推荐
相关产品推荐

