`
zengshaotao
  • 浏览: 752639 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

视频播放

阅读更多

方法的请求地址,连同视频参数会被存储在数据库中,前端通过html5标签,读取该url。方法是具体的内容:

 

public void videoPlayMP4(String videoId,HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, IOException {

    String file = urlConfig.getLocalDir()+videoId+".mp4";

File file2 = new File(file);

if (!file2.exists()||file2.length()==0) {

VideoParamDTO videoParamDTO=videoMapper.selectVideo(videoId);

VideoLocalUtil.save(videoParamDTO.getVideoURL(),file);

}

RandomAccessFile randomFile = new RandomAccessFile(new File(file), "r");//只读模式

long contentLength = randomFile.length();

        String range = request.getHeader("Range");

        int start = 0, end = 0;

        if(range != null && range.startsWith("bytes=")){

            String[] values = range.split("=")[1].split("-");

            start = Integer.parseInt(values[0]);

            if(values.length > 1){

                end = Integer.parseInt(values[1]);

            }

        }

        int requestSize = 0;

        if(end != 0 && end > start){

            requestSize = end - start + 1;

        } else {

            requestSize = Integer.MAX_VALUE;

        }

 

        byte[] buffer = new byte[1024*256];

        response.setContentType("video/mp4");

        response.setHeader("Accept-Ranges", "bytes");

        response.setHeader("ETag", videoId);

        response.setHeader("Last-Modified", new Date().toString());

        //第一次请求只返回content length来让客户端请求多次实际数据

        if(range == null){

            response.setHeader("Content-length", contentLength + "");

        }else{

        //以后的多次以断点续传的方式来返回视频数据

            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//206

            long requestStart = 0, requestEnd = 0;

            String[] ranges = range.split("=");

            if(ranges.length > 1){

                String[] rangeDatas = ranges[1].split("-");

                requestStart = Integer.parseInt(rangeDatas[0]);

                if(rangeDatas.length > 1){

                    requestEnd = Integer.parseInt(rangeDatas[1]);

                }

            }

            long length = 0;

            if(requestEnd > 0){

                length = requestEnd - requestStart + 1;

                response.setHeader("Content-length", "" + length);

                response.setHeader("Content-Range", "bytes " + requestStart + "-" + requestEnd + "/" + contentLength);

            }else{

                length = contentLength - requestStart;

                response.setHeader("Content-length", "" + length);

                response.setHeader("Content-Range", "bytes "+ requestStart + "-" + (contentLength - 1) + "/" + contentLength);

            }

        }

        ServletOutputStream out = response.getOutputStream();

        int needSize = requestSize;

        randomFile.seek(start);

        while(needSize > 0){

            int len = randomFile.read(buffer);

            if(needSize < buffer.length){

                out.write(buffer, 0, needSize);

            } else {

                out.write(buffer, 0, len);

                if(len < buffer.length){

                    break;

                }

            }

            out.flush();

            needSize -= buffer.length;

        }

        randomFile.close();

        out.close();

 

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics