Files
plugin-rtsp/client.go
2022-03-19 01:15:19 +08:00

109 lines
2.0 KiB
Go

package rtsp
import (
"github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/base"
"github.com/pion/rtp/v2"
"m7s.live/engine/v4"
)
type RTSPPuller struct {
RTSPPublisher
engine.Puller
*gortsplib.Client
gortsplib.Transport
}
func (p *RTSPPuller) Connect() error {
if p.Transport == gortsplib.TransportTCP {
p.Transport = gortsplib.TransportUDP
} else {
p.Transport = gortsplib.TransportTCP
}
p.Client = &gortsplib.Client{
OnPacketRTP: func(trackID int, packet *rtp.Packet) {
p.RTSPPublisher.Tracks[trackID].WriteRTPPack(packet)
},
ReadBufferSize: rtspConfig.ReadBufferSize,
Transport: &p.Transport,
}
// parse URL
u, err := base.ParseURL(p.RemoteURL)
if err != nil {
return err
}
// connect to the server
if err = p.Client.Start(u.Scheme, u.Host); err != nil {
return err
}
return nil
}
func (p *RTSPPuller) Pull() {
u, _ := base.ParseURL(p.RemoteURL)
if _, err := p.Options(u); err != nil {
return
}
// find published tracks
tracks, baseURL, _, err := p.Describe(u)
if err != nil {
return
}
p.tracks = tracks
p.SetTracks()
if err = p.SetupAndPlay(tracks, baseURL); err != nil {
return
}
p.Wait()
}
type RTSPPusher struct {
RTSPSubscriber
engine.Pusher
*gortsplib.Client
gortsplib.Transport
}
func (p *RTSPPusher) Connect() error {
if p.Transport == gortsplib.TransportTCP {
p.Transport = gortsplib.TransportUDP
} else {
p.Transport = gortsplib.TransportTCP
}
p.Client = &gortsplib.Client{
ReadBufferSize: rtspConfig.ReadBufferSize,
Transport: &p.Transport,
}
// parse URL
u, err := base.ParseURL(p.RemoteURL)
if err != nil {
return err
}
// connect to the server
if err = p.Client.Start(u.Scheme, u.Host); err != nil {
return err
}
return nil
}
func (p *RTSPPusher) Push() {
u, err := base.ParseURL(p.RemoteURL)
_, err = p.Announce(u, p.tracks)
if err != nil {
p.Close()
return
}
for _, track := range p.tracks {
_, err := p.Setup(false, track, u, 0, 0)
if err != nil {
p.Close()
}
}
_, err = p.Record()
if err != nil {
p.Close()
return
}
}