如何设计Dplayer视频后端接口

请问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) {
                }
            }
        }
    }