java实现断点续播_javaweb 播放视频通过断点续传拖动滚动条
转载自:javaweb 播放视频通过断点续传拖动滚动条
java播放视频如果需要后台处理,并不是请求xxx.mp4.当需要拖动进度条的时候部分浏览器是不行的,这里就需要断点续传。
直接上代码,通过video的src请求
/**
* video请求位置
* @param request
* @param response
*/
@RequestMapping(value = "/player", method = RequestMethod.GET)
public void player2(HttpServletRequest request, HttpServletResponse response) {
String path = request.getServletContext().getRealPath("/static/my/video/interview.mp4");
BufferedInputStream bis = null;
try {
File file = new File(path);
if (file.exists()) {
long p = 0L;
long toLength = 0L;
long contentLength = 0L;
int rangeSwitch = 0; // 0,从头开始的全文下载;1,从某字节开始的下载(bytes=27000-);2,从某字节开始到某字节结束的下载(bytes=27000-39000)
long fileLength;
String rangBytes = "";
fileLength = file.length();
// get file content
InputStream ins = new FileInputStream(file);
bis = new BufferedInputStream(ins);
// tell the client to allow accept-ranges
response.reset();
response.setHeader("Accept-Ranges", "bytes");
// client requests a file block download start byte
String range = request.getHeader("Range");
if (range != null && range.trim().length() > 0 && !"null".equals(range)) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);
rangBytes = range.replaceAll("bytes=", "");
if (rangBytes.endsWith("-")) { // bytes=270000-
rangeSwitch = 1;
p = Long.parseLong(rangBytes.substring(0, rangBytes.indexOf("-")));
contentLength = fileLength - p; // 客户端请求的是270000之后的字节(包括bytes下标索引为270000的字节)
} else { // bytes=270000-320000
rangeSwitch = 2;
String temp1 = rangBytes.substring(0, rangBytes.indexOf("-"));
String temp2 = rangBytes.substring(rangBytes.indexOf("-") + 1, rangBytes.length());
p = Long.parseLong(temp1);
toLength = Long.parseLong(temp2);
contentLength = toLength - p + 1; // 客户端请求的是 270000-320000 之间的字节
}
} else {
contentLength = fileLength;
}
// 如果设设置了Content-Length,则客户端会自动进行多线程下载。如果不希望支持多线程,则不要设置这个参数。
// Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
response.setHeader("Content-Length", new Long(contentLength).toString());
// 断点开始
// 响应的格式是:
// Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
if (rangeSwitch == 1) {
String contentRange = new StringBuffer("bytes ").append(new Long(p).toString()).append("-")
.append(new Long(fileLength - 1).toString()).append("/")
.append(new Long(fileLength).toString()).toString();
response.setHeader("Content-Range", contentRange);
bis.skip(p);
} else if (rangeSwitch == 2) {
String contentRange = range.replace("=", " ") + "/" + new Long(fileLength).toString();
response.setHeader("Content-Range", contentRange);
bis.skip(p);
} else {
String contentRange = new StringBuffer("bytes ").append("0-").append(fileLength - 1).append("/")
.append(fileLength).toString();
response.setHeader("Content-Range", contentRange);
}
String fileName = file.getName();
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
int n = 0;
long readLength = 0;
int bsize = 1024;
byte[] bytes = new byte[bsize];
if (rangeSwitch == 2) {
// 针对 bytes=27000-39000 的请求,从27000开始写数据
while (readLength <= contentLength - bsize) {
n = bis.read(bytes);
readLength += n;
out.write(bytes, 0, n);
}
if (readLength <= contentLength) {
n = bis.read(bytes, 0, (int) (contentLength - readLength));
out.write(bytes, 0, n);
}
} else {
while ((n = bis.read(bytes)) != -1) {
out.write(bytes, 0, n);
}
}
out.flush();
out.close();
bis.close();
}
} catch (IOException ie) {
// 忽略 ClientAbortException 之类的异常
} catch (Exception e) {
e.printStackTrace();
}
}
在前端页面上的访问方式:
java实现断点续播_javaweb 播放视频通过断点续传拖动滚动条相关推荐
- 应对突发事件PPStream断点续播
如果遇到断网停电等突发事件时不得不中断视频观看,令人烦恼的是,下次再度欣赏该节目时, 要么是重新开始看,要么是拖动进度条至上次中断的地方.好在PPStream为我们提供了断点续播功能, 使我们能重新启 ...
- java与js交互视频_Android与H5交互—Java调用Js、Js调Java、H5页面调用Android播放视频...
content="ANZO,GAME,LOL,DNF,DOTA,撸啊撸,地下城与勇士,掌游宝,攻略,宝典,模拟器,加点,战报,英雄,最新,最全,最强,视频"> content ...
- java基于ssm开发的电视剧播放视频系统页面很漂亮哦
简介 ssm开发的视频网站.本项目主要包括了视频展示和查询功能,用户中心,积分管理,管理员管理等功能. 演示视频 https://www.bilibili.com/video/BV1tT4y1N7t8 ...
- java ftp分片续传_Java写的支持断点续传的FTP
Java写的支持断点续传的FTP 很不错的值得研究一下,结构比较清楚. 基类一: package ming.ftpsearch; public class FileInfo { public Stri ...
- java oss 断点上传文件_java实现oss断点续传
bucketName ---oss上bucket的名字 key ---文件所在的文件夹加文件名 例如:我想把ceshi.txt 存放在bucket叫aa的里面叫bb的文件夹下.那么我的bucketNa ...
- html5视频播放器代码实例(含倍速、清晰度切换、续播)
本文将对视频播放相关的功能进行说明(基于云平台),包括初始化播放器.播放器尺寸设置.视频切换.倍速切换.视频预览.自定义视频播放的开始/结束时间.禁止拖拽进度.播放器皮肤.控件按钮以及播放控制等. ...
- Android视频编辑器(一)通过OpenGL预览、录制视频以及断点续录等
前言 如今的视频类app可谓是如日中天,火的不行.比如美拍.快手.VUE.火山小视频.抖音小视频等等.而这类视频的最基础和核心的功能就是视频录制和视频编辑功能.包括了手机视频录制.美白.加滤镜.加水印 ...
- 播放视频和音频文件java
import javazoom.jl.player.Player; import org.junit.jupiter.api.Test; import java.io.BufferedInputStr ...
- java jmf播放视频_使用JMF实现java视频播放器
JMF这个多媒体开发框架太牛了,简单的几句代码就能实现一个视频播放器的开发,厉害,就是支持的格式少了一些,没关系,这个视频播放器可以播放mpg,avi,fvl等等,想播放其他的请开发自己的插件,下面将 ...
- java简单实现在线资源多线程下载,断点续存,限制最大正在下载数
为什么要使用多线程下载,断点续存,限制最大正在下载数 多线程下载已经提高了下载的效率,但是当一些特殊情况发生的时候,我们需要对程序进行处理,这样效率会更高.比如,断电断网等造成下载中断,那么我们下一次 ...
最新文章
- 用户数年增长 300%,BitMax如何把握数字资产时代机遇?
- hdu4291 暴力循环节+矩阵快速幂
- ubuntu如何实现双屏显示(转)
- 关于windows注册表重定向和虚拟化分析
- 做一个java项目要经过那些正规的步骤
- SAP ABAP实用技巧介绍系列之 ABAP XSLT select keyword
- 两阶段3D目标检测网络 SIENet: Spatial Information Enhancement Network for 3D Object Detection from Point Cloud
- @Cacheable 指定缓存位置
- 信息学奥赛一本通 2035:【例5.2】平移数据
- 修改tomcat的conf/server.xml解决网页乱码
- OBJECT_MODE
- [BZOJ1998][Hnoi2010]Fsk物品调度
- python函数定义参数类型和返回值类型
- Java HashMap原理
- C程序的基本组成结构
- win 10 好吗?对比与ubuntu,对比于Mac呢?
- 构建者模式和抽象工厂模式的结合使用
- contextcapture多区块点云_Smart 3D (ContextCapture) 4.4.6版本最新功能
- Android 查询设备信息c/c++常用方法
- 关于ROS日志ROS_INFO需要知道的一些东西
热门文章
- UVA - 10106 Product
- Discuz最全的常见问题及故障整理
- 刘乾四川大学计算机学院刘乾,刘乾亮
- curl myip.ipip.net curl ip.cn curl cip.cc
- 计算化学对计算机知识的要求,计算化学软件对大学有机化学教学的应用
- 几个Python小案例, 爱上Python编程!
- 小葵花妈妈课堂之nginx必须要了解的优化九部曲!
- explain mysql语句_使用 explain 查看 MySQL 中 SQL 语句的执行情况 - 文章
- mathorcup历年优秀论文阿里云盘
- 世界第一代电子计算机诞生在,1、世界上第一台电子计算机诞生于