vue视频流播放,支持多种视频格式,如rmvb、mkv
先将视频转码为ts
ffmpeg -i C:\test\3.rmvb -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls C:\test\a\output.m3u8
后端配置接口
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.MalformedURLException;
import java.nio.file.Path;
import java.nio.file.Paths;
@RestController
@RequestMapping("/api/video")
public class VideoController4 {
private final Path videoStorageLocation = Paths.get("C:\\test\\a");
@GetMapping("/stream/{fileName}")
public ResponseEntity<Resource> streamVideo(@PathVariable String fileName) {
try {
Path filePath = this.videoStorageLocation.resolve(fileName).normalize();
System.out.println(filePath);
Resource resource = new UrlResource(filePath.toUri());
if (resource.exists()) {
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_TYPE, "application/x-mpegURL")
.body(resource);
} else {
return ResponseEntity.notFound().build();
}
} catch (MalformedURLException ex) {
return ResponseEntity.badRequest().build();
}
}
}
vue代码
<template>
<div>
<video ref="videoPlayer" controls >
</video>
</div>
</template>
import Hls from 'hls.js';
onMounted(() => {
const video = videoPlayer.value;
const videoSrc = 'http://localhost:9500/api/video/stream/5.m3u8'; // 替换为你的 .m3u8 视频流地址
if (Hls.isSupported() && video) {
const hls = new Hls();
hls.loadSource(videoSrc);
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED, () => {
// video.play();
});
} else if (video && video.canPlayType('application/vnd.apple.mpegurl')) {
// 如果浏览器原生支持 HLS(如 Safari)
video.src = videoSrc;
video.addEventListener('loadedmetadata', () => {
video.play();
});
}
});