后台代码:
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.OutputStream; import java.io.RandomAccessFile; import java.nio.charset.StandardCharsets; /** * 创建人: * 时间: 2022/7/6 15:03 * 描述: 播放本地视频文件 */ @RestController @RequestMapping(value = "/web-api/video") public class getVideo{ /** * 本地视频转视频流流 * @param response * @return */ @RequestMapping("/getVideo") @ResponseBody public void getVideo(HttpServletRequest request, HttpServletResponse response) { //视频资源存储信息 response.reset(); //获取从那个字节开始读取文件 String rangeString = request.getHeader("Range"); try { //获取响应的输出流 OutputStream outputStream = response.getOutputStream(); File file = new File("c:\\video.mp4"); if(file.exists()){ RandomAccessFile targetFile = new RandomAccessFile(file, "r"); long fileLength = targetFile.length(); //播放 if(rangeString != null){ long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-"))); //设置内容类型 response.setHeader("Content-Type", "video/mp4"); //设置此次相应返回的数据长度 response.setHeader("Content-Length", String.valueOf(fileLength - range)); //设置此次相应返回的数据范围 response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength); //返回码需要为206,而不是200 response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); //设定文件读取开始位置(以字节为单位) targetFile.seek(range); }else {//下载 //设置响应头,把文件名字设置好 response.setHeader("Content-Disposition", "attachment; filename=video.mp4" ); //设置文件长度 response.setHeader("Content-Length", String.valueOf(fileLength)); //解决编码问题 response.setHeader("Content-Type","application/octet-stream"); } byte[] cache = new byte[1024 * 300]; int flag; while ((flag = targetFile.read(cache))!=-1){ outputStream.write(cache, 0, flag); } }else { String message = "file: not exists"; //解决编码问题 response.setHeader("Content-Type","application/json"); outputStream.write(message.getBytes(StandardCharsets.UTF_8)); } outputStream.flush(); outputStream.close(); } catch (Exception e) { } } }
前端html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>videoDemo</title> </head> <body> <video id="my-video" class="video-js vjs-big-play-centered" controls="controls" poster=""> <source src="/web-api/video/getVideo" type='video/mp4'> </video> </body> </html>