SpringBoot 实现视频分段播放(通过进度条来加载视频)

news2024/11/15 12:55:46

需求:现在我本地电脑中有一个文件夹,文件夹中都是视频,需要实现视频播放的功能。

问题:如果通过类似 SpringBoot static 文件夹的方式来实现,客户端要下载好完整的视频之后才可以播放,并且服务端也会占用大量宽带。所以这里考虑采取视频分段的方式进行下载,客户端播放视频时,可以通过进度条调节视频进度。

实现方法:在 SpringBoot 中支持自定义资源请求处理器,通过自定义的资源处理器来实现。

依赖:主要就是 SpringBoot 的相关依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

编写一个自定义资源请求处理器,需要继承 ResourceHttpRequestHandler 重写 getResource() 方法。该自定义处理器还需要加上 @Component 注解。

在案例中 getResource() 方法中,需要拿到对应的视频地址,通过 Controller 层的代码通过 request.setAttribute("video-uri", videoUri) 设置 video-uri 的 value,value 可以是视频的本地路径,也可以是视频的唯一标识,需要按照自己的业务来传值。

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 17279
 */
@Component
public class VideoResourceHttpRequestHandler extends ResourceHttpRequestHandler {
  // 只需要重写 getResource 方法
  @Override
  protected Resource getResource(HttpServletRequest request) {
    // 这里的 videoUri 是在 Controller 中通过 request.setAttribute("video-uri", videoUri) 进来的值
    String videoUri = (String) request.getAttribute("video-uri"); // D:\Downloads\test.mp4
    // 可以通过 videoUri 传递的值根据我们的业务查找对应的文件
    return new FileSystemResource(videoUri);
  }
}

编写 Controller 层代码:

这里通过 request.setAttribute("video-uri", videoUri) 添加 video-uri 的 value,自定义处理中通过这个 value 找到向前端返回的视频。

import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @author 17279
 */

@RestController
@RequestMapping("video")
public class VideoController {
  @Autowired
  private ResourceHttpRequestHandler resourceHttpRequestHandler;

  /**
    * @param fileName fileName 前端传递过来的视频文件名名称
    */
  @GetMapping(value = "/{fileName}")
  public void video(@PathVariable("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    // 视频文件根目录【换成实际的视频根目录】
    final String videoBasePath = "D:/Downloads/";
    
    // 视频根目录 + 文件名称,找到对应的文件
    String videoUri = videoBasePath + fileName;
    Path videoPath = Paths.get(videoUri);

    if (Files.exists(videoPath)) {
      // 如果找到视频,那么返回视频信息
      String contentType = Files.probeContentType(videoPath);
      if (contentType != null && !"".equals(contentType)) {
        response.setContentType(contentType);
      }
      // video-path 主要是将视频的地址传递给自定义的资源处理器处使用
      request.setAttribute("video-uri", videoUri);
      resourceHttpRequestHandler.handleRequest(request, response);
    } else {
      // 如果文件不存在,那么跳到 404 页面
      response.setStatus(HttpServletResponse.SC_NOT_FOUND);
      response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
    }
  }
}

访问地址:http://localhost/video/test.mp4

访问效果:这里设置的视频跟目录是 D:/Downloads/,前端传递的 fileName 为 test.mp4,所以实际返回前端的文件为 D:/Downloads/test.mp4

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1911159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Androidstudio开发,天气预报APP

1.项目功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;和风天气API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现未来7天列表展示和天气指数使用PopupMenu 实现弹出选项框使用动画定时器实现欢迎页倒计时和logo动画使用Text…

用Vue3和Plotly.js绘制交互式3D散点图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Plotly.js 创建 2D 密度图 应用场景介绍 密度图是一种可视化数据分布的图表&#xff0c;它显示了数据点的密度在不同区域的变化情况。在许多科学和工程领域中&#xff0c;密度图被广泛用于探索和分析数据…

java项目总结数据库

1.什么是数据库 用于存储和管理数据的仓库 2.数据库的特点 1.持久化存储数据。确实数据库就是一个文件系统。 2.便于存储和管理数据 3.使用统一的方式操作数据库 --SQL 3.MqSql服务启动 4.登录和退出 这里的ip值IP地址 5.客户端与服务器关系 6.目录结构 7.SQL 1.什么是SQL&…

AI赋能OFFICE 智能化办公利器!

ONLYOFFICE在线编辑器的最新版本8.1已经发布&#xff0c;整个套件带来了30多个新功能和432个bug修复。这个文档编辑器无疑成为了办公软件中的翘楚。它不仅支持处理文本文档、电子表格、演示文稿、可填写的表单和PDF&#xff0c;还允许多人在线协作&#xff0c;并支持AI集成&…

10、Python之写出更加Pythonic的代码:unpacking拆包机制

引言 有些小伙伴有其他编程语言的学习、使用的经验&#xff0c;然后迁移到Python。一般会比完全的新手小白&#xff0c;更快速地把Python用起来。这是他们的优势&#xff0c;但也是他们的劣势。 之所以这么说&#xff0c;是因为从其他编程语言带过来的&#xff0c;除了相通的编…

多模态:Nougat详解

文章目录 前言一、模型结构1. encoder2. decoder3. set 二、数据增强三、数据splitting the pages 四、实验评估repetitions during inference 五、代码1. 环境安装2. Dataset&#xff08;dataset.py&#xff09;3. Model&#xff08;model.py&#xff09; 总结 前言 科学知识…

【论文速读】| 用于安全漏洞防范的人工智能技术

本次分享论文&#xff1a;Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者&#xff1a;Steve Kommrusch 作者单位&#xff1a;Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 关键…

给数组/对象添加一个(key-value)对象

需要将一个value值前面加上key值&#xff0c;放进数组/对象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target&#xff1a;要更改的数据源(可以是对象或者数组) key&#xff1a;要更改的具体数据 value &#xff1a;重新赋的值。 结果&#xff1a;…

初识C++【命名空间】【输入输出】【缺省参数】【函数重载】

前言 C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;包括系统软件、游戏、手机应用和高性能计算等。它是C语言的扩展&#xff0c;添加了许多新特性和功能&#xff0c;并支持面向对象编程。C可以在不同的平台上编译和运行&#xff0c;具有高效性、可…

C++:C++入门基础|命名空间|输入输出

欢迎来到HarperLee的学习笔记&#xff01; 博主主页传送门&#xff1a; HarperLee的博客主页! 想要一起进步的uu来后台哦&#xff01; 一、什么是C? 在此之前&#xff0c;我们所学习的C语言是一种结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&a…

【Java算法】二分查找 下

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 一.山脉数组的峰顶索引 题目链接&#xff1a;852.山脉数组的峰顶 ​ 算法原理 这段代码实现了一个查找山峰数组中峰值索引的算法。山峰数组是一个先递增后递减的数组&…

14-55 剑和诗人29 - RoSA:一种新的 PEFT 方法

介绍 参数高效微调 (PEFT) 方法已成为 NLP 领域研究的热门领域。随着语言模型不断扩展到前所未有的规模&#xff0c;在下游任务中微调所有参数的成本变得非常高昂。PEFT 方法通过将微调限制在一小部分参数上来提供解决方案&#xff0c;从而以极低的计算成本在自然语言理解任务上…

QT入门看这一篇就够(详解含qt源码)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

【技术选型】MySQL、Oracle、Postgresql如何选择

【技术选型】MySQL、Oracle、Postgresql如何选择 开篇词&#xff1a;干货篇&#xff1a;MySQL&#xff1a;Oracle&#xff1a;PostgreSQL&#xff1a; 总结篇&#xff1a;我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#xff01; 开篇词&#xff1a; 常见几种关…

Nuxt框架中内置组件详解及使用指南(四)

title: Nuxt框架中内置组件详解及使用指南&#xff08;四&#xff09; date: 2024/7/9 updated: 2024/7/9 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt 3框架中的两个内置组件&#xff1a;和的使用方法与示例。用于捕获并处理客户端错误&#xff0c;提供…

图解HTTP(5、与 HTTP 协作的 Web 服务器 6、HTTP 首部)

5、与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站&#xff0c;也可作为通信路径上的中转服务器提升传输效率。 用单台虚拟主机实现多个域名 在相同的 IP 地址下&#xff0c;由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站&#xff0c;因此…

回溯算法-以学生就业管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法&#xff0c;它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤&#xff1a; 1、 针对所给问题&#xff0c;定义问题的解空间&#xff0c;它至少包含问题的一个&#xff08;最优&#xff09;解。 2 、确定易于搜…

[ios-h5]在ios系统浏览器中输入框得到焦点时页面自动放大

问题&#xff1a; 在ios系统浏览器中输入框得到焦点时页面自动放大。 解决&#xff1a; 添加meta标签。 <meta name"apple-mobile-web-app-capable" content"yes" /> <meta name"viewport" content"widthdevice-width, initial-…

循环练习题

思路&#xff1a; 代码&#xff1a; public static void main(String[] args) {double sum0;for (int i1;i<100;i){if (i%2!0){sum1.0/i;}else {sum-1.0/i;}}System.out.println(sum);} 结果为&#xff1a;

每日一练 - RSTP响应端口故障后的处理流程

01 真题题目 在如图所示的网络中&#xff0c; 所有的交换机运行 RSTP 协议&#xff0c; 假如 SWB 的 E 1 接口故障后&#xff0c; RSTP 的处理过程是&#xff1a;(多选) A.SWB 删除 MAC 地址表中以 E 1 为目的端口的端口表项。 B.重新计算生成树&#xff0c;选举 E2 为新的根…