我想在 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 只返回很少的下载字节。因此,只有一小部分数据被缓存并返回到媒体播放器。那么,我做错了什么?如何转发和缓存所有流?