后台代碼
@GetMapping(value = "/getVideos") public String getVideos(HttpServletRequest request, HttpServletResponse response) { try { FileInputStream fis = null; OutputStream os = null ; fis = new FileInputStream("demo.mp4"); int size = fis.available(); // 得到文件大小 byte data[] = new byte[size]; fis.read(data); // 讀數據 fis.close(); fis = null; response.setContentType("video/mp4"); response.setHeader("Content-Disposition", "attachment; filename=操作視頻.mp4"); response.setContentLength(data.length); response.setHeader("Content-Range", "" + (data.length - 1)); response.setHeader("Accept-Ranges", "bytes"); response.setHeader("Etag", "W/\"9767057-1323779115364\""); response.setContentType("video/mp4"); // 設置返回的文件類型 os = response.getOutputStream(); os.write(data); os.flush(); os.close(); os = null; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
前端代碼
<video width="1120" height="540" controls="controls" id="video" preload="auto" > <source src="getVideos" type="video/mp4"> </video>
后台代碼【分段播放】
@RequestMapping(value = "/play") public void play(HttpServletRequest request, HttpServletResponse response) throws IOException { response.reset(); File file = new File("E:\\**.mp4"); long fileLength = file.length(); // 隨機讀文件 RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); //獲取從那個字節開始讀取文件 String rangeString = request.getHeader("Range"); long range = 0; if (StringUtil.isNotBlank(rangeString)) { range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-"))); } //獲取響應的輸出流 OutputStream outputStream = response.getOutputStream(); //設置內容類型 response.setHeader("Content-Type", "video/mp4"); //返回碼需要為206,代表只處理了部分請求,響應了部分數據 response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); // 移動訪問指針到指定位置 randomAccessFile.seek(range); // 每次請求只返回1MB的視頻流 byte[] bytes = new byte[1024 * 1024]; int len = randomAccessFile.read(bytes); //設置此次相應返回的數據長度 response.setContentLength(len); //設置此次相應返回的數據范圍 response.setHeader("Content-Range", "bytes " + range + "-" + (fileLength - 1) + "/" + fileLength); // 將這1MB的視頻流響應給客戶端 outputStream.write(bytes, 0, len); outputStream.close(); randomAccessFile.close(); System.out.println("返回數據區間:【" + range + "-" + (range + len) + "】"); }
