mirror of
https://github.com/Monibuca/plugin-rtsp.git
synced 2025-09-26 19:51:14 +08:00
跟随升级gotsplib
This commit is contained in:
54
client.go
54
client.go
@@ -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)
|
||||
}
|
||||
|
Reference in New Issue
Block a user