Welcome to Code Block's blog
本篇文章主要介绍了
[Springboot视频推拉流服务搭建]
博主广交技术好友,喜欢的可以关注一下❤
目录
一、编写目的
在工作中需要用到视频的推拉流服务,刚开始准备使用netty服务自己实现RTSP推拉流服务,但在RTSP解包时卡住,自己实现难度确实有点大,后来在网上找到了Zlm4j库,它是基于ZLMediaKit服务实现的Jna版本,可以很容易的集成到Springboot中,在此也特别鸣谢:ZLMediaKit和Zlm4j。希望本篇博客可以帮助到想快速实现视频推拉流服务的朋友。
二、代码集成
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>
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(); } }
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); } }
三、推拉流测试
这里使用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
3.2 打印事件
可以看到在服务终端中成功打印了发送的token验证和流流状态改变的通知。
编辑
3.3 播放测试
在VLC播放器中使用视频链接:rtmp://127.0.0.1:9759/steam/1,这里也可以使用其它如flv等进行播放,可使用的协议与配置类中配置的服务一样,同时也可通过实现播放事件实现播放时的认证授权。
编辑
您的关注是对我最大的鼓励❤
编辑