手把手教你用 Spring Boot+FFmpeg 实现 RTSP 视频流播放

yumo6666个月前 (05-02)技术文章84

你是否在互联网大厂的后端开发工作中,遇到过这样的难题?项目需要实现实时视频推流服务,并且要支持 RTSP 视频流的播放,但尝试了多种方法都效果不佳,不仅效率低,还频频出现兼容性问题,让开发进度严重受阻。相信不少后端开发人员都曾被这个问题困扰,今天就来和大家详细聊聊,如何用 Spring Boot 和 FFmpeg 来解决这个棘手的问题,同时也会为你介绍前端如何播放生成的 RTSP 视频流。

背景介绍

在如今的互联网应用场景中,视频流的应用越来越广泛,像在线直播、远程监控等。RTSP(实时流协议)作为一种常用的视频流传输协议,能够在网络上高效地传输音视频数据。而 Spring Boot 是当下非常流行的 Java 开发框架,它以其快速开发、高效部署的特点深受后端开发人员喜爱。FFmpeg 更是一款强大的多媒体框架,具备对音视频数据进行采集、编码、解码、转换等多种功能。将 Spring Boot 与 FFmpeg 结合起来,应用于实时视频推流服务中,能够充分发挥两者的优势,实现稳定、高效的 RTSP 视频流播放。同时,前端如何对接后端推流,流畅播放 RTSP 视频流,也是整个项目完整落地的关键一环 。

解决方案

环境搭建

首先,确保开发环境中安装了 Java Development Kit(JDK),Spring Boot 项目可以基于 JDK 进行创建和运行。同时,下载并安装 FFmpeg,根据操作系统的不同,选择对应的安装包进行安装。安装完成后,配置 FFmpeg 的环境变量,以便在项目中能够调用 FFmpeg 的相关命令。

创建 Spring Boot 项目

使用 Spring Initializr 创建一个新的 Spring Boot 项目,在依赖选项中,添加 Web 依赖,方便后续进行 HTTP 请求的处理。项目创建完成后,导入到开发工具(如 IntelliJ IDEA)中。

引入 FFmpeg 依赖

在 Spring Boot 项目的pom.xml文件中,添加 FFmpeg 相关的依赖包。可以通过 Maven 中央仓库搜索合适的 FFmpeg Java 封装库,例如ffmpeg-java,将其依赖添加到项目中,这样就能在 Java 代码中调用 FFmpeg 的功能。

编写视频推流代码

在 Spring Boot 项目中,创建一个服务类(如VideoStreamService),在该类中编写具体的视频推流逻辑。首先,通过 FFmpeg 命令获取视频源数据,例如从摄像头获取实时视频流。然后,对视频数据进行编码处理,将其转换为适合 RTSP 传输的格式。最后,通过 Spring Boot 提供的 HTTP 接口,将处理后的视频流数据推送到指定的 RTSP 服务器或者客户端。

以下是一段简单的示例代码,展示如何调用 FFmpeg 命令获取视频流数据:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class VideoStreamService {
    public void startStream() {
        try {
            Process process = new ProcessBuilder("ffmpeg", "-f", "video4linux2", "-i", "/dev/video0", "-c:v", "libx264", "-f", "rtsp", "rtsp://localhost:8554/live.sdp")
                   .redirectErrorStream(true)
                   .start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            int exitCode = process.waitFor();
            System.out.println("FFmpeg process exited with code: " + exitCode);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

前端播放 RTSP 视频流

在前端实现 RTSP 视频流的播放,目前有多种方案可供选择。

使用 Video.js + HLS.js

引入依赖:在 HTML 页面中引入 Video.js 和 HLS.js 的相关文件,可以通过 CDN 引入,也可以下载到本地后引入。

<link href="https://vjs.zencdn.net/7.19.2/video-js.css" rel="stylesheet">
<script src="https://vjs.zencdn.net/7.19.2/video.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/hls.js/1.0.7/hls.min.js"></script>

创建视频播放容器:在 HTML 中创建一个<video>标签,并设置相关属性。

<video id="my-video" class="video-js vjs-default-skin" controls preload="auto" width="640" height="264">
    <source id="my-video-source" type="application/x-mpegURL" />
</video>

编写 JavaScript 代码:在 JavaScript 中,通过 FFmpeg 将 RTSP 视频流转换为 HLS(HTTP Live Streaming)格式,HLS.js 可以很好地支持 HLS 格式视频的播放。在后端将视频流转换为 HLS 格式后,获取 HLS 格式的视频流地址,然后在前端通过以下代码进行播放。

var video = videojs('my-video');
var hlsSource = document.getElementById('my-video-source');
if (Hls.isSupported()) {
    var hls = new Hls();
    hls.loadSource('your_hls_stream_url');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED, function () {
        video.play();
    });
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    hlsSource.src = 'your_hls_stream_url';
    video.addEventListener('loadedmetadata', function () {
        video.play();
    });
}

使用 flv.js

引入依赖:同样在 HTML 页面中引入 flv.js 的相关文件。

<script src="https://cdnjs.cloudflare.com/ajax/libs/flv.js/1.6.2/flv.min.js"></script>

创建视频播放容器

<video id="videoPlayer" controls width="640" height="360"></video>

编写 JavaScript 代码:在后端将 RTSP 视频流转换为 FLV 格式后,获取 FLV 格式的视频流地址,通过以下代码在前端实现播放。

if (flvjs.isSupported()) {
    var player = flvjs.createPlayer({
        type: 'flv',
        url: 'your_flv_stream_url'
    });
    player.attachMediaElement(document.getElementById('videoPlayer'));
    player.load();
    player.play();
}

测试与调试

完成代码编写后,启动 Spring Boot 项目,使用支持 RTSP 协议的播放器(如 VLC 播放器),输入推流的 RTSP 地址,查看是否能够正常播放视频流。同时,在前端页面中,检查视频是否能够正常加载和播放。如果出现问题,通过后端日志输出和前端浏览器的开发者工具,检查代码逻辑、网络请求和资源加载情况,逐步排查和解决问题。

总结

通过以上步骤,我们成功地使用 Spring Boot 和 FFmpeg 实现了实时视频推流服务,实现了 RTSP 视频流的播放,并且介绍了前端播放 RTSP 视频流的常用方案。这个方案在互联网大厂的实际项目中具有很高的实用性和扩展性。各位后端开发小伙伴,不妨在自己的项目中尝试一下。如果你在实践过程中有任何问题,或者有更好的优化方案,欢迎在评论区留言分享,大家一起交流进步!

相关文章

这可能是目前最简单的电视播放电脑里的视频的方法

最近想重温电脑里的视频,想要用电视来看,找了很多方法,比如电脑搭建samba服务器,搭建jellyfin服务器,把视频拷贝到U盘里播放等等,设置操作复杂且对电脑的配置要求比较高,前前后后折腾了很久,虽...

Python爬取下载m3u8加密视频,原来这么简单

1.前言爬取视频的时候发现,现在的视频都是经过加密(m3u8),不再是mp4或者avi链接直接在网页显示,都是经过加密形成ts文件分段进行播放。今天就教大家如果通过python爬取下载m3u8加密视频...

Qt使用FFmpeg播放视频(ffmpeg播放视频命令)

一、使用场景  因为项目中需要加载MP4播放开机视频,而我们的设备所使用的架构为arm架构,其中缺乏一些多媒体库。安装这些插件库比较麻烦,所以最终决定使用FFmpeg播放视频。二、下载编译ffmpeg...

科研笔记神器:一边视频,一边笔记,轻松搞定B站视频学习

上一期,笔者介绍了一款笔记神器——Obsidian,它可以用于思维导图和知识管理。高效阅读和写作,席卷科研圈的科研神器由于计算机、互联网技术的发展,线上学习、视频学习已经成为了一种流行的学习途径,边看...

1,vue播放视频之—引入.m3u8后缀的hsl视频流

效果图:我这个是引入js的方式播放的。也可以用npm直接下载hsl.sj进行引入1.public里面index.html页面引入对应的js<script src="./jquery.mi...

独家揭秘:脱离厂商软件,轻松观看自家监控画面

在数字化安防普及的当下,监控设备已成为不少家庭守护安全的得力助手。但你是否知晓,无需依赖厂商提供的软件,仅凭手头的一些工具,就能自由观看自家的监控画面?实现这一操作,虽需要一定动手能力,但过程远比想象...