跟随升级gotsplib

This commit is contained in:
dexter
2021-11-18 19:05:06 +08:00
parent 0ac9513920
commit ef106e42f8
6 changed files with 65 additions and 24 deletions

View File

@@ -7,11 +7,12 @@ import (
. "github.com/Monibuca/engine/v3"
. "github.com/Monibuca/utils/v3"
"github.com/aler9/gortsplib"
"github.com/aler9/gortsplib/pkg/base"
)
type RTSPClient struct {
RTSPublisher
Conn *gortsplib.ClientConn
gortsplib.Client `json:"-"`
}
// PullStream 从外部拉流
@@ -21,6 +22,9 @@ func (rtsp *RTSPClient) PullStream(streamPath string, rtspUrl string) (err error
Type: "RTSP Pull",
ExtraProp: rtsp,
}
rtsp.OnPacketRTP = func(trackID int, payload []byte) {
rtsp.processFunc[trackID](payload)
}
if result := rtsp.Publish(); result {
rtsp.URL = rtspUrl
if config.Reconnect {
@@ -29,7 +33,7 @@ func (rtsp *RTSPClient) PullStream(streamPath string, rtspUrl string) (err error
Printf("reconnecting:%s in 5 seconds", rtspUrl)
time.Sleep(time.Second * 5)
}
rtsp.Conn.Close()
rtsp.Client.Close()
if rtsp.IsTimeout {
go rtsp.PullStream(streamPath, rtspUrl)
}
@@ -37,7 +41,7 @@ func (rtsp *RTSPClient) PullStream(streamPath string, rtspUrl string) (err error
} else {
go func() {
rtsp.startStream()
rtsp.Conn.Close()
rtsp.Client.Close()
}()
}
return
@@ -49,19 +53,45 @@ func (client *RTSPClient) startStream() {
if client.Err() != nil {
return
}
// startTime := time.Now()
//loggerTime := time.Now().Add(-10 * time.Second)
conn, err := gortsplib.DialRead(client.URL)
// parse URL
u, err := base.ParseURL(client.URL)
if err != nil {
Printf("ParseURL:%s error:%v", client.URL, err)
return
}
// connect to the server
if err = client.Start(u.Scheme, u.Host); err != nil {
Printf("connect:%s error:%v", client.URL, err)
return
}
client.Conn = conn
tracks := conn.Tracks()
var res *base.Response
if res, err = client.Options(u); err != nil {
Printf("option:%s error:%v", client.URL, err)
return
}
Println(res)
// find published tracks
tracks, baseURL, res, err := client.Describe(u)
if err != nil {
Printf("Describe:%s error:%v", baseURL.String(), err)
return
}
Println(res)
client.setTracks(tracks)
err = conn.ReadFrames(func(trackID int, streamType gortsplib.StreamType, payload []byte) {
if streamType == gortsplib.StreamTypeRTP {
client.processFunc[trackID](payload)
for _, track := range tracks {
if res, err = client.Setup(true, baseURL, track, 0, 0); err != nil {
Printf("Setup:%s error:%v", baseURL.String(), err)
return
}
})
Println(res)
}
// start reading tracks
if res, err = client.Play(nil); err != nil {
Printf("Play:%s error:%v", baseURL.String(), err)
return
}
Println(res)
// wait until a fatal error
err = client.Wait()
Printf("Wait:%s error:%v", baseURL.String(), err)
}