【Android】NanoHttpd学习(二)视频播放(解决不能拖动)

前言

NanoHttpd官网没有视频播放的例子
得自己造轮子


一、不修改NanoHttpd代码的情况

可以播放
但进度条不能拖动!
而且下载是全部下载然后才放,这遇到大视频的话,非常不友善

二、所以……得加钱!

1.修改Response类

1.1 增加两个方法
	private int _offset = 0;
    public void setOffset( int offset )
    {
        _offset = offset;
    }

    public void setContentLength(long len)
    {
        this.contentLength = len;
    }

第一个是用来移动视频开始位置的,第二个是设置发送的长度

1.2 修改sendBody方法
	private void sendBody(OutputStream outputStream, long pending) throws IOException
    {
        long BUFFER_SIZE = 16 * 1024;
        byte[] buff = new byte[(int) BUFFER_SIZE];
        boolean sendEverything = pending == -1;

        this.data.skip(_offset);  //增加这一句

2.现在修改发送前端的行为

2.1 判断是视频文件

这个容易判断了吧,跳过

2.2 修改发送
	public static Response handle(IHTTPSession session, String mime, InputStream fis) throws IOException
    {
        int fileLength = fis.available();
        Response response = Response.newFixedLengthResponse(Status.OK, mime, fis, fileLength);

        String range = session.getHeaders().get("range");
        if (range != null && range.length() > 0)
        {
            range = range.trim();
            if(range.startsWith("bytes=")) range = range.substring(6);

            String[] arr = StringUtils.split(range, "-");//这个是分割函数,可以自己实现或者用String本身的split方法

            int skip = Integer.parseInt(arr[0].trim());
            int end = fileLength;
            if( arr.length > 1 )
            {
                String s = arr[1].trim();
                if( !s.isEmpty() )
                {
                    end = Integer.parseInt(s);
                }
            }
            int length = end - skip;
            response.setOffset(skip);
            response.setContentLength(length);

            response.addHeader("Accept-Ranges", "bytes");
            response.addHeader("Content-Length", "" + length);
            response.addHeader("Content-Range", "bytes " + skip + "-" + (end-1) + "/" + fileLength);
            response.setStatus(Status.PARTIAL_CONTENT);
        }
        else
        {
            int length = Math.min(fileLength, 1024*1024);
            response.setOffset(0);
            response.setContentLength(length);

            response.addHeader("Accept-Ranges", "bytes");
            response.addHeader("Content-Length", "" + length);
            response.addHeader("Content-Range", "bytes " + 0 + "-" + (length-1) + "/" + fileLength);
            response.setStatus(Status.PARTIAL_CONTENT);
        }
        return response;
    }

好烦哦,直接用就可以啦,啦~啦啦啦啦啦啦

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值