核心概念:前端与后端分工

  • 前端: 负责展示和用户交互,使用HTML的 <video> 标签创建播放器界面,CSS进行样式美化,JavaScript进行控制。
  • 后端: 负责提供视频文件,使用Java(如Spring Boot)创建一个Web服务器,当浏览器请求视频时,后端将视频文件流式传输给浏览器。

最简单直接的方法(单文件HTML)

这个方法不涉及Java后端,但它是理解视频播放器的基础,你可以将这个HTML文件放在任何Web服务器(如Tomcat)的静态资源目录下直接访问。

java网页视频播放器代码
(图片来源网络,侵删)

代码文件: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>

说明:

  1. <video>: 核心标签。
  2. src: 指向视频文件的URL,这里的 my-video.mp4 需要和HTML文件放在同一个目录下。
  3. controls: 属性,显示默认的播放控制条,没有它,你就需要自己用JavaScript写控制逻辑。
  4. <source>: 推荐使用,可以在一个<video>标签内提供多个视频源,浏览器会依次尝试,直到找到一个它能播放的格式,这大大提高了跨浏览器的兼容性。
  5. type: <source>的属性,指定视频的MIME类型(如 video/mp4, video/webm),明确指定类型可以让浏览器更高效地加载,避免不必要的尝试。

使用Java后端(Spring Boot)提供视频

这是更常见、更专业的做法,视频文件不直接暴露给用户,而是通过Java应用来提供,这样可以进行权限控制、日志记录、动态处理等。

第1步:创建Spring Boot项目

你可以使用 Spring Initializr 快速创建一个项目,选择以下依赖:

java网页视频播放器代码
(图片来源网络,侵删)
  • 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 就会调用这个方法。
  • PathPaths: 用于处理文件路径。
  • UrlResource: Spring用来表示外部URL或文件系统资源的类。
  • resource.exists(): 检查文件是否存在。
  • java.nio.file.Files.probeContentType(): 自动检测文件的MIME类型(如 video/mp4)。
  • ResponseEntity: 构建完整的HTTP响应。
  • MediaType.parseMediaType(contentType): 设置正确的 Content-Type 响应头,告诉浏览器这是一个视频文件。
  • HttpHeaders.CONTENT_DISPOSITION: 设置 Content-Dispositioninline,表示浏览器应该在页面内显示(而不是下载),如果设为 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步:运行和测试

  1. 运行你的Spring Boot应用程序。
  2. 打开浏览器,访问 http://localhost:8080/player.html (如果你的应用端口是8080)。
  3. 你应该能看到视频播放器,并且视频能够正常播放。

更高级的自定义播放器(使用 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)是最佳选择