同步操作将从 aizuda/zlm4j 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
飞书文档直达 https://ux5phie02ut.feishu.cn/wiki/NA2ywJRY2ivALSkPfUycZFM4nUB?from=from_copylink
zlm4j开源流媒体服务框架 ZLMediaKit C Api 的 Java 实现
感谢 @夏楚 提供了这么好的开源流媒体服务框架ZLMediaKit
本项目是对 ZLMediaKit 提供的 C Api 的 Java Api 封装(部分封装)。采用 JNA 对 ZLMediaKit C Api 进行解析,并进行微调和修改,基于 ZLMediaKit 项目的调用原始风格,各位网友可以参照 ZLMediaKit 原始项目文档编写应用程序。
使用此项目可以实现现有项目快速集成流媒体服务功能,无需部署额外的流媒体服务器,利用原始流事件回调更加方便的操作流( 推拉流鉴权、按需拉流、自动关流、转协议、截图、录制、国标GB推流)
具体如何集成到项目可以参考JMediaServer
注意示例代码只提供部分功能演示,更多功能请阅读项目文档。
public class Test {
//动态链接库放在/resource/win32-x86-64&/resource/linux-x86-64下JNA会自动查找目录
public static ZLMApi ZLM_API = Native.load("mk_api", ZLMApi.class);
//Windows环境测试
//public static ZLMApi ZLM_API = Native.load("E:\\ZLMediaKit\\release\\windows\\Debug\\mk_api.dll", ZLMApi.class);
//Linux环境测试
//public static ZLMApi ZLM_API = Native.load("/opt/media/libmk_api.so", ZLMApi.class);
public static void main(String[] args) throws InterruptedException {
//初始化sdk配置
ZLM_API.mk_env_init2(1, 1, 1, null, 0, 0, null, 0, null, null);
//初始化环境配置
MK_INI mkIni = ZLM_API.mk_ini_default();
//配置参数 全部配置参数及说明见(resources/conf.ini) 打开自动关流 对应conf.ini中配置[protocol]
ZLM_API.mk_ini_set_option(mkIni, "general.mediaServerId", "JMediaServer");
ZLM_API.mk_ini_set_option(mkIni, "http.notFound", "<h1 style=\"text-align:center;\">Media Server V1.0 By LiDaoFu</h1>");
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.auto_close",0);
ZLM_API.mk_ini_set_option_int(mkIni, "general.streamNoneReaderDelayMS", 30000);
ZLM_API.mk_ini_set_option_int(mkIni, "general.maxStreamWaitMS", 30000);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_ts", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_hls",1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_fmp4", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_rtsp", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_rtmp", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_mp4", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_hls_fmp4", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_audio", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.mp4_as_player", 1);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.mp4_max_second", 3600);
ZLM_API.mk_ini_set_option(mkIni, "http.rootPath","D:/www");
ZLM_API.mk_ini_set_option(mkIni, "protocol.mp4_save_path", "D:/www");
ZLM_API.mk_ini_set_option(mkIni, "protocol.hls_save_path","D:/www");
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.hls_demand", 0);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.rtsp_demand", 0);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.rtmp_demand", 0);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.ts_demand", 0);
ZLM_API.mk_ini_set_option_int(mkIni, "protocol.fmp4_demand", 0);
//全局回调 全部回调见MK_EVENTS内所有的回调属性,如果配置了推流回调、播放回调请务必执行invoker_do,否则无法推流、回放
MK_EVENTS mkEvents = new MK_EVENTS();
//流状态改变回调
mkEvents.on_mk_media_changed = (regist, sender) -> {
System.out.println("app:"+ZLM_API.mk_media_source_get_app(sender));
System.out.println("stream:"+ZLM_API.mk_media_source_get_stream(sender));
System.out.println("schema:"+ZLM_API.mk_media_source_get_schema(sender));
System.out.println("这里是流改变回调通知:" + regist);
};
//无人观看回调
mkEvents.on_mk_media_no_reader = sender -> {
System.out.println("这里是无人观看回调通知");
ZLM_API.mk_media_source_close(sender, 1);
};
//推流回调 可控制鉴权、录制、转协议控制等
mkEvents.on_mk_media_publish = (url_info, invoker, sender) -> {
//这里拿到访问路径后(例如rtmp://xxxx/xxx/xxx?token=xxxx其中?后面就是拿到的参数)的参数
// err_msg返回 空字符串表示鉴权成功 否则鉴权失败提示
//String param = ZLM_API.mk_media_info_get_params(url_info);
ZLM_API.mk_publish_auth_invoker_do(invoker, "", 0, 0);
};
//添加全局回调
ZLM_API.mk_events_listen(mkEvents);
//Pointer iniPointer = ZLM_API.mk_ini_dump_string(mkIni);
//创建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) 554, 0);
//创建rtmp服务器 0:失败,非0:端口号
short rtmp_server_port = ZLM_API.mk_rtmp_server_start((short) 1935, 0);
//创建RTC服务器 0:失败,非0:端口号
short rtc_server_port = ZLM_API.mk_rtc_server_start((short)8000);
/*****************************下面为推流及播放********************************/
// 推流:利用obs、ffmpeg 进行推流 RTMP推流:rtmp://127.0.0.1:rtmp_port/流APP/流名称 RTSP推流:rtsp://127.0.0.1:rtsp_port/流APP/流名称
// 下面是各协议拉流播放的访问格式
// HTTP-FLV拉流:http://ip:http_port/流APP/流名称.live.flv
// WS-FLV拉流:ws://ip:http_port/流APP/流名称.live.flv
// HLS拉流:http://ip:http_port/流APP/流名称/hls.m3u8
// RTMP拉流:rtmp://ip:rtmp_port/流APP/流名称
// RTSP拉流:rtsp://ip:rtsp_port/流APP/流名称
/*****************************下面为流代理演示********************************/
//创建拉流代理
MK_INI option = ZLM_API.mk_ini_create();
ZLM_API.mk_ini_set_option_int(option,"hls_enabled",0);
ZLM_API.mk_ini_set_option_int(option,"enable_mp4",0);
ZLM_API.mk_ini_set_option_int(option,"enable_audio",0);
ZLM_API.mk_ini_set_option_int(option,"enable_fmp4",0);
ZLM_API.mk_ini_set_option_int(option,"enable_ts",0);
ZLM_API.mk_ini_set_option_int(option,"enable_hls",0);
ZLM_API.mk_ini_set_option_int(option,"enable_rtsp",1);
ZLM_API.mk_ini_set_option_int(option,"enable_rtmp",1);
ZLM_API.mk_ini_set_option_int(option,"mp4_max_second",3600);
//ZLM_API.mk_ini_set_option(option,"mp4_save_path","D:/record");
//ZLM_API.mk_ini_set_option(option,"hls_save_path","D:/record");
ZLM_API.mk_ini_set_option_int(option,"add_mute_audio",0);
ZLM_API.mk_ini_set_option_int(option,"auto_close",1);
MK_PROXY_PLAYER mk_proxy = ZLM_API.mk_proxy_player_create4("__defaultVhost__", "live", "test",option,2);
//设置代理参数 rtp_type rtsp播放方式:RTP_TCP = 0, RTP_UDP = 1, RTP_MULTICAST = 2
ZLM_API.mk_proxy_player_set_option(mk_proxy, "rtp_type", "1");
//设置代理参数 protocol_timeout_ms 协议超时时间 毫秒
ZLM_API.mk_proxy_player_set_option(mk_proxy, "protocol_timeout_ms", "2000");
//开始播放
ZLM_API.mk_proxy_player_play(mk_proxy, "rtsp://admin:hk123456@192.168.1.64/h264/ch1/sub/av_stream");
//释放资源
ZLM_API.mk_ini_release(option);
//回调关闭事件
IMKProxyPlayCloseCallBack imkProxyPlayCloseCallBack = new IMKProxyPlayCloseCallBack() {
@Override
public void invoke(Pointer pUser, int err, String what, int sys_err) {
//这里Pointer是ZLM维护的不需要我们释放 遵循谁申请谁释放原则
ZLM_API.mk_proxy_player_release(new MK_PROXY_PLAYER(pUser));
}
};
//添加代理关闭回调 并把代理客户端传过去释放
ZLM_API.mk_proxy_player_set_on_close(mk_proxy, imkProxyPlayCloseCallBack, mk_proxy.getPointer());
/*****************************end********************************/
//阻塞60s
Thread.sleep(60000L);
//停止所有服务器
ZLM_API.mk_stop_all_server();
}
}
可直接复制代码到自己的项目中,方便修改参数进行二次开发
jar已发布到maven重要仓库,如需修改动态链接库请拉取项目install,并把动态链接库放入对应的目录。
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>zlm4j</artifactId>
<version>${lasted}</version>
</dependency>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。