6


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

4

0 回答 0