You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/logic/logic.go

117 lines
3.7 KiB
Go

// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package logic
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/lal/pkg/remux"
"path/filepath"
)
// ---------------------------------------------------------------------------------------------------------------------
type ILalServer interface {
RunLoop() error
Dispose()
// AddCustomizePubSession DelCustomizePubSession
//
// 业务方可以将自己的流输入到 ILalServer 中
//
AddCustomizePubSession(streamName string) (ICustomizePubSessionContext, error)
DelCustomizePubSession(ICustomizePubSessionContext)
// StatLalInfo StatXxx... CtrlXxx...
//
// 一些获取状态、发送控制命令的API
// 目的是方便业务方在不修改logic包内代码的前提下在外层实现一些特定逻辑的定制化开发
//
StatLalInfo() base.LalInfo
StatAllGroup() (sgs []base.StatGroup)
StatGroup(streamName string) *base.StatGroup
CtrlStartPull(info base.ApiCtrlStartPullReq)
CtrlKickOutSession(info base.ApiCtrlKickOutSession) base.HttpResponseBasic
}
// NewLalServer 创建一个lal server
//
// @param modOption
// - 可变参数,如果不关心,可以不填,具体字段见 Option
// - 目的是方便业务方在不修改logic包内代码的前提下在外层实现一些特定逻辑的定制化开发
//
func NewLalServer(modOption ...ModOption) ILalServer {
return NewServerManager(modOption...)
}
// ---------------------------------------------------------------------------------------------------------------------
type ICustomizePubSessionContext interface {
// WithOption FeedAvPacket
//
// 见 remux.IAvPacketStream
//
WithOption(modOption func(option *remux.AvPacketStreamOption))
FeedAvPacket(packet base.AvPacket)
StreamName() string
}
// ---------------------------------------------------------------------------------------------------------------------
// INotifyHandler 事件通知接口
//
type INotifyHandler interface {
OnServerStart(info base.LalInfo)
OnUpdate(info base.UpdateInfo)
OnPubStart(info base.PubStartInfo)
OnPubStop(info base.PubStopInfo)
OnSubStart(info base.SubStartInfo)
OnSubStop(info base.SubStopInfo)
OnRtmpConnect(info base.RtmpConnectInfo)
}
type Option struct {
// ConfFilename
//
// 配置文件,注意,如果为空,内部会尝试从 DefaultConfFilenameList 读取默认配置文件
//
ConfFilename string
// NotifyHandler
//
// 事件监听
// 业务方可实现 INotifyHandler 接口并传入从而获取到对应的事件通知
// 如果不填写保持默认值nil内部默认走http notify的逻辑当然还需要在配置文件中开启http notify功能
// 注意如果业务方实现了自己的事件监听则lal server内部不再走http notify的逻辑也即二选一
//
NotifyHandler INotifyHandler
}
var defaultOption = Option{
NotifyHandler: nil, // 注意为nil时内部会赋值为 HttpNotify
}
type ModOption func(option *Option)
// DefaultConfFilenameList
//
// 没有指定配置文件时,按顺序作为优先级,找到第一个存在的并使用
//
var DefaultConfFilenameList = []string{
filepath.FromSlash("lalserver.conf.json"),
filepath.FromSlash("./conf/lalserver.conf.json"),
filepath.FromSlash("../lalserver.conf.json"),
filepath.FromSlash("../conf/lalserver.conf.json"),
filepath.FromSlash("../../lalserver.conf.json"),
filepath.FromSlash("../../conf/lalserver.conf.json"),
filepath.FromSlash("../../../lalserver.conf.json"),
filepath.FromSlash("../../../conf/lalserver.conf.json"),
filepath.FromSlash("lal/conf/lalserver.conf.json"),
}