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

使用Android MediaMuxer混流时如何展示进度及获取总文件大小

Android 远程音视频混流获取文件大小方案

结论

你无法通过 android.media.MediaExtractor 或 android.media.MediaMuxer 直接获取远程URL对应的文件总大小,需要自行发起网络请求读取响应头的Content-Length值。

原因说明

  • MediaMuxer的核心能力是将输入的音频、视频轨道数据封装为输出媒体文件,完全不涉及源文件的元数据读取,自然没有获取源文件大小的接口。
  • MediaExtractor虽然内部会自动拉取远程URL的媒体数据,但它的对外开放API仅提供媒体轨道、帧数据、时长这类媒体属性的读取能力,底层网络请求的总字节数、下载状态等信息都属于内部实现,不会对外暴露,你无法从这个类中拿到远程文件的总大小。

实现方案

你可以通过发起HEAD请求的方式获取文件大小,不会下载文件实体,仅拉取响应头,开销极低:

// 用OkHttp示例,也可以用系统自带的HttpURLConnection实现
fun getRemoteFileSize(url: String): Long {
    val request = Request.Builder()
        .url(url)
        .head() // 只请求头信息
        .build()
    OkHttpClient().newCall(request).execute().use { response ->
        if (response.isSuccessful) {
            return response.header("Content-Length")?.toLongOrNull() ?: -1
        }
        return -1
    }
}

如果目标服务器不支持HEAD请求,可以发起GET请求,设置Range: bytes=0-请求头,拿到Content-Length后直接终止请求即可。

备选方案

如果服务器返回分块传输(Transfer-Encoding: chunked)没有Content-Length字段,你可以换用时间维度统计进度:通过MediaExtractor.getTrackFormat(trackIndex)获取MediaFormat.KEY_DURATION拿到媒体总时长,再用当前已处理的帧对应的时间戳计算处理进度,不需要依赖文件大小。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:45:00