请问Dplayer视频后端接口怎么写,使用springboot。网上都是弹幕后端接口的教程,没有视频后端的接口。Dplayer版本使用1.26.0,springboot使用3.0.4版本。
前端代码:
```html
<template>
<div id="dplayer">div>
template>
<script setup>
import {ref, onMounted, onUnmounted} from "vue"
import DPlayer from "dplayer"
import store from "@/store/store.js"
const props = defineProps(["videoId"])
let videoPlayer;
const init = () => {
videoPlayer = new DPlayer({
container: document.getElementById("dplayer"),
screenshot: true, // 开启截图,如果开启,视频和视频封面需要允许跨域
autoplay: true,
lang: "zh-cn",
hotkey: true, // 开启热键,支持快进、快退、音量控制、播放暂停
volume: 0.7, // 默认音量,请注意播放器会记忆用户设置,用户手动设置音量后默认音量即失效
video: {
// url: "https://api.dogecloud.com/player/get.mp4?vcode=5ac682e6f8231991&userId=17&ext=.mp4",
url: "http://localhost:8080/common/download/video",
},
danmaku: {
id: props.videoId,
user: store().userInfo.id,
api: "/api/bullet/", //这里填写弹幕地址 liveweb
addition: ["https://s-sh-17-dplayercdn.oss.dogecdn.com/1678963.json"],
maximum: 1000,
},
});
}
defineExpose({init})
onMounted(() => {})
// 销毁播放器
onUnmounted(() => {
videoPlayer.destroy()
})
script>
```
经典自问自答
@GetMapping("/play")
@CrossOrigin // 允许跨域
public void fileOutputStream(String url, HttpServletResponse response, @RequestHeader(HttpHeaders.RANGE) String range) throws IOException {
RandomAccessFile targetFile = null;
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
response.reset();
//打开文件
File file = new File(url);
if (!file.exists())
throw new BusinessException("文件路径有误");
// 读取文件
targetFile = new RandomAccessFile(file, "r");
long fileLength = targetFile.length();
// 分段下载视频
// 获取视频流起始长度(字节)
// Range = bytes=262144-
long requestStart = Long.parseLong(range.substring(range.indexOf("=") + 1, range.indexOf("-")));
//根据协议设置请求头
response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes");
response.setHeader(HttpHeaders.CONTENT_TYPE, "video/mp4");
response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileLength - requestStart));
response.setHeader(HttpHeaders.CONTENT_RANGE, "bytes " + requestStart + "-" + (fileLength - 1) + "/" + fileLength);
//断点传输下载视频返回206
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
//设置targetFile,从自定义位置开始读取数据
targetFile.seek(requestStart);
//从磁盘读取数据流返回
byte[] cache = new byte[4096];
while (fileLength > 0) {
int len = targetFile.read(cache);
if (fileLength < cache.length) {
outputStream.write(cache, 0, (int) fileLength);
} else {
outputStream.write(cache, 0, len);
if (len < cache.length) {
break;
}
}
fileLength -= cache.length;
}
outputStream.flush();
} catch (ClientAbortException e) {
// tomcat原话。写操作IO异常几乎总是由于客户端主动关闭连接导致,所以直接吃掉异常打日志
// 比如使用video播放视频时经常会发送Range为0- 的范围只是为了获取视频大小,之后就中断连接了
log.info(e.getMessage());
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (ClientAbortException ignored) {
}
}
if (targetFile != null) {
try {
targetFile.close();
} catch (ClientAbortException ignored) {
}
}
}
}