Однако это всегда заканчивается загрузкой полного файла. перед воспроизведением, хотя мне бы хотелось, чтобы видео запускалось как можно скорее, а затем продолжалось загрузка в фоновом режиме.
Мой код в серверной части:
Код: Выделить всё
@GetMapping("/{id}")
public ResponseEntity getVideo(@PathVariable("id") Long id, @RequestHeader HttpHeaders headers,
Principal principal) throws IOException {
Optional video = videoService.findOne(id, user);
if (video.isEmpty()) {
log.debug("Video not found");
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
FileSystemResource fileSystemResource = new FileSystemResource(video.orElseThrow().getFileLocation());
List httpRanges = headers.getRange();
if (httpRanges.isEmpty()) {
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_TYPE, "video/mp4")
.body(fileSystemResource);
}
HttpRange httpRange = httpRanges.get(0);
long fileLength = fileSystemResource.contentLength();
long start = httpRange.getRangeStart(fileLength);
long end = httpRange.getRangeEnd(fileLength);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set(HttpHeaders.ACCEPT_RANGES, "bytes");
responseHeaders.set(HttpHeaders.CONTENT_LENGTH, String.valueOf((end - start) + 1));
responseHeaders.set(HttpHeaders.CONTENT_RANGE, "bytes " + start + "-" + end + "/" + fileLength);
return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
.headers(responseHeaders)
.body(fileSystemResource);
}
Код: Выделить всё
Your browser does not support this video file.
Код: Выделить всё
videoUrl = signal('');
constructor() {
this.activatedRoute.data.pipe(takeUntilDestroyed()).subscribe(data => {
this.videoUrl.set(data['video']);
});
}
Есть разные вопросы о том, как транслировать видео, и я попробовал все варианты. (например, с автовоспроизведением и без, с предварительной загрузкой и без, я проверил заголовки и т. д.)
Подробнее здесь: https://stackoverflow.com/questions/788 ... ream-video