【分段加載播放】h5 video標簽播放視頻流


后台代碼

@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) + "】");
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM