Spring Boot 项目中对接海康摄像头的视频流播放

在 Spring Boot 项目中对接海康摄像头的视频流播放,通常需要利用摄像头的 RTSP 协议,将实时视频流解码并转发到前端以实现播放功能。以下是具体实现步骤:

1. 项目准备

前置条件

  • 已部署海康摄像头,并获取 RTSP 流地址。
  • 确保摄像头可以被服务器正常访问,网络配置无误。

RTSP 流地址格式

海康摄像头的 RTSP 流地址格式通常为:

rtsp://<username>:<password>@<ip>:<port>/Streaming/Channels/<channel>

例如:

rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101

2. 后端实现视频流转发

为了在后端转发视频流到前端,我们需要解码 RTSP 流并将其转为适配浏览器播放的格式,例如 HLSWebRTC

2.1 使用 FFmpeg 转码

FFmpeg 是一个强大的多媒体处理工具,可将 RTSP 流转换为 HLS 或其他格式。

安装 FFmpeg

在服务器上安装 FFmpeg(Ubuntu 为例):

sudo apt update
sudo apt install ffmpeg
测试 RTSP 流转 HLS

运行以下命令将 RTSP 流转换为 HLS 文件:

ffmpeg -i "rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101" -f hls -hls_time 1 -hls_list_size 3 -hls_wrap 10 /path/to/output/playlist.m3u8
  • -hls_time 1:每片 HLS 文件时长为 1 秒。
  • -hls_list_size 3:HLS 列表最多包含 3 个文件。
  • -hls_wrap 10:最多生成 10 个切片文件。

生成的 HLS 文件可以通过 HTTP 服务器提供给前端。

2.2 Spring Boot 集成

利用 Spring Boot 创建一个后端服务:

引入依赖

pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
转发 HLS 文件

将 HLS 文件通过 Spring Boot 服务暴露:

import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;

@RestController
@RequestMapping("/video")
public class VideoController {

    @GetMapping("/hls")
    public ResponseEntity<FileSystemResource> getHls() {
        File file = new File("/path/to/output/playlist.m3u8");
        return ResponseEntity.ok(new FileSystemResource(file));
    }
}

访问 http://<server-ip>:<port>/video/hls 可获取 HLS 播放列表。

3. 前端播放视频流

使用 Video.js 或其他播放器播放 HLS 流。

引入 Video.js

在前端页面中引入 Video.js:

<!DOCTYPE html>
<html>
<head>
    <link href="https://vjs.zencdn.net/7.20.3/video-js.css" rel="stylesheet">
</head>
<body>
    <video id="video" class="video-js vjs-default-skin" controls preload="auto" width="640" height="360">
        <source src="http://<server-ip>:<port>/video/hls" type="application/x-mpegURL">
    </video>

    <script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script>
</body>
</html>

替换 http://<server-ip>:<port>/video/hls 为后端服务地址。

4. 优化与扩展

4.1 异步处理 FFmpeg

使用 Spring Boot 的异步任务或第三方工具(如 Docker)托管 FFmpeg 流媒体服务。

4.2 多路流支持

通过参数化配置管理多个摄像头:

cameras:
  - name: camera1
    rtsp-url: rtsp://admin:12345@192.168.1.100:554/Streaming/Channels/101
  - name: camera2
    rtsp-url: rtsp://admin:12345@192.168.1.101:554/Streaming/Channels/102

在代码中动态调用不同摄像头的 RTSP 流地址。

4.3 WebRTC 支持

若需要更低延迟,可以考虑使用 WebRTC 方案,结合 WebRTC 服务端工具(如 GStreamer 或 Pion)实现流媒体转发。

5. 注意事项

  1. 性能问题:视频流解码和转码对 CPU 和内存要求较高,建议使用高性能服务器或 GPU 加速。
  2. 网络稳定性:确保摄像头网络畅通,避免掉线影响流播放。
  3. 安全性:妥善保护 RTSP 地址和后端接口,防止未经授权的访问。

这样,你可以轻松实现海康摄像头的视频流播放功能!

发布者:myrgd,转载请注明出处:https://www.object-c.cn/4475

Like (0)
Previous 2024年11月24日 下午12:00
Next 2024年11月24日 下午12:33

相关推荐

  • 云服务器安装宝塔强制重启导致MySQL无法启动

    在云服务器上进行 强制重启 后,MySQL 无法启动的情况,通常是由于以下几种原因引起的。强制重启可能会导致 MySQL 数据库的文件系统损坏、配置文件丢失、锁定文件问题等,下面是一些排查和解决方法。1. 检查 MySQL 错误日志MySQL 无法启动时,首先需要查看 MySQL 的错误日志,以获取更多的错误信息。错误日志通常位于 /var/log/mysq…

    2024年11月29日
    00
  • 在github上提交PR(Pull Request) + 多个pr同时提交、互不干扰的方法

    在 GitHub 上提交 PR(Pull Request)是一种将代码变更合并到主分支或其他目标分支的常见方式。在同时处理多个 PR 时,需要使用独立的分支来避免相互干扰。以下是详细教程: 步骤一:单个 PR 的提交流程Fork 仓库如果没有直接访问权限,先 fork 原仓库到自己的 GitHub 帐号。在 fork 的仓库上操作自己的代码。克隆仓库到本地 …

    2024年11月26日
    00
  • 将FFmpeg集成到 Spring Cloud构建分布式系统 对视频压缩处理

    在使用Spring Cloud构建分布式系统时,可以将FFmpeg集成到其中,用于对视频进行压缩和处理。以下是一个实现示例的详细步骤,包括代码示例和配置说明。 1. FFmpeg 简介 FFmpeg 是一个强大的开源工具,可以用来对音视频进行转换、压缩、剪辑等操作。通过命令行工具或调用其库,你可以高效处理多种格式的视频。 2. 环境准备 安装 FFmpeg …

    2024年11月23日
    00
  • XiYan-SQL 是一种多生成器集成的 Text-to-SQL框架,专注于将自然语言查询转换为结构化查询语言

    XiYan-SQL 是一种多生成器集成的 Text-to-SQL(文本转 SQL)框架,专注于将自然语言查询转换为结构化查询语言(SQL),从而高效地与数据库交互。以下是该框架的主要特点、技术原理及其应用场景的解析: 1. XiYan-SQL 的核心特点 2. 核心技术原理 3. 应用场景 4. XiYan-SQL 的优势 5. 示例 输入: 自然语言查询:…

    2024年12月5日
    00
  • 安装 Laravel 11 + Filament 详细教程

    安装Laravel 11之前选确保安装了Composer 管理器,接下来的步骤是通过Composer 包管理器安装完成的。 一、前提条件 二、使用 Composer 创建新的 Laravel 11 项目 三、在现有项目中添加 Laravel 11(如果是集成到现有项目) 请注意,在实际安装过程中,可能会遇到各种问题,如权限问题(在 Linux 下,如果没有足…

    2025年1月18日
    00
  • 出现 ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES) 错误的解决方法

    出现 ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES) 错误,通常是由于 MySQL 用户身份验证失败,可能的原因包括密码错误、用户权限配置问题或身份验证插件不匹配等。以下是解决方法: 1. 检查密码是否正确确保输入的密码与 MySQL 中为…

    2024年11月26日
    00
  • 通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)

    通过 PHP 读取微软邮箱(Outlook/Office 365 邮箱)邮件,通常需要使用 Microsoft Graph API,因为微软逐步淘汰了基于用户名和密码的 IMAP/SMTP 方式。Microsoft Graph API 支持 OAuth2.0 认证,可以安全地访问和管理用户邮件。 以下是实现读取微软邮箱邮件的完整示例。 实现步骤 1. 准备工…

    2024年11月25日
    00
  • 使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错

    在使用 CLion 编写 C51 (即8051微控制器) 程序时,遇到 sbit 相关报错,通常是因为 CLion 默认并不支持8051的特殊语法和寄存器定义方式。sbit 是 C51 编译器中的一个关键字,用来将一个单独的位(bit)映射到特定的硬件寄存器或端口引脚。常见的报错及解决方法sbit 语法问题: CLion 本身不支持 C51 特有的语法,sb…

    2024年11月27日
    00
  • Android 解决 “Module was compiled with an incompatible version of Kotlin“

    “Module was compiled with an incompatible version of Kotlin” 错误通常出现在 Android 开发中,因为模块的 Kotlin 编译器版本与项目中的 Kotlin 编译器版本不匹配。以下是解决此问题的方法: 1. 检查 Kotlin 插件版本步骤:打开 Android Studio。点击顶部菜单的 …

    2024年11月26日
    00
  • Unity 项目升级URP/HDRP渲染管线时如何解决材质丢失问题

    在 Unity 项目中升级到 URP(通用渲染管线) 或 HDRP(高清渲染管线) 后,材质丢失是一个常见问题。这通常是因为原来的材质或着色器不兼容新渲染管线,需要手动调整或重新配置。以下是详细的解决方法: 1. 理解渲染管线的变化 2. 自动转换材质(官方工具) Unity 提供了从 Built-in 渲染管线迁移到 URP 或 HDRP 的官方工具,可以…

    2024年11月25日
    00
  • 在 Apache Spark 中,任务的切分(Task Division)机制

    在 Apache Spark 中,任务的切分(Task Division)是 Spark 将应用程序逻辑划分为多个并行任务的核心机制。任务切分的主要原则是基于数据分区和操作算子。以下是任务切分的核心原则和关键影响因素: 1. Spark 任务切分的基本概念 2. 任务切分的原则 2.1 基于分区(Partition)的切分 2.2 基于依赖关系(Depend…

    2024年11月25日
    00
  • 若依集成 X-File-Storage 框架(实现图片上传阿里云 OSS 服务器)

    若依(Ruoyi)是一款基于 Spring Boot 的企业级开发框架,在此框架中集成 X-File-Storage 框架来实现图片上传到阿里云 OSS(对象存储服务)是一个常见的需求。通过这个集成,你可以便捷地将图片或文件上传到阿里云 OSS,并在系统中管理和访问这些文件。以下是详细的步骤说明: 1. 安装 X-File-Storage 框架 X-File…

    2024年11月25日
    00
  • 在 Go 语言中,对文件的基础操作介绍

    在 Go 语言中,文件操作是基础技能之一,主要通过 os、io 和 io/ioutil 等标准库完成。以下是对文件操作的全面介绍,帮助你在 Go 语言的“成神之路”上迈出关键一步! 1. 创建文件使用 os.Create 创建文件,如果文件已存在会被清空。示例代码 2. 打开文件使用 os.Open 打开文件(只读模式),使用 os.OpenFile 可以指…

    2024年12月2日
    00
  • 在微信公众号开发中获取 access_token 调用微信服务器端接口

    在微信公众号开发中,获取 access_token 是调用微信服务器端接口的第一步。access_token 是接口调用的凭据,可以通过微信公众号的接口调用。 以下是获取 access_token 的步骤和代码示例: 1. 获取 Access Token 的接口 调用微信服务器接口获取 access_token: 接口地址: 返回示例: access_tok…

    2024年12月3日
    00
  • 在 Delphi 中创建一个像 C# 那样的 DLL 类库(即面向对象的 DLL)

    在 Delphi 中创建一个像 C# 那样的 DLL 类库(即面向对象的 DLL)可以通过以下步骤实现:1. 创建 Delphi DLL 项目打开 Delphi。选择 File > New > Other > Dynamic-Link Library。在新项目中,默认生成的代码通常是 exports 部分,其中包含了 DLL 导出的函数。2. 定义类你可以在…

    2024年11月29日
    00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

在线咨询: QQ交谈

邮件:723923060@qq.com

关注微信