分享
ZLM4J常见问题及注意事项
输入“/”快速插入内容
⁉️
ZLM4J常见问题及注意事项
用户8510
用户8510
2025年4月27日修改
1.
在 windows 下出现 java.lang.UnsatisfiedLinkError 问题
目前在1.0.6版本后已windows全部使用静态库链接,不会再出现 java.lang.UnsatisfiedLinkError错误。
1.0.6前通常由于缺少openssl库导致错误的发生,复制libssl-3-x64.dll&libcrypto-3-x64.dll到C:/Windows/System32下.
2.
在mac下出现 java.lang.UnsatisfiedLinkError 问题
通常需要安装
◦
openssl3
https://www.openssl.org/source/old/3.0/
◦
libsrtp2
https://formulae.brew.sh/formula/srtp
3.
出现
Unable to load library 'mk_api': Native library (xxxx/yyyy) not found in resource path 问题
说明当前系统的动态链接库未集成,需要自行编译,并把编译好的动态链接库
yyyy
放入项目resource/
xxxxx
下。
3.
hls协议出现延迟过大且配置切片时间(切片时间变成8S)无效
◦
切片时间配置无效问题,这是由于hls切片需要以I帧开头,请检查编码的GOP是多少,所以hls切片由配置和GOP共同控制谁大为准,这就是为什么切片时长配置失效原因。例如帧率为25 GOP配置100 切片大小配置2s 这种配置下实际切片大小为4s,
通常发生在新版本的OBS推流中GOP间隔了8s。
◦
卡顿问题,也是由于GOP设置的不是帧率的倍数(例如帧率为50 GOP可以为(5 10 25 50 100 150 )类似这样)或者GOP和切片大小冲突,例如帧率为25 切片大小配置3s 但是GOP是50 这样一个切片只能包含1.5组GOP,但是需要保证切片完整切片,则需要计算还需要加载多少帧,导致出现卡顿。所以建议GOP小于等于帧率。具体查找资料参考。
4.
hls协议已开启却无法播放
◦
首先检查配置配置中http.rootPath是否正确配置 且 protocol.hls_save_path是否配置,建议https.rootPath配置与protocol.hls_save_path配置目录相同。
◦
是否使用子模块配置了hls_save_path,导致与全局不一样,参考:
ZLM4J参数配置
◦
检查播放鉴权是否开启,且规则正确 播放鉴权参考:
ZLM4J事件回调
◦
检查http服务mk_http_server_start是否调用且端口是否冲突 参考
5.
关于修改分辨率、修改码率、添加水印
ZLM4J只作为流媒体服务器,不提供编解码操作,如要实现这些功能建议搭配FFmpeg、JavaCV等工具来配合实现。
6.
关于出现flv一般只支持H264和AAC编码,该编码格式可能不被播放器支持:H265
原因是目前rtmp协议的封装格式flv不支持
H265
编码的视频,而国内为了让flv支持
H265
,修改了flv封装标准,采用扩展VideoTagHeader头中CodecID为12及VideoTagBody中增加HVCVIDEOPACKET的方式从而使flv支持H265编码视频,参考
https://github.com/ksvc/FFmpeg/wiki
,但是这一修改不被主流播放器支持例如vlc和ffplay,所以提示这个警告,但是国内大部分cdn及web播放器(jessibuca、flv.js)都支持此标准。
最新的
Enhanced-
RTMP
标准已经支持H265,但是flv的封装格式发生变化。ZLM4J在转rtmp协议中提供配置是否转为CodeID=12方式还是
Enhanced-RTMP
方式,配置在rtmp.enhanced=0,默认为CodeID=12方式。
7.
集群模式
边缘集群模式可以自己实现,源站作为流输入站,从站作为流输出站,原理就是所有拉流代理或者推流都创建在源站上,源站通过流状态回调来把注册上来的流同步到从站,这样就实现这种边缘集群模式。具体流管理、边缘站管理逻辑可以自己实现。
8.
JVM参数优化
如果遇到 SIGSEGV 信号错误导致的程序崩溃,排除访问空指针问题后,可能需要调整jvm参数
代码块
Java
-Xss4m #控制每个线程的调用栈大小,影响递归深度和局部变量存储空间
-Djna.nosys=true #禁用系统调用优化(可选)
-Djna.dump_memory=false #设置为 true 可调试内存访问问题(生产环境应保持 false)
-XX:MaxDirectMemorySize=2048m #JNA 使用直接内存与本地代码交换数据 默认等于 -Xmx,可以单独设置更大值