Springboot秒集成-视频推拉流

简介: 在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。

 Welcome to Code Block's blog

本篇文章主要介绍了

[Springboot视频推拉流服务搭建]

博主广交技术好友,喜欢的可以关注一下❤

目录

一、编写目的

二、代码集成

2.1 配置pom依赖

2.2 配置类

2.3 实现事件

三、推拉流测试

3.1 推流命令

3.2 打印事件

3.3 播放测试


一、编写目的

       在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也特别鸣谢:ZLMediaKitZlm4j。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。

二、代码集成

2.1 配置pom依赖

           这里用到了两个pom依赖,分别是本地的zlm4j依赖和jna依赖,zlm4j为核心库,jna为调用ZlmediaKit服务的库(注意这里不需要安装ZlmediaKit服务)。

<dependency>
            <groupId>com.aizuda</groupId>
            <artifactId>zlm4j</artifactId>
            <version>1.0.4</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/zlm4j-1.0.4.jar</systemPath>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.14.0</version>
        </dependency>

image.gif

2.2 配置类

       配置类也非常简单,ZLMApi实例是jna完成了对mk_api的加载,初始化SDK,然后创建对应的http服务、RTSP服务、RTMP服务、RTP服务,mkEvents实例在后续的代码中会完成对相应的推拉流鉴权事件、流变化事件的监听,以实现自定义的推拉流服务,有兴趣的朋友可以继续研究官方文档。

协议 端口
HTTP 7788
RTSP 9758
RTMP 9759
RTP 3200
package org.example;
import com.aizuda.zlm4j.core.ZLMApi;
import com.aizuda.zlm4j.structure.MK_EVENTS;
import com.sun.jna.Native;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ZlmServerConfig {
    @Bean
    public ZLMApi zlmApi(){
        //实例化API
        ZLMApi ZLM_API = Native.load("mk_api", ZLMApi.class);
        //初始化SDK配置
        ZLM_API.mk_env_init1(1, 1, 1, null, 0, 0, null, 0, null, null);
        //创建http服务器 0:失败,非0:端口号
        short http_server_port = ZLM_API.mk_http_server_start((short) 7788, 0);
        //创建rtsp服务器 0:失败,非0:端口号
        short rtsp_server_port = ZLM_API.mk_rtsp_server_start((short) 9758, 0);
        //创建rtmp服务器 0:失败,非0:端口号
        short rtmp_server_port = ZLM_API.mk_rtmp_server_start((short) 9759, 0);
        //创建RTP服务器 0:失败,非0:端口号 GB28181 rtp服务建议使用mk_rtp_server_create来创建和管理
        short rtp_server_port = ZLM_API.mk_rtp_server_start((short) 32000);
        return ZLM_API;
    }
    @Bean
    public MK_EVENTS mkEvents() {
        return new MK_EVENTS();
    }
}

image.gif

2.3 实现事件

       这里是在启动类的子线程中完成鉴权事件和流状态改变的回调事件,很容易理解,鉴权就是完成认证授权,流状态改变就是监控视频的上线和下线状态(如:无人机、直播间状态),这两个事件可满足大部分需求,然后通过zlmApi.mk_events_listen(mkEvents);创建事件的监听。还有很多其它监听事件,可通过上面提到的官方页面查阅。

package org.example;
import com.aizuda.zlm4j.core.ZLMApi;
import com.aizuda.zlm4j.structure.MK_EVENTS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main implements CommandLineRunner {
    @Autowired
    MK_EVENTS mkEvents;
    @Autowired
    ZLMApi zlmApi;
    public static void main(String[] args) {
        SpringApplication.run(Main.class,args);
    }
    @Override
    public void run(String... args) throws Exception {
        //推流回调 可控制鉴权、录制、转协议控制等
        mkEvents.on_mk_media_publish = (url_info, invoker, sender) -> {
            //这里拿到访问路径后(例如rtmp://xxxx/xxx/xxx?token=xxxx其中?后面就是拿到的参数)的参数
            // err_msg返回 空字符串表示鉴权成功 否则鉴权失败提示
            String param = zlmApi.mk_media_info_get_params(url_info);
            System.err.println("鉴权提醒:");
            zlmApi.mk_publish_auth_invoker_do(invoker, "", 0, 0);
        };
        zlmApi.mk_events_listen(mkEvents);
        //流状态改变回调
        mkEvents.on_mk_media_changed = (regist, sender) -> {
            System.out.println("app:"+zlmApi.mk_media_source_get_app(sender));
            System.out.println("stream:"+zlmApi.mk_media_source_get_stream(sender));
            System.out.println("schema:"+zlmApi.mk_media_source_get_schema(sender));
            System.out.println("这里是流改变回调通知:" + regist);
        };
        zlmApi.mk_events_listen(mkEvents);
    }
    
}

image.gif

三、推拉流测试

这里使用ffmpeg进行推流,同时使用VlC播放器进行播放测试。

3.1 推流命令

这里将桌面的input.mp4通过264编码推送到已经运行的rtsp服务端口,并携带token值用于测试鉴权事件的触发。

ffmpeg -re -an -i /home/seaua/Desktop/input.mp4 -c:v libx264 -f rtsp rtsp://127.0.0.1:9758/steam/1?token=112233

image.gif

3.2 打印事件

可以看到在服务终端中成功打印了发送的token验证和流流状态改变的通知。

image.gif 编辑

3.3 播放测试

在VLC播放器中使用视频链接:rtmp://127.0.0.1:9759/steam/1,这里也可以使用其它如flv等进行播放,可使用的协议与配置类中配置的服务一样,同时也可通过实现播放事件实现播放时的认证授权。

image.gif 编辑

您的关注是对我最大的鼓励❤

image.gif 编辑


目录
相关文章
|
网络协议 Linux
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
音视频学习之rtsp推拉流学习2(流媒体服务器ZLMediaKit)
3104 0
|
应用服务中间件 Linux nginx
nginx+nginx-http-flv-module
nginx+nginx-http-flv-module
1239 1
|
11月前
|
算法 关系型数据库 Java
Springboot集成PostGIS完成路径规划
因为公司里需要做关于林区防火方面的项目,需要完成着火后山区路径的导航,但.....某德的功能似乎只能到达山区的边上,后边的路就需要自己完成导航了。搞了一个周终于有所效果了,也遇见了很多的坑,在此记录一下,希望以后不要踩坑。需要上述的环境才能进行路径导航,环境的搭建可以参阅
331 5
|
11月前
|
IDE Java 开发工具
IntelliJ IDEA 使用技巧与插件推荐
IntelliJ IDEA 是一个功能强大、扩展性丰富的开发工具。通过掌握常用的快捷键和技巧,结合合适的插件,可以大幅提升你的开发效率。
503 1
|
移动开发 Java API
大疆无人机对接
本文介绍了大疆无人机对接第三方云平台的方案,包括设备对接和CloudAPI对接两种方式,重点讨论了CloudAPI对接。CloudAPI对接方案通过DJI Pilot 2或大疆机场将无人机与第三方云平台连接,实现低门槛接入,无需重复开发APP。方案优势在于让开发者更专注于业务开发,而非无人机功能适配。文章详细阐述了对接流程,包括环境准备、申请APPKey、对接流程、直播功能及获取无人机实时数据等内容,并提供了丰富的接口说明和技术支持资源。
11259 4
大疆无人机对接
|
10月前
|
Ubuntu 开发工具
Ubuntu 22.04 aarch64版本操作系统下编译ZLMediaKit教程
通过上述步骤,你可以在Ubuntu 22.04 aarch64版本上成功编译ZLMediaKit,这是一个相对简单而直接的过程,但可能会遇到一些需要根据具体系统环境和要求调整的地方。
1144 0
|
应用服务中间件 Linux nginx
FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作
这篇博客介绍了如何使用FFmpeg实现RTSP推流到RTMP服务器,并使用ffplay进行拉流操作,包括在Windows和Linux系统下的命令示例,以及如何通过HTML页面显示视频流。
4034 0
|
Web App开发 编解码 前端开发
怎么把rtsp视频流转成webrtc接口
【8月更文挑战第8天】将RTSP视频流转换为WebRTC接口涉及多个步骤:首先使用工具如webrtc-streamer、ffmpeg等从RTSP源获取视频流;接着对流进行解码与编码至WebRTC兼容格式(如VP8、H.264);然后利用WebSocket建立客户端与服务器间的双向信令通道;再通过JavaScript创建WebRTC PeerConnection并交换SDP信息;最后添加Track传输视频数据,并在接收端解析显示。使用webrtc-streamer可简化这一过程,其API支持多种操作如添加ICE候选、创建Offer等。
4335 2
|
存储 Java Linux
SpringBoot集成海康网络设备SDK
概述 设备网络SDK是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、NVR、网络摄像机、网络球机、视频服务器、解码器、报警主机、网络存储等产品服务的配套模块,用于远程访问和控制设备软件的二次开发。 功能 图像预览, 文件回放和下载, 云台控制, 布防/撤防, 语音对讲, 日志管理, 解码卡, 远程升级, 远程重启/关闭, 格式化硬盘, 参数配置(系统配置, 通道配置, 串口配置, 报警配置, 用户配置), 多路解码器, 智能设备功能和获取设备能力集等。
2892 120
|
编解码 前端开发 Java
SpringBoot集成ffmpeg实现视频转码播放
之前构建过文件预览服务,对于视频部分前端播放组件限制只能为mp4格式,为了支持更多视频格式决定对方案进行升级,由于视频格式较多,针对每一种格式定制选择播放器不太现实,决定对视频源统一转码,转码后的格式为mp4,兼容性稳定且前后端改造工作较小
1203 0