Seeking/Scrubbing 通过具有 Spring 和 HTML5 瓶颈的本地视频

Seeking/Scrubbing through local videos with Spring and HTML5 bottlenecks

我正在创建一个本地视频库,但我不知道如何提高视频的性能 seeking/scrubbing。当我查看本地存储的视频文件时,它需要 10-15 秒才能开始播放,而使用搜索栏跳转最多可能需要 45 秒。

用 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>

这里有提高性能的明显方法吗?

我在 SO 上找到了一些有趣的答案。但我也弄清楚了如何使用 Spring WebFlux 轻松完成此操作。

概述了来自 Davin Kevin 的很棒的 MultipartFileSender ,它有效但仍然有点慢。按照另一个答案的建议将 InputStream 更改为 RandomAccessFile ,几乎可以立即进行擦洗。

现在对我的尝试有了更多的了解 Google 我发现 Jira ticket 可以添加 http 字节范围支持。这最终导致了我的解决方案。

@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();
}