video 快进快退的原理:
通过对所在服务器上的流媒体进行skip操作,然后再response的header里设置相应的Content-Range以及其他属性,来控制视频流的快进快退的功能。
断点续传的原理也是一样!!!
相应代码如下:
播放视频
Java后端代码:
package ljxwtl.cn.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; @Controller public class FilePlayController { / * 下载 * @return * @throws IOException */ @RequestMapping(value = "/play", method = RequestMethod.GET) public void update(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException { BufferedInputStream bufferedInputStream = null; BufferedOutputStream bufferedOutputStream = null; String filePath = "/Users/tlzs/Downloads/movie.mp4"; try { File file = new File(filePath); int fSize = Integer.parseInt(String.valueOf(file.length())); httpServletResponse.setCharacterEncoding("utf-8"); httpServletResponse.setContentType("application/x-download"); httpServletResponse.setHeader("Accept-Ranges", "bytes"); httpServletResponse.setHeader("Content-Length", String.valueOf(fSize)); //对下载的文件或者播放的视频等取个名字 httpServletResponse.setHeader("Content-Disposition", "attachment;fileName=test.avi"); bufferedInputStream = new BufferedInputStream(new FileInputStream(file)); long position = 0; if (null != httpServletRequest.getHeader("Range")) { // 断点续传 httpServletResponse.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); try { position = Long.parseLong(httpServletRequest.getHeader("Range").replaceAll("bytes=", "").replaceAll("-", "")); } catch (NumberFormatException e) { position = 0; } } bufferedOutputStream = new BufferedOutputStream(httpServletResponse.getOutputStream()); // Content-Range的格式:bytes POSITION - ( FILE_SIZE - 1)/FILE_SIZE httpServletResponse.setHeader("Content-Range", "bytes " + position + "-" + (fSize - 1) + "/" + fSize); bufferedInputStream.skip(position); byte[] buffer = new byte[1024 * 10]; int length = 0; while ((length = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) { bufferedOutputStream.write(buffer, 0, length); //TimeUnit.MILLISECONDS.sleep(30); } } catch (Exception e) { } finally { try { if (null != bufferedOutputStream) bufferedOutputStream.flush(); if (null != bufferedInputStream) bufferedInputStream.close(); if (null != bufferedOutputStream) bufferedOutputStream.close(); } catch (IOException e) { } } } }
Java不让video标签的视频快进的方法:
后端输出流的response里的header请求头里不传入Content-Length即可!!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214853.html原文链接:https://javaforall.net
