背景:前端一般展示页面播放视频都是从头加载视频,这样会使用户体现很差,网速不好快进的话就会卡顿,加载太慢,为了 解决这一问题,后台给前端提供的接口需要实现断点下载的功能

@ApiOperation(value = "视频播放一方法", notes = "视频播放一方法")@GetMapping(value = "/preview")@ApiImplicitParams({@ApiImplicitParam(name = "url", value = "文件路径", required = true,paramType = "query")})@Overridepublic void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {// TODO Auto-generated method stubHttpServletRequest request=(HttpServletRequest)req;HttpServletResponse response=(HttpServletResponse)res;System.out.println(req.getParameter("url"));String path = addMinioUrl.getObPath(req.getParameter("url"));//String path="E:/video/111.mp4";RandomAccessFile targetFile = null;OutputStream outputStream = null;try {outputStream = response.getOutputStream();response.reset();//获取请求头中Range的值String rangeString = request.getHeader(HttpHeaders.RANGE);//打开文件File file = new File(path);if (file.exists()) {//使用RandomAccessFile读取文件targetFile = new RandomAccessFile(file, "r");long fileLength = targetFile.length();long requestSize = (int) fileLength;//分段下载视频if (StringUtils.hasText(rangeString)) {//从Range中提取需要获取数据的开始和结束位置long requestStart = 0, requestEnd = 0;String[] ranges = rangeString.split("=");if (ranges.length > 1) {String[] rangeDatas = ranges[1].split("-");requestStart = Integer.parseInt(rangeDatas[0]);if (rangeDatas.length > 1) {requestEnd = Integer.parseInt(rangeDatas[1]);}}if (requestEnd != 0 && requestEnd > requestStart) {requestSize = requestEnd - requestStart + 1;}//根据协议设置请求头response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");response.setHeader(HttpHeaders.CONTENT_TYPE, "video/mp4");if (!StringUtils.hasText(rangeString)) {response.setHeader(HttpHeaders.CONTENT_LENGTH, fileLength + "");} else {long length;if (requestEnd > 0) {length = requestEnd - requestStart + 1;response.setHeader(HttpHeaders.CONTENT_LENGTH, "" + length);response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + requestStart + "-" + requestEnd + "/" + fileLength);} else {length = fileLength - requestStart;response.setHeader(HttpHeaders.CONTENT_LENGTH, "" + length);response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + requestStart + "-" + (fileLength - 1) + "/"+ fileLength);}}//断点传输下载视频返回206response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//设置targetFile,从自定义位置开始读取数据targetFile.seek(requestStart);} else {//如果Range为空则下载整个视频response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=test.mp4");//设置文件长度response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileLength));}//从磁盘读取数据流返回byte[] cache = new byte[4096];try {while (requestSize > 0) {int len = targetFile.read(cache);if (requestSize < cache.length) {outputStream.write(cache, 0, (int) requestSize);} else {outputStream.write(cache, 0, len);if (len < cache.length) {break;}}requestSize -= cache.length;}} catch (IOException e) {// tomcat原话。写操作IO异常几乎总是由于客户端主动关闭连接导致,所以直接吃掉异常打日志//比如使用video播放视频时经常会发送Range为0- 的范围只是为了获取视频大小,之后就中断连接了//log.info(e.getMessage());//throw new RuntimeException(e);}} else {// throw new RuntimeException("文件路劲有误");}outputStream.flush();} catch (Exception e) {// e.printStackTrace();// throw new RuntimeException("文件传输错误");}finally {if(outputStream != null){try {outputStream.close();} catch (IOException e) {//e.printStackTrace();// throw new RuntimeException("流释放错误");}}if(targetFile != null){try {targetFile.close();} catch (IOException e) {//e.printStackTrace();//    throw new RuntimeException("文件流释放错误");}}}}

前端要安装视频插件,需要的小伙伴可以@我

java 视频断点播放,实现无卡顿相关推荐

  1. 播放起来非常流畅而无卡顿

    目前国内的互联网电视市场里,小米电视和乐视电视是最引人注目的两个品牌,这两家公司利用互联网宣传的优势和低廉的价格把大尺寸平板电视市场激活,本文以小米电视1和乐视电视S50为例对比一下两个电视有什么不同 ...

  2. android 播放音乐卡顿,Android MediaPlayer+SeekBar播放音频出现卡顿边长可能问题

    开发过程中总是会碰到一些"什么鬼,原来这么简单"等等的问题,比如今天碰到 Android MediaPlayer+SeekBar播放音频出现卡顿可能问题? 代码段一: seekBa ...

  3. 杰理AC692X---U盘播放无损音乐卡顿问题

    692X在播放无损格式音乐的时候,蓝牙和PC模式都没问题, 唯独U盘和T卡一直会卡顿,把解码时钟改为192M也一样, 最后发现把以下宏定义改大就可以了: #define OUTPUT_BUF_SIZE ...

  4. kodi android 卡顿,给Kodi设置缓存来解决播放大文件卡顿

    给Kodi设置缓存来解决播放大文件卡顿 2021-03-02 16:21:20 28点赞 355收藏 31评论 Kodi可以算是电视盒子上最棒的播放器了,它具有强大的功能,优美的界面,相信很多人也都是 ...

  5. 微信小程序 wepy 框架 手势密码 ios 安卓 真正的无卡顿

    微信小程序 wepy 框架 手势密码 ios 安卓 真正的无卡顿 https://github.com/t5442107/yj_wepy_gesture_lock 用vscode 打开测试! 下载 h ...

  6. pyqt5 多线程实时拉流并播放,画面流畅无卡顿

    目录 1. 背景 2. 实现 1. 背景 需要用pyqt5做一个简单播放器,能够连接单位摄像头,用rtsp拉流并实时展示.很多博客方法都试过,或者卡顿,或者时延较大,无法满足需求. 2. 实现 主要参 ...

  7. AE渲染后的视频文件播放时很卡,不流畅

    2014-11-13 AE渲染要更改渲染格式 一般我们用avi,但是要注意的是改成avi之后如果用默认的格式渲染,那么渲染出来的文件超大,播放的时候也会卡顿. 此时你要设置格式选项 默认的是None. ...

  8. 视频融合云平台视频播放卡顿的原因分析及解决办法

    SkeyeVSS视频融合云平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,平台支持多类型设备.多协议方式接入,包括主流标准协议国标GB/T28181.RTMP.RTSP/O ...

  9. java撕裂_屏幕撕裂与卡顿分析

    显示器原理 首先我们先要了解一下屏幕的刷新原理,目前显示器大体分为CRT显示器和液晶显示器这两个种类. 屏幕图像的刷新通过扫描帧缓存位图的方式进行刷新,扫描分为随机扫描方式和光栅扫描方式. 1.随机扫 ...

  10. 蓝牙音乐和导航语音播放混音卡顿问题

    最近发现公司自研的智能车载设备上存在一个问题:手机通过蓝牙连接车机,在手机上播放音乐车机上发声然后跟车机上的导航语音播报一起混音播出的时候会出现卡顿的现象:但是在车机上播放音乐和导航混音就正常.另外需 ...

最新文章

  1. 第二十一节(数组概要, 一维、二维数组的声明和使用,数组的排序,数组的查找,)...
  2. C# 线程安全与 lock锁
  3. JavaScript中encodeURI,encodeURIComponent与escape的注意
  4. arraylist获取前多少位_Java 面试题 :百度前 200 页都在这里
  5. 【LeetCode笔记】312. 戳气球(Java、动态规划)
  6. c:forecah 参数param 不能作为对象名
  7. vc6配置c语言编译环境,驱动WDK7600在VC6.0下的编译开发配置环境
  8. 测试linux系统的程序员,日常测试Linux命令
  9. java工作笔记017---java8新特性_使用lamda表达式进行List分组_排序_去重_随时更新
  10. 泛运筹理论初探——HANP和BMLPA以及DCLP简介
  11. 英语口语软件测试满分多少分,小学生英语口语测试评分标准
  12. html图片从左到右慢慢出来,css 实现一个div的背景颜色从左到右慢慢出现 里面文字颜色也改...
  13. 收藏——硬币(五大天王和四小龙)
  14. Oracle数据库表空间用户权限
  15. 99%的程序员都不明白:弱者和强者的唯一区别
  16. mysql master sevler_零零星星
  17. Git在clone时认证失败后不能重新输入的解决方案
  18. 您知道Linux下C语言编程的一些注意事项吗_教育中国
  19. 2020年第十一届C/C++ B组第一场蓝桥杯省赛真题
  20. 卡通动漫游戏人物网页模板_灰色 卡通 动漫 游戏 漂亮 精美 整站 斜纹 质感

热门文章

  1. 218分照样可以成为同声传译研究生3
  2. 接收IWebBrowser2的自动化事件
  3. 机器学习 | 线性方法降维(理论篇)
  4. 开源WPF第三方库【Newbeecoder.UI】分页控件
  5. pixhawk源码下载与编译
  6. 【ACWing】1137. 选择最佳线路
  7. 16条时间管理法则 让你快速提高效率
  8. Hive架构及相关函数
  9. FPGA Vivado AXI _DMA IP介绍
  10. efi安装linux7,使用PXE EFI引导安装RHEL7.3