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();
}
我正在创建一个本地视频库,但我不知道如何提高视频的性能 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 轻松完成此操作。
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();
}