springboot 视频分段加载在线播放
页面访问视频资源 前端播放加载部分视频,每次选中一个时间点后 往后加载一部分视频,主要用以节省网络传输的数据量
通过ResourceHttpRequestHandler类实现,ResourceHttpRequestHandler支持分片加载,前端请求头中携带Range: bytes = 0-10001,就可以从后台自动截取对应大小视频内容
1.项目结构
2.pom依赖
<dependency><!--springboot启动依赖--><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>1.5.7.RELEASE</version></dependency>
3.启动类
package org.tmp;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
/*** 入口*/
@SpringBootApplication
public class Application implements EmbeddedServletContainerCustomizer {/*** 入口*/public static void main(String[] args) throws Exception {SpringApplication.run(Application.class, args);//初始化服务}@Overridepublic void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {}
}
4. ResourceHttpRequestHandler实现类
package org.tmp.test;import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;import javax.servlet.http.HttpServletRequest;/*** */
@Component
public class MyRequestHandler extends ResourceHttpRequestHandler {public final static String file_key = "my_file";@Overrideprotected Resource getResource(HttpServletRequest request) {String filePath = (String) request.getAttribute(file_key);return new FileSystemResource(filePath);}
}
5. 接口
package org.tmp.test;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;@Controller
@RequestMapping(value = "/api")
public class VideoApiController {@Autowiredprivate MyRequestHandler myRequestHandler;@RequestMapping(value = "/video")public void video(HttpServletRequest request, HttpServletResponse response) throws Exception {// 视频根目录 + 文件名称,找到对应的文件String path = "C:\\Users\\admin\\Desktop\\mp4\\1.mp4";//本地文件Path videoPath = Paths.get(path);if (!Files.exists(videoPath)) {response.setStatus(HttpServletResponse.SC_NOT_FOUND);response.setCharacterEncoding(StandardCharsets.UTF_8.toString());}String contentType = Files.probeContentType(videoPath);if (contentType != null && !contentType.isEmpty()) {//设置文件的响应类型response.setContentType(contentType);}request.setAttribute(MyRequestHandler.file_key, path);//将视频的地址传递给自定义的资源处理器myRequestHandler.handleRequest(request, response);System.out.println(contentType);}
}
运行结果