feat: add push to remote

This commit is contained in:
langhuihui
2023-10-05 21:55:08 +08:00
parent f1996508ef
commit 23c97cc61a

105
client.go
View File

@@ -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()
}