代码之家  ›  专栏  ›  技术社区  ›  Chris

通过Spring和HTML5瓶颈查找/清理本地视频

  •  0
  • Chris  · 技术社区  · 7 年前

    用VLC打开视频,这一切都是即时的。使用HTML5播放器是否存在直接的限制,或者我的后端代码是否存在问题?

    为了提供视频,我在控制器中使用Springboot,并使用以下方法

    @GetMapping(value = "/videos/p/{id}", produces = "video/mp4")
    public FileSystemResource videoSource(@PathVariable String id) {
        Optional<Video> optionalVideo = videoRepository.findById(id);
    
        return optionalVideo
                .map(video -> new FileSystemResource(new File(video.getAbsolutePath())))
                .orElse(null);
    }
    

    我在前端用一个简单的

    <video width="100%" controls>
      <source src="http://localhost:8080/videos/p/{{video.id}}" type="video/mp4">
    </video>
    

    有没有明显的方法可以提高性能?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Chris    7 年前

    我发现了一些有趣的答案。但我也发现了如何使用SpringWebFlux轻松实现这一点。

    This post 概述了可怕的 MultipartFileSender 来自戴文·凯文,虽然有效,但仍然有点慢。改变 InputStream 到 RandomAccessFile

    现在知道了更多关于我试图在谷歌上搜索的内容,我找到了 Jira ticket

    @GetMapping(value = "/videos/p/{id}")
    public ResponseEntity<UrlResource> getFullVideo(@PathVariable String id) throws MalformedURLException {
        Optional<Video> optionalVideo = videoRepository.findById(id);
    
        if (optionalVideo.isPresent()) {
            final String videoPath = optionalVideo.get().getAbsolutePath();
            final UrlResource video = new UrlResource(String.format("file:%s", videoPath));
    
            return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
                    .contentType(MediaTypeFactory.getMediaType(video)
                            .orElse(MediaType.APPLICATION_OCTET_STREAM))
                    .body(video);
        }
    
        return ResponseEntity.noContent().build();
    }