Files
monibuca/plugin/rtmp/pkg/net-stream.go
2024-08-13 14:44:35 +08:00

77 lines
1.8 KiB
Go

package rtmp
import (
"m7s.live/m7s/v5"
"m7s.live/m7s/v5/pkg"
)
type NetStream struct {
*NetConnection
StreamID uint32
}
func (ns *NetStream) CreateAudioSender(c bool) *Sender {
var av Sender
av.NetConnection = ns.NetConnection
av.ChunkStreamID = RTMP_CSID_AUDIO
av.MessageTypeID = RTMP_MSG_AUDIO
av.MessageStreamID = ns.StreamID
av.errContinue = c
return &av
}
func (ns *NetStream) CreateVideoSender(c bool) *Sender {
var av Sender
av.NetConnection = ns.NetConnection
av.ChunkStreamID = RTMP_CSID_VIDEO
av.MessageTypeID = RTMP_MSG_VIDEO
av.MessageStreamID = ns.StreamID
av.errContinue = c
return &av
}
func (ns *NetStream) CreateSender(c bool) (audio *Sender, video *Sender) {
return ns.CreateAudioSender(c), ns.CreateVideoSender(c)
}
func (ns *NetStream) Response(tid uint64, code, level string) error {
m := new(ResponsePlayMessage)
m.CommandName = Response_OnStatus
m.TransactionId = tid
m.Infomation = map[string]any{
"code": code,
"level": level,
"description": "",
}
m.StreamID = ns.StreamID
return ns.SendMessage(RTMP_MSG_AMF0_COMMAND, m)
}
func (ns *NetStream) BeginPublish(tid uint64) error {
err := ns.SendStreamID(RTMP_USER_STREAM_BEGIN, ns.StreamID)
if err != nil {
return err
}
return ns.Response(tid, NetStream_Publish_Start, Level_Status)
}
func (ns *NetStream) BeginPlay(tid uint64) (err error) {
err = ns.SendStreamID(RTMP_USER_STREAM_BEGIN, ns.StreamID)
if err != nil {
return err
}
err = ns.Response(tid, NetStream_Play_Reset, Level_Status)
if err != nil {
return
}
err = ns.Response(tid, NetStream_Play_Start, Level_Status)
return
}
func (ns *NetStream) Subscribe(suber *m7s.Subscriber) {
ns.AddCall(func(task *pkg.Task) error {
audio, video := ns.CreateSender(false)
return m7s.PlayBlock(suber, audio.HandleAudio, video.HandleVideo)
}, nil)
}