如何使用Android MediaPlayer实现边下载边播放音频功能
Android MediaPlayer边下载边播放实现问题解答
1. MediaPlayer是否支持边下载边播放能力
原生MediaPlayer本身就支持基于HTTP/HTTPS协议的渐进式播放,你直接将音频的网络URL作为数据源传入,调用prepareAsync()做异步准备,播放器缓冲到足够播放的数据量后就会自动启动播放,不需要等待整个音频文件下载完成,这本身就实现了基础的边下载边播放效果。
唯一的问题是这种模式下的缓存数据由系统内部管理,存储在临时缓存目录,你无法直接拿到完整的本地文件做后续复用,下次播放同一音频还需要重新发起网络请求。
2. 你提出的切换数据源方案是否可行
这个方案从逻辑上可以跑通,但实际使用体验很差,存在几个明显的缺陷:
- 调用
reset()方法切换数据源时,当前正在播放的音频会直接中断,用户会感知到明显的播放断档 - 切换到本地文件数据源后,需要重新调用
prepareAsync()做准备,哪怕文件已经存在本地,也会出现短暂的播放空白期 - 如果用户在文件下载完成前快进到还未缓冲的位置,
MediaPlayer会直接抛出异常,导致播放失败
3. 更推荐的实现方案
如果你的核心需求是既要边下边播,又要把音频文件持久化到本地方便后续复用,可以选择以下两种更稳妥的方案:
- 实现本地HTTP代理:让
MediaPlayer向本地代理发起播放请求,代理层负责向远端服务器拉取音频数据,一边把数据回传给MediaPlayer供播放使用,一边把数据写入本地文件持久化。整个过程不需要切换数据源,用户完全无感知 - 自定义
MediaDataSource:重写readAt等方法,自己控制数据加载逻辑,边从网络下载数据,边给MediaPlayer喂数据,同时把下载到的数据持久化到本地存储
内容的提问来源于stack exchange,提问作者Maksym Tsikal
相关产品推荐
相关产品推荐

