前言
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;
}
好烦哦,直接用就可以啦,啦~啦啦啦啦啦啦