zlmediakit搭建直播推流服务

参考连接

夏楚/ZLMediaKit gitee仓库(基于C++开发的高性能流媒体服务器)

aizuda/zlm4j - 开源流媒体框架ZLMediaKit C API JAVA实现,打造属于自己的流媒体服务

【实战】ZLMediaKit部署及使用 - docker镜像部署

Docker 简单部署 ZLMediaKit 超详细图文步骤

一个基于 Vue2 + ZLMediaKit 流媒体服务实现的零成本流媒体 WEB 管理开源项目

ZLMediaKit实现海康监控摄像头实时播放+RTSP流浏览器可播放转码方案调研+获取视频截图

【FFmpeg】使用 ffmpeg 命令实现直播推拉流 ( 推流和拉流简介 | 流媒体服务器搭建 | 使用 ffmpeg 命令进行推流操作 | 使用 ffmpeg/ffplay 命令进行拉流操作 )

panll/wvp-GB28181-pro - star有3k+

文章目录

功能列表

docker部署zlmediakit

1、拉取镜像

sh 复制代码
docker pull zlmediakit/zlmediakit:master

2、启动容器

  • 确保docker开机自启命令: systemctl enable docker.service

  • 启动容器时加入参数 --restart=always 实现容器自动重启,前提docker服务开启了自动重启

    sh 复制代码
    #此镜像为github持续集成自动编译推送,跟代码(master分支)保持最新状态
    docker run -id \
    --restart=always \
    -p 1935:1935 \
    -p 8080:80 \
    -p 8443:443 \
    -p 8554:554 \
    -p 10000:10000 \
    -p 10000:10000/udp \
    -p 8000:8000/udp \
    -p 9000:9000/udp \
    zlmediakit/zlmediakit:master
  • 说明: rtmp默认端口1935, rtsp默认端口554,http默认端口80, SSL默认端口443

  • 查看secret

3、web控制台

访问地址:http://192.168.134.3:8080 或者 https://192.168.134.3:8443


4、推流测试

下面5条命令都在本机测试过了,并使用vlc测试播放都可以(推流到哪个地址,就在vlc中用哪个地址播放)

(rtsp用ffmpeg可以推流过去,但是rtsp使用obs推流提示无法连接服务器;obs推流到rtmp是可以的)

sh 复制代码
# 推送文件

ffmpeg -re -i "d:/tmp/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.134.3:8554/live/test	

ffmpeg -re -i "d:/tmp/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtmp://192.168.134.3/live/test

ffmpeg -re -i "d:/tmp/test.mp4" -vcodec h264 -acodec aac -f rtp_mpegts rtp://192.168.134.3:10000

# 推送桌面

ffmpeg.exe  -f gdigrab -i desktop -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.134.3:8554/live/test	

ffmpeg.exe  -f gdigrab -i desktop -vcodec libx264 -f flv rtmp://192.168.134.3/flv/test

rtsp推流测试


5、 配置文件详解

docker部署中,该位置位置在:/opt/media/conf/config.ini

sh 复制代码
#!!!!此配置文件为范例配置文件,意在告诉读者,各个配置项的具体含义和作用,
#!!!!该配置文件在执行cmake时,会拷贝至release/${操作系统类型}/${编译类型}(例如release/linux/Debug) 文件夹。
#!!!!该文件夹(release/${操作系统类型}/${编译类型})同时也是可执行程序生成目标路径,在执行MediaServer进程时,它会默认加载同目录下的config.ini文件作为配置文件,
#!!!!你如果修改此范例配置文件(conf/config.ini),并不会被MediaServer进程加载,因为MediaServer进程默认加载的是release/${操作系统类型}/${编译类型}/config.ini。
#!!!!当然,你每次执行cmake,该文件确实会被拷贝至release/${操作系统类型}/${编译类型}/config.ini,
#!!!!但是一般建议你直接修改release/${操作系统类型}/${编译类型}/config.ini文件,修改此文件一般不起作用,除非你运行MediaServer时使用-c参数指定到此文件。

[api]
#是否调试http api,启用调试后,会打印每次http请求的内容和回复
apiDebug=1
#一些比较敏感的http api在访问时需要提供secret,否则无权限调用
#如果是通过127.0.0.1访问,那么可以不提供secret
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
#截图保存路径根目录,截图通过http api(/index/api/getSnap)生成和获取
snapRoot=./www/snap/
#默认截图图片,在启动FFmpeg截图后但是截图还未生成时,可以返回默认的预设图片
defaultSnap=./www/logo.png
#downloadFile http接口可访问文件的根目录,支持多个目录,不同目录通过分号(;)分隔
downloadRoot=./www

[ffmpeg]
#FFmpeg可执行程序路径,支持相对路径/绝对路径
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通过该模板可以设置再编码的一些参数
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截图的命令,可以通过修改该配置改变截图分辨率或质量
snap=%s -i %s -y -f mjpeg -frames:v 1 -an %s
#FFmpeg日志的路径,如果置空则不生成FFmpeg日志
#可以为相对(相对于本可执行程序目录)或绝对路径
log=./ffmpeg/ffmpeg.log
# 自动重启的时间(秒), 默认为0, 也就是不自动重启. 主要是为了避免长时间ffmpeg拉流导致的不同步现象
restart_sec=0

#转协议相关开关;如果addStreamProxy api和on_publish hook回复未指定转协议参数,则采用这些配置项
[protocol]
#转协议时,是否开启帧级时间戳覆盖
# 0:采用源视频流绝对时间戳,不做任何改变
# 1:采用zlmediakit接收数据时的系统时间戳(有平滑处理)
# 2:采用源视频流时间戳相对时间戳(增长量),有做时间戳跳跃和回退矫正
modify_stamp=2
#转协议是否开启音频
enable_audio=1
#添加acc静音音频,在关闭音频时,此开关无效
add_mute_audio=1
#无人观看时,是否直接关闭(而不是通过on_none_reader hook返回close)
#此配置置1时,此流如果无人观看,将不触发on_none_reader hook回调,
#而是将直接关闭流
auto_close=0

#推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。
#置0关闭此特性(推流断开会导致立即断开播放器)
#此参数不应大于播放器超时时间;单位毫秒
continue_push_ms=15000

#平滑发送定时器间隔,单位毫秒,置0则关闭;开启后影响cpu性能同时增加内存
#该配置开启后可以解决一些流发送不平滑导致zlmediakit转发也不平滑的问题
paced_sender_ms=0

#是否开启转换为hls(mpegts)
enable_hls=1
#是否开启转换为hls(fmp4)
enable_hls_fmp4=0
#是否开启MP4录制
enable_mp4=0
#是否开启转换为rtsp/webrtc
enable_rtsp=1
#是否开启转换为rtmp/flv
enable_rtmp=1
#是否开启转换为http-ts/ws-ts
enable_ts=1
#是否开启转换为http-fmp4/ws-fmp4
enable_fmp4=1

#是否将mp4录制当做观看者
mp4_as_player=0
#mp4切片大小,单位秒
mp4_max_second=3600
#mp4录制保存路径
mp4_save_path=./www

#hls录制保存路径
hls_save_path=./www

###### 以下是按需转协议的开关,在测试ZLMediaKit的接收推流性能时,请把下面开关置1
###### 如果某种协议你用不到,你可以把以下开关置1以便节省资源(但是还是可以播放,只是第一个播放者体验稍微差点),
###### 如果某种协议你想获取最好的用户体验,请置0(第一个播放者可以秒开,且不花屏)
#hls协议是否按需生成,如果hls.segNum配置为0(意味着hls录制),那么hls将一直生成(不管此开关)
hls_demand=0
#rtsp[s]协议是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv协议是否按需生成
rtmp_demand=0
#http[s]-ts协议是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4协议是否按需生成
fmp4_demand=0

[general]
#是否启用虚拟主机
enableVhost=0
#播放器或推流器在断开后会触发hook.on_flow_report事件(使用多少流量事件),
#flowThreshold参数控制触发hook.on_flow_report事件阈值,使用流量超过该阈值后才触发,单位KB
flowThreshold=1024
#播放最多等待时间,单位毫秒
#播放在播放某个流时,如果该流不存在,
#ZLMediaKit会最多让播放器等待maxStreamWaitMS毫秒
#如果在这个时间内,该流注册成功,那么会立即返回播放器播放成功
#否则返回播放器未找到该流,该机制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒
#在配合hook.on_stream_none_reader事件时,可以做到无人观看自动停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始,
#如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写)
resetWhenRePlay=1
#合并写缓存大小(单位毫秒),合并写指服务器缓存一定的数据后才会一次性写入socket,这样能提高性能,但是会提高延时
#开启后会同时关闭TCP_NODELAY并开启MSG_MORE
mergeWriteMS=0
#服务器唯一id,用于触发hook时区别是哪台服务器
mediaServerId=your_server_id

#最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track
wait_track_ready_ms=10000
#最多等待音频Track收到数据时间,单位毫秒,超时且完全没收到音频数据,忽略音频Track
#加快某些带封装的流metadata说明有音频,但是实际上没有的流ready时间(比如很多厂商的GB28181 PS)
wait_audio_track_data_ms=1000
#如果流只有单Track,最多等待若干毫秒,超时后未收到其他Track的数据,则认为是单Track
#如果协议元数据有声明特定track数,那么无此等待时间
wait_add_track_ms=3000
#如果track未就绪,我们先缓存帧数据,但是有最大个数限制,防止内存溢出
unready_frame_cache=100
#是否启用观看人数变化事件广播,置1则启用,置0则关闭
broadcast_player_count_changed=0
#绑定的本地网卡ip
listen_ip=::

[hls]
#hls写文件的buf大小,调整参数可以提高文件io性能
fileBufSize=65536
#hls最大切片时间
segDur=2
#m3u8索引中,hls保留切片个数(实际保留切片个数+segRetain个)
#如果设置为0,则不删除切片且m3u8文件全量记录切片列表
segNum=3
#HLS切片延迟个数,大于0将生成hls_delay.m3u8文件,0则不生成
segDelay=0
#HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数
segRetain=5
#是否广播 hls切片(ts/fmp4)完成通知(on_record_ts)
broadcastRecordTs=0
#直播hls文件删除延时,单位秒,issue: #913
deleteDelaySec=10
#此选项开启后m3u8文件还是表现为直播,但是切片文件会被全部保留为点播用
#segDur设置为0或segKeep设置为1的情况下,每个切片文件夹下会生成一个vod.m3u8文件用于点播该时间段的录像
segKeep=0
#如果设置为1,则第一个切片长度强制设置为1个GOP。当GOP小于segDur,可以提高首屏速度
fastRegister=0

[hook]
#是否启用hook事件,启用后,推拉流都将进行鉴权
enable=0
#播放器或推流器使用流量事件,置空则关闭
on_flow_report=
#访问http文件鉴权事件,置空则关闭鉴权
on_http_access=
#播放鉴权事件,置空则关闭鉴权
on_play=
#推流鉴权事件,置空则关闭鉴权
on_publish=
#录制mp4切片完成事件
on_record_mp4=
# 录制 hls ts(或fmp4) 切片完成事件
on_record_ts=
#rtsp播放鉴权事件,此事件中比对rtsp的用户名密码
on_rtsp_auth=
#rtsp播放是否开启专属鉴权事件,置空则关闭rtsp鉴权。rtsp播放鉴权还支持url方式鉴权
#建议开发者统一采用url参数方式鉴权,rtsp用户名密码鉴权一般在设备上用的比较多
#开启rtsp专属鉴权后,将不再触发on_play鉴权事件
on_rtsp_realm=
#远程telnet调试鉴权事件
on_shell_login=
#直播流注册或注销事件
on_stream_changed=
#过滤on_stream_changed hook的协议类型,可以选择只监听某些感兴趣的协议;置空则不过滤协议
stream_changed_schemas=rtsp/rtmp/fmp4/ts/hls/hls.fmp4
#无人观看流事件,通过该事件,可以选择是否关闭无人观看的流。配合general.streamNoneReaderDelayMS选项一起使用
on_stream_none_reader=
#播放时,未找到流事件,通过配合hook.on_stream_none_reader事件可以完成按需拉流
on_stream_not_found=
#服务器启动报告,可以用于服务器的崩溃重启事件监听
on_server_started=
#服务器退出报告,当服务器正常退出时触发
on_server_exited=
#server保活上报
on_server_keepalive=
#发送rtp(startSendRtp)被动关闭时回调
on_send_rtp_stopped=
#rtp server 超时未收到数据
on_rtp_server_timeout=

#hook api最大等待回复时间,单位秒
timeoutSec=10
#keepalive hook触发间隔,单位秒,float类型
alive_interval=10.0
#hook通知失败重试次数,正整数。为0不重试,1时重试一次,以此类推
retry=1
#hook通知失败重试延时,单位秒,float型
retry_delay=3.0

[cluster]
#设置源站拉流url模板, 格式跟printf类似,第一个%s指定app,第二个%s指定stream_id,
#开启集群模式后,on_stream_not_found和on_stream_none_reader hook将无效.
#溯源模式支持以下类型:
#rtmp方式: rtmp://127.0.0.1:1935/%s/%s
#rtsp方式: rtsp://127.0.0.1:554/%s/%s
#hls方式: http://127.0.0.1:80/%s/%s/hls.m3u8
#http-ts方式: http://127.0.0.1:80/%s/%s.live.ts
#支持多个源站,不同源站通过分号(;)分隔
origin_url=
#溯源总超时时长,单位秒,float型;假如源站有3个,那么单次溯源超时时间为timeout_sec除以3
#单次溯源超时时间不要超过general.maxStreamWaitMS配置
timeout_sec=15
#溯源失败尝试次数,-1时永久尝试
retry_count=3

[http]
#http服务器字符编码集
charSet=utf-8
#http链接超时时间
keepAliveSecond=30
#http请求体最大字节数,如果post的body太大,则不适合缓存body在内存
maxReqSize=40960
#404网页内容,用户可以自定义404网页
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您访问的资源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服务器监听端口
port=80
#http文件服务器根目录
#可以为相对(相对于本可执行程序目录)或绝对路径
rootPath=./www
#http文件服务器读文件缓存大小,单位BYTE,调整该参数可以优化文件io性能
sendBufSize=65536
#https服务器监听端口
sslport=443
#是否显示文件夹菜单,开启后可以浏览文件夹
dirMenu=1
#虚拟目录, 虚拟目录名和文件路径使用","隔开,多个配置路径间用";"隔开
#例如赋值为 app_a,/path/to/a;app_b,/path/to/b 那么
#访问 http://127.0.0.1/app_a/file_a 对应的文件路径为 /path/to/a/file_a
#访问 http://127.0.0.1/app_b/file_b 对应的文件路径为 /path/to/b/file_b
#访问其他http路径,对应的文件路径还是在rootPath内
virtualPath=
#禁止后缀的文件使用mmap缓存,使用","隔开
#例如赋值为 .mp4,.flv
#那么访问后缀为.mp4与.flv 的文件不缓存
forbidCacheSuffix=
#可以把http代理前真实客户端ip放在http头中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否则可能导致伪造客户端ip
forwarded_ip_header=
#默认允许所有跨域请求
allow_cross_domains=1
#允许访问http api和http文件索引的ip地址范围白名单,置空情况下不做限制
allow_ip_range=::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255

[multicast]
#rtp组播截止组播ip地址
addrMax=239.255.255.255
#rtp组播起始组播ip地址
addrMin=239.0.0.0
#组播udp ttl
udpTTL=64

[record]
#mp4录制或mp4点播的应用名,通过限制应用名,可以防止随意点播
#点播的文件必须放置在此文件夹下
appName=record
#mp4录制写文件缓存,单位BYTE,调整参数可以提高文件io性能
fileBufSize=65536
#mp4点播每次流化数据量,单位毫秒,
#减少该值可以让点播数据发送量更平滑,增大该值则更节省cpu资源
sampleMS=500
#mp4录制完成后是否进行二次关键帧索引写入头部
fastStart=0
#MP4点播(rtsp/rtmp/http-flv/ws-flv)是否循环播放文件
fileRepeat=0
#MP4录制写文件格式是否采用fmp4,启用的话,断电未完成录制的文件也能正常打开
enableFmp4=0

[rtmp]
#rtmp必须在此时间内完成握手,否则服务器会断开链接,单位秒
handshakeSecond=15
#rtmp超时时间,如果该时间内未收到客户端的数据,
#或者tcp发送缓存超过这个时间,则会断开连接,单位秒
keepAliveSecond=15
#rtmp服务器监听端口
port=1935
#rtmps服务器监听地址
sslport=0
# rtmp是否直接代理模式
directProxy=1
#h265 rtmp打包采用增强型rtmp标准还是国内拓展标准
enhanced=0

[rtp]
#音频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400
#加大该值会明显增加直播延时
audioMtuSize=600
#视频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400
videoMtuSize=1400
#rtp包最大长度限制,单位KB,主要用于识别TCP上下文破坏时,获取到错误的rtp
rtpMaxSize=10
# rtp 打包时,低延迟开关,默认关闭(为0),h264存在一帧多个slice(NAL)的情况,在这种情况下,如果开启可能会导致画面花屏
lowLatency=0
# H264 rtp打包模式是否采用stap-a模式(为了在老版本浏览器上兼容webrtc)还是采用Single NAL unit packet per H.264 模式
# 有些老的rtsp设备不支持stap-a rtp,设置此配置为0可提高兼容性
h264_stap_a=1

[rtp_proxy]
#导出调试数据(包括rtp/ps/h264)至该目录,置空则关闭数据导出
dumpDir=
#udp和tcp代理服务器,支持rtp(必须是ts或ps类型)代理
port=10000
#rtp超时时间,单位秒
timeoutSec=15
#随机端口范围,最少确保36个端口
#该范围同时限制rtsp服务器udp端口范围
port_range=30000-35000
#rtp h264 负载的pt
h264_pt=98
#rtp h265 负载的pt
h265_pt=99
#rtp ps 负载的pt
ps_pt=96
#rtp opus 负载的pt
opus_pt=100
#RtpSender相关功能是否提前开启gop缓存优化级联秒开体验,默认开启
#如果不调用startSendRtp相关接口,可以置0节省内存
gop_cache=1

#国标发送g711 rtp 打包时,每个包的语音时长是多少,默认是100 ms,范围为20~180ms (gb28181-2016,c.2.4规定),
#最好为20 的倍数,程序自动向20的倍数取整
rtp_g711_dur_ms = 100
#udp接收数据socket buffer大小配置
#4*1024*1024=4196304
udp_recv_socket_buffer=4194304

[rtc]
#rtc播放推流、播放超时时间
timeoutSec=15
#本机对rtc客户端的可见ip,作为服务器时一般为公网ip,可有多个,用','分开,当置空时,会自动获取网卡ip
#同时支持环境变量,以$开头,如"$EXTERN_IP"; 请参考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据,
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
#需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致
port=8000
#rtc tcp服务器监听端口号,在udp 不通的情况下,会使用tcp传输数据
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
#需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致
tcpPort = 8000
#设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质
#目前已经实现twcc自动调整码率,关闭remb根据真实网络状况调整码率
rembBitRate=0
#rtc支持的音频codec类型,在前面的优先级更高
#以下范例为所有支持的音频codec
preferredCodecA=PCMA,PCMU,opus,mpeg4-generic
#rtc支持的视频codec类型,在前面的优先级更高
#以下范例为所有支持的视频codec
preferredCodecV=H264,H265,AV1,VP9,VP8

#webrtc比特率设置
start_bitrate=0
max_bitrate=0
min_bitrate=0

#nack接收端, rtp发送端,zlm发送rtc流
#rtp重发缓存列队最大长度,单位毫秒
maxRtpCacheMS=5000
#rtp重发缓存列队最大长度,单位个数
maxRtpCacheSize=2048

#nack发送端,rtp接收端,zlm接收rtc推流
#最大保留的rtp丢包状态个数
nackMaxSize=2048
#rtp丢包状态最长保留时间
nackMaxMS=3000
#nack最多请求重传次数
nackMaxCount=15
#nack重传频率,rtt的倍数
nackIntervalRatio=1.0
#nack包中rtp个数,减小此值可以让nack包响应更灵敏
nackRtpSize=8

[srt]
#srt播放推流、播放超时时间,单位秒
timeoutSec=5
#srt udp服务器监听端口号,所有srt客户端将通过该端口传输srt数据,
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
port=9000
#srt 协议中延迟缓存的估算参数,在握手阶段估算rtt ,然后latencyMul*rtt 为最大缓存时长,此参数越大,表示等待重传的时长就越大
latencyMul=4
#包缓存的大小
pktBufSize=8192


[rtsp]
#rtsp专有鉴权方式是采用base64还是md5方式
authBasic=0
#rtsp拉流、推流代理是否是直接代理模式
#直接代理后支持任意编码格式,但是会导致GOP缓存无法定位到I帧,可能会导致开播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu会导致无法使用udp方式代理
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式来支持rtsp代理
#如果你是rtsp推拉流,但是webrtc播放,也建议关闭直接代理模式,
#因为直接代理时,rtp中可能没有sps pps,会导致webrtc无法播放; 另外webrtc也不支持Single NAL Unit Packets类型rtp
#默认开启rtsp直接代理,rtmp由于没有这些问题,是强制开启直接代理的
directProxy=1
#rtsp必须在此时间内完成握手,否则服务器会断开链接,单位秒
handshakeSecond=15
#rtsp超时时间,如果该时间内未收到客户端的数据,
#或者tcp发送缓存超过这个时间,则会断开连接,单位秒
keepAliveSecond=15
#rtsp服务器监听地址
port=554
#rtsps服务器监听地址
sslport=0
#rtsp 转发是否使用低延迟模式,当开启时,不会缓存rtp包,来提高并发,可以降低一帧的延迟
lowLatency=0
#强制协商rtp传输方式 (0:TCP,1:UDP,2:MULTICAST,-1:不限制)
#当客户端发起RTSP SETUP的时候如果传输类型和此配置不一致则返回461 Unsupported transport
#迫使客户端重新SETUP并切换到对应协议。目前支持FFMPEG和VLC
rtpTransportType=-1
[shell]
#调试telnet服务器接受最大bufffer大小
maxReqSize=1024
#调试telnet服务器监听端口
port=0

6、启动参数

sh 复制代码
# 通过 -h 可以了解启动参数
./MediaServer -h

# 以守护进程模式启动
./MediaServer -d &


7、WebHook

MediaServer 可以把内部的一些事件通过 http post 第三方 http 服务器的方式通知出去;

修改config.ini配置

1、先将容器中的config.ini拷贝到宿主机

sh 复制代码
docker cp 容器名:/opt/media/conf/config.ini /mediakit/conf/config.ini

2、修改配置文件,参考:Web Hook 接口

sh 复制代码
[hook]

alive_interval=10.0
enable=1

on_flow_report=http://192.168.134.5:8081/index/hook/on_flow_report
on_http_access=http://192.168.134.5:8081/index/hook/on_http_access
on_play=http://192.168.134.5:8081/index/hook/on_play
on_publish=http://192.168.134.5:8081/index/hook/on_publish
on_record_mp4=http://192.168.134.5:8081/index/hook/on_record_mp4
on_record_ts=http://192.168.134.5:8081/index/hook/on_record_ts
on_rtp_server_timeout=http://192.168.134.5:8081/index/hook/on_rtp_server_timeout
on_rtsp_auth=http://192.168.134.5:8081/index/hook/on_rtsp_auth
on_rtsp_realm=http://192.168.134.5:8081/index/hook/on_rtsp_realm
on_send_rtp_stopped=http://192.168.134.5:8081/index/hook/on_send_rtp_stopped
on_server_exited=http://192.168.134.5:8081/index/hook/on_server_exited
on_server_keepalive=http://192.168.134.5:8081/index/hook/on_server_keepalive
on_server_started=http://192.168.134.5:8081/index/hook/on_server_started
on_shell_login=http://192.168.134.5:8081/index/hook/on_shell_login
on_stream_changed=http://192.168.134.5:8081/index/hook/on_stream_changed
on_stream_none_reader=http://192.168.134.5:8081/index/hook/on_stream_none_reader
on_stream_not_found=http://192.168.134.5:8081/index/hook/on_stream_not_found

retry=1
retry_delay=3.0
stream_changed_schemas=rtsp/rtmp/fmp4/ts/hls/hls.fmp4
timeoutSec=10

启动容器

网络模式使用host,以便能够让本机能够收到虚拟机中的容器中的请求,并且挂载修改好的配置文件(修改配置,然后重启容器,即可让配置文件重新生效)。

sh 复制代码
docker run -id \
--restart=always \
-v /mediakit/conf/config.ini:/opt/media/conf/config.ini \
--network host \
zlmediakit/zlmediakit:master	

此时,如下访问:

使用zlm-spring-boot-starter

拉取这个项目:zlm-spring-boot-starter,个人地址用这个:zzhua/zlm-spring-boot-starter

测试zlm的接口

可以先测试调用zlmediakit的接口,在ZlmZApiTest中测试:

clike 复制代码
@Test
public void test() {
    ServerResponse<List<String>> apiList = ZlmRestService.getApiList("http://192.168.134.3", "FrXTyzix8bFtvR2jeBNVjuZLbkjcP0m9");
    System.out.println(apiList);
}
// 返回api列表
/*ServerResponse(code=0,
 data=[/index/,
 /index/api/addFFmpegSource,
 /index/api/addStreamProxy,
 /index/api/addStreamPusherProxy,
 /index/api/broadcastMessage,
 /index/api/close_stream,
 /index/api/close_streams,
 /index/api/closeRtpServer,
 /index/api/connectRtpServer,
 /index/api/delete_webrtc,
 /index/api/deleteRecordDirectory,
 /index/api/delFFmpegSource,
 /index/api/delStreamProxy,
 /index/api/delStreamPusherProxy,
 /index/api/downloadBin,
 /index/api/downloadFile,
 /index/api/getAllSession,
 /index/api/getApiList,
 /index/api/getMediaInfo,
 /index/api/getMediaList,
 /index/api/getMediaPlayerList,
 /index/api/getMP4RecordFile,
 /index/api/getProxyInfo,
 /index/api/getProxyPusherInfo,
 /index/api/getRtpInfo,
 /index/api/getServerConfig,
 /index/api/getSnap,
 /index/api/getStatistic,
 /index/api/getThreadsLoad,
 /index/api/getWorkThreadsLoad,
 /index/api/isMediaOnline,
 /index/api/isRecording,
 /index/api/kick_session,
 /index/api/kick_sessions,
 /index/api/listFFmpegSource,
 /index/api/listRtpSender,
 /index/api/listRtpServer,
 /index/api/listStreamProxy,
 /index/api/listStreamPusherProxy,
 /index/api/loadMP4File,
 /index/api/openRtpServer,
 /index/api/openRtpServerMultiplex,
 /index/api/pauseRtpCheck,
 /index/api/restartServer,
 /index/api/resumeRtpCheck,
 /index/api/seekRecordStamp,
 /index/api/setRecordSpeed,
 /index/api/setServerConfig,
 /index/api/startRecord,
 /index/api/startSendRtp,
 /index/api/startSendRtpPassive,
 /index/api/startSendRtpTalk,
 /index/api/stopRecord,
 /index/api/stopSendRtp,
 /index/api/updateRtpServerSSRC,
 /index/api/version,
 /index/api/webrtc,
 /index/api/whep,
 /index/api/whip],
 msg=null,
 result=null)
*/
测试hook

配置:zlm.hook-enable=true

启动项目,其中默认端口8081

使用推流命令,项目中收到请求(先是on_publish-这里做鉴权没有打日志,然后是on_stream_changed)

sh 复制代码
ffmpeg.exe  -f gdigrab -i desktop -vcodec libx264 -f flv rtmp://192.168.134.3/flv/test
log 复制代码
 INFO --- LocalZlmHookService :   onStreamChanged::param = {"aliveSecond":1,"app":"flv","bytesSpeed":160060,"createStamp":1734617418,"docker":false,"mediaServerId":"zzhuaMediaServer","originSock":{"identifier":"31-11","local_port":0,"peer_port":0},"originType":1,"originTypeStr":"rtmp_push","originUrl":"rtmp://__defaultVhost__/flv/test","regist":true,"schema":"rtmp","stream":"test","totalReaderCount":"0","tracks":[{"channels":0,"codec_id":0,"codec_type":0,"fps":30,"frames":0,"gop_interval_ms":0,"gop_size":0,"height":1080,"key_frames":0,"ready":true,"sample_bit":0,"sample_rate":0,"width":1920}],"vhost":"__defaultVhost__"}

使用vlc播放时,路径写rtmp://192.168.134.3/flv/test?name=zzhuaok,项目中收到请求:

sh 复制代码
INFO --- LocalZlmHookService :   onPlay::param = {"app":"flv","id":"33-24","ip":"192.168.134.5","mediaServerId":"zzhuaMediaServer","params":"name=zzhuaok","port":49302,"schema":"rtmp","stream":"test","vhost":"__defaultVhost__"}

8、restful接口

访问方式

postman

可以下载postman配置文件,导入zlm的接口 下载 postman 配置文件(可以直接测试 restful api)

swagger

也可以访问swagger地址

java api调用

也可以调用zlm-spring-boot-starter中的ZlmRestService,现成提供的方法去调用zlm的api接口

zlm webassit

拉流代理

步骤简述:将流推到easydarwin,然后再使用zlm的拉流代理功能,去easydarwin拉取流,转成其它协议,播放时,访问zlm流地址即可

1、本地启动EasyDarwin作为另1个流媒体服务器,用于拉流源地址,直接双击EasyDarwin.exe文件即可,可参考:EasyDarwin搭建直播推流服务

2、推送本地桌面到easydarwin,地址:rtsp://localhost:10054/live/test1

sh 复制代码
ffmpeg.exe  -f gdigrab -i desktop -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://localhost:10054/live/test1

3、进入webassist,添加拉流代理

可以看到转的协议

4、使用vlc播放视频,使用地址:rtsp://192.168.134.3/live/test1?name=zzhua(后面的参数是因为开启了播放鉴权)

推流代理

步骤简述:先启动easydarwin。然后,将视频流推送到zlm,zlm再将流推送到easydarwin,然后再easydarwin上可以看到视频

1、推流到zlm

sh 复制代码
ffmpeg.exe  -f gdigrab -i desktop -vcodec libx264 -f flv rtmp://192.168.134.3/flv/test?name=zzhua

2、zlm中添加推流代理,推流代理的作用 就是 将流推送到easydarwin

3、easydarwin中就可以看到视频了

9、推拉流播放鉴权

按需拉流

使用 ZLMediaKit 的 MediaServer 进程可以实现按需拉流:

按需推流

使用 ZLMediaKit 的 MediaServer 进程可以实现按需推流:

推流鉴权

使用 ZLMediaKit 的 MediaServer 进程可以实现推流鉴权:

播放鉴权

使用 ZLMediaKit 的 MediaServer 进程可以实现播放鉴权:

10、本地webrtc测试

开始webrtc推流

https://192.168.134.3/index/api/webrtc?app=live1&stream=test1&type=push

rtsp播放

查看zlm首页下多了这个流

使用vlc播放,地址是:rtsp://192.168.134.3/live1/test1

开始webrtc播放

地址播放:https://192.168.134.3/index/api/webrtc?app=live1&stream=test1&type=play

11、测试点播

准备视频和容器

1、创建mediakitVolume 卷,挂载到宿主机(为了保留容器中已存在的文件)

sh 复制代码
docker volume create mediakitVolume \
 -d local \
 -o type=none \
 -o o=bind \
 -o device=/mediakit/bin/

2、运行容器

sh 复制代码
docker run -id \
--restart=always \
-v /mediakit/conf/config.ini:/opt/media/conf/config.ini \
-v mediakitVolume:/opt/media/bin/ \
--network host \
zlmediakit/zlmediakit:master	

3、将文件上传到/mediakit/bin/www/record/

4、视频点播

具体播放的url地址,查看:播放url规则

url播放

http://192.168.134.3/record/test.mp4

查看后台,此时会回调/on_http_access这个接口。同时会将url上的参数携带过来,可以此作为鉴权依据。

比如这里就可以返回code为-1,就不会播放视频了。


rtsp播放

rtsp://192.168.134.3/record/test.mp4

rtsp也是有鉴权的

rtmp播放

rtmp://192.168.134.3/record/test.mp4,有on_play鉴权

ws播放

wss://192.168.134.3/record/test.mp4.live.flv,有on_play鉴权

wss://192.168.134.3/record/test.mp4.live.mp4,有on_play鉴权

12、url规则

url的组成

rtsp://somedomain.com:554/live/test?token=abcdefg&field=value 为例,该 url 分为以下几个部分

  • 协议(scheam) : rtsp协议

  • 虚拟主机 (vhost): somedomain.com,该字段既可以是域名也可以是 ip 地址,如果是 ip 的话,则对应的虚拟主机为__defaultVhost__

  • 服务端口号(port) : 554,如果不指定端口号,则使用协议默认端口号。rtsp 默认端口554,rtmp 默认端口1935,http 默认端口80

  • 应用名(app) : 此例是 live

  • 流 ID(streamid) : 此例是 test

  • 参数 (args): token=abcdefg&field=value,格式跟 http 一致,url 参数主要用于播放、推流鉴权,在触发 hook api 时,会把这些参数提交给第三方业务服务器

13、zlm-video-admin

项目地址:gitee - zlm-video-admin语雀 - 对应文档掘金 - 来源地址

1、直接调用zlm提供的接口,修改配置

2、开启录像后,预览录像

相关推荐
兩尛1 分钟前
Spring面试
java·spring·面试
Java中文社群8 分钟前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme19 分钟前
java.nio 包详解
java·python·nio
零千叶36 分钟前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝1 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li3714908901 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠1 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea
Aevget2 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse
黄昏晓x2 小时前
C++----多态
java·jvm·c++
Brookty2 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划