mirror of
https://github.com/Monibuca/plugin-rtsp2.git
synced 2025-09-26 19:51:16 +08:00
feat: add push to remote
This commit is contained in:
105
client.go
105
client.go
@@ -5,6 +5,7 @@ import (
|
||||
"github.com/AlexxIT/go2rtc/pkg/rtsp"
|
||||
"go.uber.org/zap"
|
||||
"m7s.live/engine/v4"
|
||||
"m7s.live/engine/v4/codec"
|
||||
"m7s.live/engine/v4/track"
|
||||
)
|
||||
|
||||
@@ -72,3 +73,107 @@ func (p *RTSPPuller) setTracks() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type RTSPPusher struct {
|
||||
engine.Subscriber
|
||||
engine.Pusher
|
||||
RTSPClient
|
||||
videoSender *core.Receiver
|
||||
audioSender *core.Receiver
|
||||
}
|
||||
|
||||
func (p *RTSPPusher) OnEvent(event any) {
|
||||
switch v := event.(type) {
|
||||
case *track.Audio:
|
||||
if p.audioSender != nil {
|
||||
break
|
||||
}
|
||||
var c *core.Codec
|
||||
var media *core.Media
|
||||
switch v.CodecID {
|
||||
case codec.CodecID_AAC:
|
||||
c = &core.Codec{
|
||||
Name: core.CodecAAC,
|
||||
ClockRate: v.SampleRate,
|
||||
Channels: uint16(v.Channels),
|
||||
PayloadType: v.PayloadType,
|
||||
}
|
||||
case codec.CodecID_PCMA:
|
||||
c = &core.Codec{
|
||||
Name: core.CodecPCMA,
|
||||
ClockRate: v.SampleRate,
|
||||
Channels: uint16(v.Channels),
|
||||
PayloadType: v.PayloadType,
|
||||
}
|
||||
case codec.CodecID_PCMU:
|
||||
c = &core.Codec{
|
||||
Name: core.CodecPCMU,
|
||||
ClockRate: v.SampleRate,
|
||||
Channels: uint16(v.Channels),
|
||||
PayloadType: v.PayloadType,
|
||||
}
|
||||
}
|
||||
media = &core.Media{
|
||||
Kind: "audio",
|
||||
Direction: "sendonly",
|
||||
Codecs: []*core.Codec{c},
|
||||
}
|
||||
if p.videoSender == nil {
|
||||
media.ID = "0"
|
||||
} else {
|
||||
media.ID = "1"
|
||||
}
|
||||
p.audioSender = core.NewReceiver(media, c)
|
||||
p.Conn.AddTrack(media, c, p.audioSender)
|
||||
p.AddTrack(v)
|
||||
case *track.Video:
|
||||
if p.videoSender != nil {
|
||||
break
|
||||
}
|
||||
var c *core.Codec
|
||||
var media *core.Media
|
||||
switch v.CodecID {
|
||||
case codec.CodecID_H264:
|
||||
c = &core.Codec{
|
||||
Name: core.CodecH264,
|
||||
ClockRate: v.SampleRate,
|
||||
PayloadType: v.PayloadType,
|
||||
}
|
||||
case codec.CodecID_H265:
|
||||
c = &core.Codec{
|
||||
Name: core.CodecH265,
|
||||
ClockRate: v.SampleRate,
|
||||
PayloadType: v.PayloadType,
|
||||
}
|
||||
}
|
||||
media = &core.Media{
|
||||
Kind: "video",
|
||||
Direction: "sendonly",
|
||||
Codecs: []*core.Codec{c},
|
||||
}
|
||||
if p.audioSender == nil {
|
||||
media.ID = "0"
|
||||
} else {
|
||||
media.ID = "1"
|
||||
}
|
||||
p.videoSender = core.NewReceiver(media, c)
|
||||
p.Conn.AddTrack(media, c, p.videoSender)
|
||||
p.AddTrack(v)
|
||||
case engine.VideoRTP:
|
||||
p.videoSender.WriteRTP(v.Packet)
|
||||
case engine.AudioRTP:
|
||||
p.audioSender.WriteRTP(v.Packet)
|
||||
default:
|
||||
p.Subscriber.OnEvent(event)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *RTSPPusher) Connect() (err error) {
|
||||
p.Conn = rtsp.NewClient(p.RemoteURL)
|
||||
p.SetIO(p.Conn)
|
||||
return p.Conn.Dial()
|
||||
}
|
||||
|
||||
func (p *RTSPPuller) Push() (err error) {
|
||||
return p.Announce()
|
||||
}
|
||||
|
Reference in New Issue
Block a user