查看原文
其他

Spring Boot 应用 - 静态视频资源实时播放新姿势

SpringForAll社区 SpringForAll社区 2021-05-26
点击上方☝SpringForAll社区 轻松关注!
及时获取有趣有料的技术文章


问题描述

Spring Boot API 定义 GET 请求 API , 返回视频流。前端通过 video 标签加载并播放视频,效果是必须等整个视频资源全部加载到浏览器才能播放,而且 video 标签默认的进度条无法控制视频的播放。最终希望的效果是视频流边加载边播放,且播放器的控制正常使用。

解决方法

Spring Framework 文件请求处理

1import org.springframework.core.io.FileSystemResource;
2import org.springframework.core.io.Resource;
3import org.springframework.stereotype.Component;
4import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
5
6import javax.servlet.http.HttpServletRequest;
7import java.nio.file.Path;
8
9@Component
10public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler {
11
12    public final static String ATTR_FILE = "NON-STATIC-FILE";
13
14    @Override
15    protected Resource getResource(HttpServletRequest request) {
16        final Path filePath = (Path) request.getAttribute(ATTR_FILE);
17        return new FileSystemResource(filePath);
18    }
19
20}

Controller 层

1@RestController
2@AllArgsConstructor
3public class FileRestController {
4
5    private final NonStaticResourceHttpRequestHandler nonStaticResourceHttpRequestHandler;
6
7    /**
8     * 预览视频文件, 支持 byte-range 请求
9     */
10    @GetMapping("/video")
11    public void videoPreview(HttpServletRequest request, HttpServletResponse response) throws Exception {
12        String path = request.getParameter("path");
13        Path filePath = Paths.get(path);
14        if (Files.exists(filePath)) {
15            String mimeType = Files.probeContentType(filePath);
16            if (!StringUtils.isEmpty(mimeType)) {
17                response.setContentType(mimeType);
18            }
19            request.setAttribute(NonStaticResourceHttpRequestHandler.ATTR_FILE, filePath);
20            nonStaticResourceHttpRequestHandler.handleRequest(requestresponse);
21        } else {
22            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
23            response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
24        }
25    }
26
27}

相关资料

  • How do I return a video with Spring MVC so that it can be navigated using the html5 tag?

  • https://stackoverflow.com/questions/3303029/http-range-header





● Spring Boot 默认的指标数据从哪来的?

● 技术人面对裁员的终极解决方案-反脆弱

● Spring本质系列(2)-AOP

● Java 中的类型传递问题解惑

● Java阻塞队列的简单实现

● Spring 的本质系列(1) -- 依赖注入

● java匠人手法-优雅的处理空值

● REST API 的安全基础

● 深入浅出 CAS

● Spring Boot Devtools热部署

● Spring Boot AOP记录用户操作日志

● Spring Boot整合Mongo DB

● 【图文讲解】你一定能看懂的HTTPS原理剖析!

●  基础面试,为什么面试官总喜欢问String?

●  Spring Boot Admin 2.2.0发布,支持最新Spring Boot/Cloud之外,新增中文展示!

●  你应该知道的 @ConfigurationProperties 注解的使用姿势,这一篇就够了





如有收获,请帮忙转发,您的鼓励是作者最大的动力,谢谢!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存