东啊東 2023-03-30 12:17 采纳率: 50%
浏览 31
已结题

如何设计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>

```

  • 写回答

2条回答 默认 最新

  • 东啊東 2023-04-01 01:52
    关注

    经典自问自答

        @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) {
                    }
                }
            }
        }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月11日
  • 已采纳回答 5月3日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题