From 23c97cc61a05b7108b0cd6ebf43a52f07dbcdda2 Mon Sep 17 00:00:00 2001 From: langhuihui <178529795@qq.com> Date: Thu, 5 Oct 2023 21:55:08 +0800 Subject: [PATCH] feat: add push to remote --- client.go | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/client.go b/client.go index 1c035c5..9a09c1d 100644 --- a/client.go +++ b/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() +}