Skip to content

AKStream配置文件详解

chatop2020 edited this page Dec 2, 2023 · 49 revisions

AKStream的配置文件

  • AKStream的配置文件总的有两类,一类是基于Json格式的配置文件,另一类是基于xml格式的配置文件
  • xml格式的配置文件是log4net日志组件用的,也仅有log4net用
  • json格式的配置文件为AKStream的标准配置文件
  • AKStream的两大组件AKStreamWeb、AKStreamKeeper都有自己的配置文件,根据内容不同也分面了多个配置文件
  • AKStream配置文件会在首次启动时自动生成配置文件模板,需要根据自己的实际情况对配置文件进行修改
  • AKStream配置文件存放在AKStream程序的同级目录下的Config文件夹中
  • 为了防止配置文件被无意覆盖而造成的原配置信息丢失问题,你可以将配置文件复制一份保存成 xxxx.json.local ,程序启动时会自动查找.local的配置文件,如果存在,则优先使用.local结尾的配置文件,如果不存在则依然使用老的配置文件
  • 如 AKStreamWeb.json这个配置文件,AKStreamWeb启动时,系统会加载AKStreamWeb.json,但加载之前系统将查找AKStreamWeb.json所在目录中是否存在AKStreamWeb.json.local文件,如果此文件存在,系统将优先使用AKStreamWeb.json.local做为配置文件并启动程序,如果你不想这么做,只需要将AKStreamWeb.json.local文件删除即可
  • 值得注意的是,优先使用.local配置文件仅针对于以下几个配置项 AKStreamWeb.json AKStreamKeeper.json SipServerConfig.json SipClientConfig.json ,其他配置文件不会应用此方式。

AKStreamWeb的配置文件

AKStreamWeb.json / AKStreamWeb.json.local(备用项)

{
  "MediaServerFirstToRestart": true,
  "DbType": "MySql",
  "OrmConnStr": "Data Source=192.168.2.26;Port=3307;User ID=root;Password=abc123@111@; Initial Catalog=AKStream;Charset=utf8; SslMode=none;Min pool size=1;",
  "WebApiPort": 5800,
  "AccessKey": "047I4WS1-U51UBO6W-1J4BT21P-MF17IT99-92J8WIHU-944Q4KIW",
  "HttpClientTimeoutSec": 5,
  "WaitEventTimeOutMSec" : 10000,
  "WaitSipRequestTimeOutMSec" : 5000,
  "DeletedRecordsExpiredDays" : 30,
  "EnableGB28181Client" : true,
  "EnableGB28181Server" : true,
  "ZlmFlvPrefix" : "live",
  "ListenIp" : "127.0.0.1",
  "LocalizationKingBaseDb":false,
  "ForwardUnmanagedRtmpRtspRtcStream": false,
  "ForwardUrlIn": "http://",
  "ForwardUrlOut": "http://"
}
  • "MediaServerFirstToRestart" 此字段表示AKStreamKeeper第一次向AKStreamWeb注册自己时是否要重启一次流媒体服务器(ZLMediaKit),true为需要重启,false为不需要重启,一般建议为true
  • "DbType" 数据库的类型,详见数据库说明章节
  • "OrmConnStr" 数据库连接字符串,详见数据库说明章节
  • "WebApiPort" AKStreamWeb的WebApi监听端口,默认5800
  • "AccessKey" 此字段为访问AKStreamWeb的WebApi时的鉴权密钥,当AKStream程序非Debug模式编译时,访问WebApi接口需要在http请求头上携带AccessKey及其值,系统校验AccessKey,通过则执行相关流程,通不过则报错给http客户端
  • "HttpClientTimeoutSec" 调用http webapi时的超时时间(秒)
  • "WaitEventTimeOutMSec" 等待ZLMediakit等外部事件时的超时时间(毫秒)
  • "WaitSipRequestTimeOutMSec" Sip网关发送请求到回复的超时时间(毫秒)
  • "DeletedRecordsExpiredDays" 录制文件随着时间推移越来越多,为控制磁盘空间,录制文件会被按录制计划设置情况进行删除,录制文件删除后数据库中相对应的记录的Deleted和Undo字段会做相应设置,而数据库记录并未被真正删除,AKStream运行时间长以后,被真正删除的录像文件在数据库中的记录并没被删除,录制计划计算数据时并没有对此类数据进行统计,因此这类真正被删除的数据,在数据库中是垃圾数据,会随着时间推移越来越影响数据库性能,因此需要有个参数来控制什么时候删除掉这类已经被真正删除的记录数据,因此增加DeletedRecordsExpiredDays参数来控制,如果这个参数设置为小于1的话,则此动作不会被执行,这里要注意一点,此参数不应该设置过短,因为有些被软删除的记录在24小时内是有机会被恢复的,所以如果这个参数设置为1的话,那么可能影响软删除文件的恢复功能,因此推荐从5天以上进行设置。
  • "EnableGB28181Client" 是否启用GB28181客户端
  • "EnableGB28181Server" 是否启用GB28181服务端
  • "ZlmFlvPrefix" 配合ZLM更新增加的配置项,ZLM新版本针对flv播放地址增加了live前缀,原先http://ip:port/rtp/abc.flv 新版本中变成了http://ip:port/tp/abc.live.flv,为保证新老版本的兼容性在此配置文件中增加ZlmFlvPrefix配置项,此配置项默认填写"live"即可,如果老版本Zlm请留空字符串("")
  • "ListenIp" 为加强安全性,增加监听ip地址配置选项,如果要全局监听,此处写0.0.0.0或留空,否则仅监听配置的ip地址
  • "LocalizationKingBaseDb" 为国产化人大金仓适配添加的配置,由于人大金仓是Postgresql的马甲,所以在Dbtype上还是得写postgresql类型,但这玩样和真正的postgresql又有点区别,和postgresql的order by 子句语法不一样,再则因为使用kingbaseES的数据库提供器又无法驱动,所以只能增加一个参数,来适配这个问题,当此参数为true时,将在sql查询的order by 子句中的字段名上取消引号转译符“\”。
  • "ForwardUnmanagedRtmpRtspRtcStream" 对流未纳入到AKStream管理,但又有需求的,可以通过配置这个参数来实现非管理流的消息转发功能,true为转发,false为不转发(比如obs直播流,不能按照videochannel的形式进行管理,可以通过这种方式由第三方程序继续处理相关业务),注意:只有Rtmp,Rtsp,Rtc流主动接入并且未被AKStream管理时才会触发转发操作。
  • "ForwardUrlIn" 当ForwardUnmanagedRtmpRtspRtcStream为true 时,一旦有流接入并且此流非AKStream管理的流,会向ForwardUrlIn这个http地址发送流接入信息
  • "ForwardUrlOut" 当ForwardUnmanagedRtmpRtspRtcStream为true 时,一旦有流注销并且此流非AKStream管理的流,会向ForwardUrlOut这个http地址发送流注销信息

流接入时的消息结构如下(ForwardUrlIn):

{
    "regist" : true,
    "aliveSecond": 0, #存活时间,单位秒
    "app": "live", # 应用名
    "bytesSpeed": 0, #数据产生速度,单位byte/s
    "createStamp": 1617956908,  #GMT unix系统时间戳,单位秒
    "mediaServerId": "your_server_id", # 服务器id
    "originSock": {
        "identifier": "000001C257D35E40",
        "local_ip": "172.26.20.112", # 本机ip
        "local_port": 50166, # 本机端口
        "peer_ip": "172.26.20.112", # 对端ip
        "peer_port": 50155 # 对端port
    },
    "originType": 8,  # 产生源类型,包括 unknown = 0,rtmp_push=1,rtsp_push=2,rtp_push=3,pull=4,ffmpeg_pull=5,mp4_vod=6,device_chn=7,rtc_push=8
    "originTypeStr": "rtc_push",
    "originUrl": "", #产生源的url
    "readerCount": 0, # 本协议观看人数
    "schema": "rtsp", # 协议
    "stream": "test",  # 流id
    "totalReaderCount": 0, # 观看总人数,包括hls/rtsp/rtmp/http-flv/ws-flv/rtc
    "tracks": [{
       "channels" : 1, # 音频通道数
       "codec_id" : 2, # H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4
       "codec_id_name" : "CodecAAC", # 编码类型名称 
       "codec_type" : 1, # Video = 0, Audio = 1
       "ready" : true, # 轨道是否准备就绪
       "sample_bit" : 16, # 音频采样位数
       "sample_rate" : 8000 # 音频采样率
    },
    {
       "codec_id" : 0, # H264 = 0, H265 = 1, AAC = 2, G711A = 3, G711U = 4
       "codec_id_name" : "CodecH264", # 编码类型名称  
       "codec_type" : 0, # Video = 0, Audio = 1
       "fps" : 59,  # 视频fps
       "height" : 720, # 视频高
       "ready" : true,  # 轨道是否准备就绪
       "width" : 1280 # 视频宽
    }],
    "vhost": "__defaultVhost__"
}

流注销时的消息结构如下(ForwardUrlOut):

{
   "mediaServerId" : "your_server_id",
   "app" : "live",
   "duration" : 6,
   "params" : "token=1677193e-1244-49f2-8868-13b3fcc31b17",
   "player" : false,
   "schema" : "rtmp",
   "stream" : "obs",
   "totalBytes" : 1508161,
   "vhost" : "__defaultVhost__",
   "ip" : "192.168.0.21",
   "port" : 55345,
   "id" : "140259799100960"
}

SipServerConfig.json / SipServerConfig.json.local(备用项)

{
  "SipIpAddress": "192.168.2.92",
  "SipIpV6Address": "fe80::8:807:2143:28a1%5",
  "ServerSipDeviceId": "33020000021180000001",
  "SipPort": 5060,
  "Realm": "3302000002",
  "GbVersion": "GB-2016",
  "Authentication": true,
  "SipUsername": "admin",
  "SipPassword": "123#@!qwe",
  "MsgProtocol": "TCP",
  "KeepAliveInterval": 30,
  "KeepAliveLostNumber": 3,
  "IpV6Enable": true,
  "EncodingType": "UTF8",
  "IsPassive": true,
  "ListenIp" : "127.0.0.1",
  "NoAuthenticationRequireds": [
    {
      "IpV4Address": "192.168.2.92",
      "IpV6Address": "fe80::8:807:2143:28a1%5",
      "DeviceId": "33020000021180000001"
    }
  ]
}
  • 此配置文件配置的是GB28181 Sip网关相关的配置信息
  • "SipIpAddress" Sip网关所在服务器的ip地址,这个ip地址会携带在Sip信令中发送给Sip设备,Sip设备回复相关数据时会将数据包发向这个ip地址,Sip网关在端口监听时并不绑定此ip地址,而会绑定0.0.0.0
  • "SipIpV6Address" ipv6地址,作用与"SipIpAddress"一样,这是试验性的兼容IPv6
  • "ServerSipDeviceId" 服务器的Sip ID 20位,规则请参考GB28181规范
  • "SipPort" Sip网关的服务端口,默认5060
  • "Realm" Sip网关服务的域,默认为"ServerSipDeviceId"的前10位
  • "GbVersion" GB28181协议版本,目前只支持GB28181-2016(最新协议),必须填写为"GB-2016"
  • "Authentication" 是否启用GB28181设备注册鉴权,如果true,则Sip设备注册时需要通过服务器的鉴权认证
  • "SipUsername" 鉴权认证需要的服务器用户名
  • "SipPassword" 鉴权认证需要的服务器密码,要填写到摄像头的配置页面中
  • ”MsgProtocol“ 信令网关的服务端口类型,TCP,UDP,当为TCP时,UDP也同时开放,当UDP时TCP不会开放,建议设置成TCP
  • "KeepAliveInterval" 与Sip设备的心跳周期(秒),不建议大于30秒
  • "KeepAliveLostNumber" 失去多少次心跳认为Sip设备不在线,Sip设备不在线的情况下该设备将被注销,移出管理列表
  • "IpV6Enable" 是否启用Ipv6,如果启用,则监听Sip服务端口时除绑定0.0.0.0以外,还会绑定ipv6的本地地址,如果Sip设备支持Ipv6则可以通过ipv6地址来访问sip网关(实验性质)
  • "NoAuthenticationRequireds" 鉴权认证例外列表,在列表中的设备即使"Authentication"为true,也不需要鉴权认证,这是为了防止某些设备没有鉴权功能或者鉴权算法不一致而无法实现对接
  • "EncodingType" 用于指定Sip服务的Sip消息头与Sip消息体的字符集,可指定为"UTF8","GB2312","GBK"三种类型
  • "IsPassive" 用于指定请求流时是否使用被动模式,active:主动模式,由摄像头告知服务器监听哪个端口,passive:被动模式,服务器告知摄像头连接端口,一般使用被动模式,设置为true即可
  • "ListenIp" 为加强安全性,增加监听ip地址配置选项,如果要全局监听,此处写0.0.0.0或留空,否则仅监听配置的ip地址,此配置在Sip网关处仅对ipv4有效

SipClientConfig.json / SipClientConfig.json.local(备用项)

{
  "LocalIpAddress": "192.168.200.19",
  "LocalPort": 5061,
  "SipServerIpAddress": "192.168.200.19",
  "SipServerPort": 5060,
  "SipServerDeviceId": "33020000021180000001",
  "Realm": "3302000002",
  "SipUsername": "admin",
  "SipPassword": "123#@!qwe",
  "KeepAliveInterval": 10,
  "KeepAliveLostNumber": 3,
  "SipDeviceId": "33020000021190000002",
  "Expiry": 3600,
  "EncodingType": "UTF8",
  "AkstreamWebHttpUrl": "http://127.0.0.1:5800/SipClient"
}
  • 此配置文件描述的是GB28181客户端的相关行为参数
  • "LocalIpAddress" 客户端IP地址
  • "LocalPort" 客户端端口(一般写5061)
  • "SipServerIpAddress" gb28181服务器ip地址
  • "SipServerPort" gb28181服务器端口(一般是5060)
  • "SipServerDeviceId" gb28181服务器设备id
  • "Realm" gb28181域(一般是SipServerDeviceId的前10位)
  • "SipUsername" gb28181用户名
  • "SipPassword" gb28181密码
  • "KeepAliveInterval" 心跳间隔(秒)
  • "KeepAliveLostNumber" 多少次心跳丢失认为离线
  • "SipDeviceId" gb28181客户端的设备id
  • "Expiry" gb28181注册有效期(秒)
  • "EncodingType" gb28181客户端的字符集 UTF8,GB2312,GBK
  • "AkstreamWebHttpUrl" 与AKStreamWeb通讯地址(固定写 "http://127.0.0.1:5800/SipClient")

AKStreamKeeper的配置文件

AKStreamKeeper.json / AKStreamKeeper.json.local(备用项)

{
  "IpV4Address": "192.168.2.94",
  "IpV6Address": "fe80::8:807:2143:28a1%5",
  "Candidate":"192.168.2.94",
  "WebApiPort": 6880,
  "MediaServerPath": "/Users/chatop/Projects/Clion/ZLMediaKit/release/mac/Debug/MediaServer",
  "AkStreamWebRegisterUrl": "http://127.0.0.1:5800/MediaServer/WebHook/MediaServerKeepAlive",
  "CutMergeFilePath": "/User/chatop/Projects/CutMergeFile",
  "CustomRecordPathList": [
    "/Users/chatop/Downloads/record1",
    "/Users/chatop/Downloads/record2"
  ],
  "UseSsl": false,
  "MinRtpPort": 10001,
  "MaxRtpPort": 20000,
  "RandomPort": false,
  "RecordSec": 120,
  "FFmpegPath": "/usr/local/bin/ffmpeg",
  "AccessKey": "O7O4S089-PGDW6HTM-T4CV6K74-V6RIP1I6-9300G54F-Z03TI40Q",
  "RtpPortCdTime": 3600,
  "HttpClientTimeoutSec": 5,
  "DisableShell": true,
  "CheckLinuxDiskMount": false,
  "ZLMediakitSSLFilePath": "./sslfiles/",
  "ListenIp" : "127.0.0.1",
  "EnableRtspAuth" : true
}
  • "IpV4Address" ipv4地址,这个ip地址是AKStreamKeeper告知AKStreamWeb自己的ip地址也是在GB28181协议推流时告知摄像头流媒体服务器所在的主机IP地址,因此此IP非常重要,请一定设置正确,如果不正确,就导致AKStreamKeeper与AKStreamWeb无法正常通讯,也导致GB28181推流时客户端设备无法正确的将流推到AKStream上。
  • "IpV6Address" ipv6地址
  • "WebApiPort" WebApi服务端口,默认6880
  • "MediaServerPath" ZLMediaServer的MediaServer可执行文件的绝对路径
  • "AkStreamWebRegisterUrl" AKStreamWeb的AKStreamKeeper注册和心跳的地址
  • "CutMergeFilePath" 指定裁剪合并任务的输出文件存放位置
  • "CustomRecordPathList" 自定义录制文件保存路径,可以多个,实际使用中选择其中一个来使用,选择的逻辑是哪个空闲空间大就选哪个
  • "UseSsl" 配置ZLMediaKit是否启用SSL,如果设置成true,在推拉流所生成的playUrl列表中将会有https,rtsps,rtmps,wss地址
  • "MinRtpPort" rtp端口范围低端
  • "MaxRtpPort" rtp端口范围高端
  • "RandomPort" 此配置为true时rtp端口由zlm自动生成,不再应用MinRtpPort与MaxRtpPort的范围限制
  • "RecordSec" 此配置与ZLMediakit中的[record]->filesecends对应,配置RecordSec大于0时将在AKStreamKeeper启动时将ZLMediakit的[record]->filesecends改成RecordSec所配置的值,以设置录制切片时长,RecordSec单位为秒
  • "FFmpegPath" ffmpeg的可执行文件绝对路径
  • "AccessKey": 访问webpai的鉴权key,与AKStreamWeb.json中的AccessKey同样的作用
  • "RtpPortCdTime" 被使用过的端口被释放后多少时间后才可以再次使用,端口冷却时间
  • "HttpClientTimeoutSec" 调用http webapi时的超时时间(秒)
  • "DisableShell" 是否关闭ZLMediaKit的远程Shell功能,true为关闭,false为打开(打开时默认shell端口为9000)
  • "ZLMediakitSSLFilePath" ZLMediaKit启用SSL时需要的证书文件 ,(zlm wiki说:ssl证书文件或文件夹,支持p12/pem类型)
  • "Candidate" 流媒体服务器对外服务的IP地址(公网地址),用于Sip信令协商中的流媒体服务器ip地址,此配置用于区分IpV4Address地址,当此地址存在时,AKStream将不再使用IpV4Address为流媒体服务器ip地址,而将使用Candidate所指定的ip地址做为流媒体服务器地址,如果Candidate不存在,则依然采用IpV4Address作为流媒体服务器ip地址
  • "CheckLinuxDiskMount" 指定在Linux环境下是否检测视频存储盘状态,一旦开启,将检测磁盘的挂载情况,每当要需要删除音视频文件时会先检测一次音视频文件所在磁盘是否已挂载,是否已就绪(可写),如果磁盘状态未就绪则不再执行视频文件删除操作,注意只会检测/dev/sd* 这类挂载磁盘,如果你的磁盘挂载并非sd*这种类型,将导致异常,这个配置主要是配合我公司业务,此需求不具有普遍性,请理性开启。此外此配置只支持Linux操作系统。
  • "ListenIp" 为加强安全性,增加监听ip地址配置选项,如果要全局监听,此处写0.0.0.0或留空,否则仅监听配置的ip地址
  • "EnableRtspAuth" 是否开启rtsp鉴权,当此配置为true时,AKStream将开启rtsp鉴权,第三方在使用类似rtsp://username:passwd@ip:port/uri/streamid的方式拉取AKStream rtsp流时,需要进行用户鉴权;因为增加这个鉴权功能,数据库中增加了一张名为UserAuth的表,表中字段如下:
序号 字段 类型 是否可空 说明
1 Id Long 自增ID
2 MediaServerId String 流媒体服务器ID
3 Username String 用户名
4 Password String 密码,使用MD5生成摘要
  • 关于数据表中Password字段:这个字段是MD5生成的摘要,生成规则是MD5(Username:default:Password)
  • 当第三方有Rtsp拉流请求时,AKStream会默认以default做为realm内容传给ZLMediaKit,ZLMediaKit会发送On_Rtsp_Auth事件给到AKStream,AKStream根据ZLMediaKit给到的Username,返回Password字段内容(MD5加盐,默认盐为default,有需要修改的话直接修改源码中的default字符串),ZLMediaKit在收到AKStream的Password后,对第三方Rtsp请求进行鉴权,如果鉴权失败,则返回401错误。
  • AKStreamKeeper首次运行时,会在UserAuth表中增加一条默认记录,内容为 [id],[MediaServerId],[defaultuser],[MD5("defaultuser:default:defautlpasswd")],用于初始化数据库
  • 初始化完成后,默认可以使用rtsp://defaultuser:defaultpasswd@ip:port/uri/streamid 来访问rtsp流
  • 同时MediaService API接口增加三个接口内容 GetRtspAuthData DeleteRtspAuthData AddRtspAuthData 用于对鉴权数据的操作

Log4net配置文件

logconfig.xml

<?xml version="1.0" encoding="utf-8"?>

<configuration>
    <!-- This section contains the log4net configuration settings -->
    <log4net>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
            <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
        </appender>


        <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
            <file value="log/" />
            <appendToFile value="true" />
            <rollingStyle value="Composite" />
            <staticLogFileName value="false" />
            <datePattern value="yyyyMMdd'.log'" />
            <maxSizeRollBackups value="10" />
            <maximumFileSize value="10MB" />
            <layout type="log4net.Layout.PatternLayout" value="%date [%thread] %-5level %logger - %message%newline" />
        </appender>

        <!-- Setup the root category, add the appenders and set the default level -->
        <root>
            <level value="ALL" /><!-- 这里可以改,其他地方最好不要改,可以是ALL DEBUG INFO WARN ERROR -->
            <appender-ref ref="ConsoleAppender" />
            <appender-ref ref="RollingLogFileAppender" />
        </root>

    </log4net>
</configuration>
  • 如果logconfig.xml配置文件不存在,则系统运行不会输出日志,AKStreamWeb,AKStreamKeeper的Config文件夹下都应该有logconfig.xml文件存在
  • 首次运行程序,没有任何输出就退出了,肯定就是缺少这个logconfig.xml配置文件 ,请将上面配置文件创建logconfig,xml文件复制到Config目录下,再运行程序就会有内容输出