我想在 MediaPlayer 中播放数据时缓存数据。正如我所读到的,有一种方法可以做到 - 创建自己的本地 http 服务器并将本地 url 设置为 MediaPlayer 的 setDataSource(String path)。
我使用 NanoHTTPD 作为本地服务器。有服务功能的代码:
@覆盖 公共响应服务(字符串 uri、方法方法、地图标头、地图参数、地图文件) { 尝试 { //删除/字符 URL url = 新 URL(uri.substring(1)); URLConnection 连接 = url.openConnection(); 连接.连接(); 文件 cacheFolder = new File(Environment.getExternalStorageDirectory(), "TracksFlowCacheNew"); Log.e("RelayServer", "缓存到文件" + Utils.md5(url.toExternalForm())); RelayInputStream ris = new RelayInputStream(connection.getInputStream(), new FileOutputStream(new File(cacheFolder, Utils.md5(url.toExternalForm())))); 返回新响应(Response.Status.OK,NanoHTTPD.MIME_DEFAULT_BINARY,ris); } 捕获(错误的 URL 异常 e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } 捕获(FileNotFoundException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } 捕获(IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } 返回空值; }
RelayInputStream 扩展 InputStream。我正在尝试在那里缓存数据:
私有类 RelayInputStream 扩展 InputStream { 私有输入流 mInputStream = null; 私有输出流 mOutputStream = null; public RelayInputStream(InputStream is, OutputStream os) { mInputStream = 是; mOutputStream = 操作系统; } @覆盖 public int available() 抛出 IOException { Log.e("available", "available = " + mInputStream.available()); mInputStream.mark(mInputStream.available()); 返回 mInputStream.available(); } @覆盖 公共 int 读取(字节 [] 缓冲区)抛出 IOException { Log.e("读取", "buffer = " + buffer.toString()); mOutputStream.write(缓冲区); 返回 mInputStream.read(buffer); } @覆盖 public int read(byte[] buffer, int offset, int length) 抛出 IOException { Log.e("read", "buffer = " + buffer.toString() + "; offset = " + offset + "; length = " + length); mOutputStream.write(缓冲区,偏移量,长度); 返回 mInputStream.read(缓冲区,偏移量,长度); } @覆盖 public int read() 抛出 IOException { Log.e("读取", "无数据"); 字节[] b = 新字节[1]; mInputStream.read(b); mOutputStream.write(b); mInputStream.close(); mOutputStream.close(); 返回 b[0] & 0xff; } }
但是 RelayInputStream 的 available 只返回很少的下载字节。因此,只有一小部分数据被缓存并返回到媒体播放器。那么,我做错了什么?如何转发和缓存所有流?