使用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
相关产品推荐
相关产品推荐

