核心概念:前端与后端分工
- 前端: 负责展示和用户交互,使用HTML的
<video>标签创建播放器界面,CSS进行样式美化,JavaScript进行控制。 - 后端: 负责提供视频文件,使用Java(如Spring Boot)创建一个Web服务器,当浏览器请求视频时,后端将视频文件流式传输给浏览器。
最简单直接的方法(单文件HTML)
这个方法不涉及Java后端,但它是理解视频播放器的基础,你可以将这个HTML文件放在任何Web服务器(如Tomcat)的静态资源目录下直接访问。

代码文件:simple-player.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">简单视频播放器</title>
<style>
/* 可选:添加一些基本样式 */
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
video {
border: 1px solid #ccc;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
max-width: 100%;
}
</style>
</head>
<body>
<video width="800" controls>
<!--
src: 视频文件的路径。
controls: 显示浏览器自带的播放控件(播放/暂停、进度条、音量等)。
-->
<source src="my-video.mp4" type="video/mp4">
<!--
如果浏览器不支持 <video> 标签,或者指定的格式不支持,就会显示这里的文本。
建议提供多种格式的源,以提高兼容性。
-->
您的浏览器不支持 HTML5 视频。
<!-- 备用视频源示例 -->
<!-- <source src="my-video.webm" type="video/webm"> -->
<!-- <source src="my-video.ogv" type="video/ogg"> -->
</video>
</body>
</html>
说明:
<video>: 核心标签。src: 指向视频文件的URL,这里的my-video.mp4需要和HTML文件放在同一个目录下。controls: 属性,显示默认的播放控制条,没有它,你就需要自己用JavaScript写控制逻辑。<source>: 推荐使用,可以在一个<video>标签内提供多个视频源,浏览器会依次尝试,直到找到一个它能播放的格式,这大大提高了跨浏览器的兼容性。type:<source>的属性,指定视频的MIME类型(如video/mp4,video/webm),明确指定类型可以让浏览器更高效地加载,避免不必要的尝试。
使用Java后端(Spring Boot)提供视频
这是更常见、更专业的做法,视频文件不直接暴露给用户,而是通过Java应用来提供,这样可以进行权限控制、日志记录、动态处理等。
第1步:创建Spring Boot项目
你可以使用 Spring Initializr 快速创建一个项目,选择以下依赖:

- Spring Web
- Spring Boot DevTools (可选,方便热部署)
第2步:放置视频文件
将你的视频文件(sample-mp4-file.mp4)放在项目的 src/main/resources/static 目录下,Spring Boot会自动将这个目录下的文件作为静态资源提供服务。
第3步:创建视频控制器
创建一个Java类来处理视频请求。
代码文件:VideoController.java
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
@Controller
public class VideoController {
// 定义视频文件存储在 static 目录下的路径
private final Path videoPath = Paths.get("src/main/resources/static/videos");
/**
* 处理视频播放请求
* @param videoName 视频文件名 ( sample-mp4-file.mp4)
* @return 包含视频资源的 ResponseEntity
*/
@GetMapping("/videos/{videoName}")
public ResponseEntity<Resource> serveVideo(@PathVariable String videoName) {
try {
// 构建完整的文件路径
Path filePath = videoPath.resolve(videoName).normalize();
// 创建一个 Resource 对象
Resource resource = new UrlResource(filePath.toUri());
// 检查文件是否存在且可读
if (resource.exists() && resource.isReadable()) {
// 获取文件的 MIME 类型
String contentType = "application/octet-stream"; // 默认类型
try {
contentType = java.nio.file.Files.probeContentType(filePath);
} catch (IOException e) {
// 如果无法确定类型,使用默认类型
}
// 返回文件,设置正确的 Content-Type 和 Content-Disposition
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + resource.getFilename() + "\"")
.body(resource);
} else {
// 如果文件不存在,返回 404 Not Found
return ResponseEntity.notFound().build();
}
} catch (Exception e) {
// 处理其他异常,返回 500 Internal Server Error
return ResponseEntity.internalServerError().build();
}
}
}
代码解释:
@Controller: 标记这是一个Spring MVC控制器。@GetMapping("/videos/{videoName}"): 定义一个GET请求映射,URL路径为/videos/加上文件名,访问/videos/sample-mp4-file.mp4就会调用这个方法。Path和Paths: 用于处理文件路径。UrlResource: Spring用来表示外部URL或文件系统资源的类。resource.exists(): 检查文件是否存在。java.nio.file.Files.probeContentType(): 自动检测文件的MIME类型(如video/mp4)。ResponseEntity: 构建完整的HTTP响应。MediaType.parseMediaType(contentType): 设置正确的Content-Type响应头,告诉浏览器这是一个视频文件。HttpHeaders.CONTENT_DISPOSITION: 设置Content-Disposition为inline,表示浏览器应该在页面内显示(而不是下载),如果设为attachment,则会触发下载。
第4步:修改前端HTML
前端的HTML需要指向后端提供的URL。
代码文件:player.html (放在 src/main/resources/static 目录下)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">Java后端视频播放器</title>
<style>
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; background-color: #222; color: #fff; }
video { max-width: 100%; border-radius: 8px; box-shadow: 0 4px 20px rgba(0,0,0,0.5); }
</style>
</head>
<body>
<h2>Spring Boot 视频播放示例</h2>
<!--
src 指向我们 Java 后端控制器的 URL
path 变量 {videoName} 需要和控制器中的 @PathVariable 一致
-->
<video width="800" controls autoplay muted loop>
<source src="/videos/sample-mp4-file.mp4" type="video/mp4">
您的浏览器不支持 HTML5 视频。
</video>
</body>
</html>
关键改动:
<video>标签的src属性从本地文件改为了/videos/sample-mp4-file.mp4,这个路径会由我们的VideoController来处理。
第5步:运行和测试
- 运行你的Spring Boot应用程序。
- 打开浏览器,访问
http://localhost:8080/player.html(如果你的应用端口是8080)。 - 你应该能看到视频播放器,并且视频能够正常播放。
更高级的自定义播放器(使用 Video.js)
浏览器自带的播放器样式在不同浏览器中可能不一致,为了获得更美观、功能更统一、体验更好的播放器,可以使用第三方JavaScript库,如 Video.js。
第1步:引入Video.js库
在你的HTML文件中,通过CDN引入Video.js的CSS和JavaScript文件。
代码文件:custom-player.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">Video.js 自定义播放器</title>
<!-- 引入 Video.js CSS -->
<link href="https://vjs.zencdn.net/8.6.1/video-js.css" rel="stylesheet">
<!-- 可选:自定义样式 -->
<style>
body { font-family: sans-serif; background-color: #282828; color: #fff; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
.video-js { width: 800px; height: 450px; border-radius: 8px; box-shadow: 0 4px 20px rgba(0,0,0,0.5); }
</style>
</head>
<body>
<video
id="my-video"
class="video-js vjs-default-skin"
controls
preload="auto"
width="800"
height="450"
data-setup="{}">
<source src="/videos/sample-mp4-file.mp4" type="video/mp4">
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="https://videojs.com/html5-video-support/" target="_blank">
supports HTML5 video
</a>.
</p>
</video>
<!-- 引入 Video.js JavaScript -->
<script src="https://vjs.zencdn.net/8.6.1/video.min.js"></script>
</body>
</html>
关键点:
- CSS:
<link href="...video-js.css" rel="stylesheet">引入Video.js的默认样式。 <video>:- 添加了
class="video-js vjs-default-skin",这是Video.js识别和播放器样式的关键。 data-setup="{}"告诉Video.js对这个<video>元素进行初始化。
- 添加了
- JavaScript:
<script src="...video.min.js"></script>在页面底部引入Video.js库,它会自动查找并初始化所有带有video-js类的<video>
将这个 custom-player.html 文件也放在 src/main/resources/static 目录下,然后访问它,你就能看到一个外观更专业、功能更丰富的播放器。
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方案一 (简单HTML) | 实现简单,无需后端 | 功能有限,安全性低,无法进行服务器端控制 | 静态网站,个人博客,快速原型验证 |
| 方案二 (Java后端) | 安全可控,可扩展性强(如权限、日志) | 实现稍复杂,需要搭建后端服务 | 企业级应用,需要用户认证、视频防盗链等 |
| 方案三 (Video.js) | 界面美观统一,功能丰富,跨浏览器兼容性好 | 引入了外部库,需要额外学习 | 对用户体验要求高的网站,Web应用 |
对于大多数Java Web项目,方案二(Spring Boot后端 + HTML5 <video>)是标准实践,如果对UI和体验有更高要求,方案三(Spring Boot + Video.js)是最佳选择。
