mirror of
https://github.com/aler9/gortsplib
synced 2025-10-07 08:01:14 +08:00
speed up UDP disconnection
This commit is contained in:
@@ -24,7 +24,7 @@ const (
|
|||||||
clientWriteBufferSize = 4096
|
clientWriteBufferSize = 4096
|
||||||
clientReceiverReportPeriod = 10 * time.Second
|
clientReceiverReportPeriod = 10 * time.Second
|
||||||
clientUdpCheckStreamPeriod = 5 * time.Second
|
clientUdpCheckStreamPeriod = 5 * time.Second
|
||||||
clientTcpKeepalivePeriod = 30 * time.Second
|
clientUdpKeepalivePeriod = 30 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
// Track is a track available in a certain URL.
|
// Track is a track available in a certain URL.
|
||||||
@@ -244,17 +244,15 @@ func (c *ConnClient) WriteFrame(frame *InterleavedFrame) error {
|
|||||||
// the methods allowed by the server. Since this method is not implemented by
|
// the methods allowed by the server. Since this method is not implemented by
|
||||||
// every RTSP server, the function does not fail if the returned code is StatusNotFound.
|
// every RTSP server, the function does not fail if the returned code is StatusNotFound.
|
||||||
func (c *ConnClient) Options(u *url.URL) (*Response, error) {
|
func (c *ConnClient) Options(u *url.URL) (*Response, error) {
|
||||||
// strip path
|
|
||||||
u = &url.URL{
|
|
||||||
Scheme: "rtsp",
|
|
||||||
Host: u.Host,
|
|
||||||
User: u.User,
|
|
||||||
Path: "/",
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := c.Do(&Request{
|
res, err := c.Do(&Request{
|
||||||
Method: OPTIONS,
|
Method: OPTIONS,
|
||||||
Url: u,
|
// strip path
|
||||||
|
Url: &url.URL{
|
||||||
|
Scheme: "rtsp",
|
||||||
|
Host: u.Host,
|
||||||
|
User: u.User,
|
||||||
|
Path: "/",
|
||||||
|
},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -561,7 +559,19 @@ func (c *ConnClient) Play(u *url.URL) (*Response, error) {
|
|||||||
// the TCP connection open through keepalives, and returns when the TCP
|
// the TCP connection open through keepalives, and returns when the TCP
|
||||||
// connection closes.
|
// connection closes.
|
||||||
func (c *ConnClient) LoopUDP(u *url.URL) error {
|
func (c *ConnClient) LoopUDP(u *url.URL) error {
|
||||||
keepaliveTicker := time.NewTicker(clientTcpKeepalivePeriod)
|
readDone := make(chan error)
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
c.nconn.SetReadDeadline(time.Now().Add(clientUdpKeepalivePeriod * 2))
|
||||||
|
_, err := ReadResponse(c.br)
|
||||||
|
if err != nil {
|
||||||
|
readDone <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
keepaliveTicker := time.NewTicker(clientUdpKeepalivePeriod)
|
||||||
defer keepaliveTicker.Stop()
|
defer keepaliveTicker.Stop()
|
||||||
|
|
||||||
checkStreamTicker := time.NewTicker(clientUdpCheckStreamPeriod)
|
checkStreamTicker := time.NewTicker(clientUdpCheckStreamPeriod)
|
||||||
@@ -569,15 +579,32 @@ func (c *ConnClient) LoopUDP(u *url.URL) error {
|
|||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
case err := <-readDone:
|
||||||
|
c.nconn.Close()
|
||||||
|
return err
|
||||||
|
|
||||||
case <-keepaliveTicker.C:
|
case <-keepaliveTicker.C:
|
||||||
_, err := c.Options(u)
|
_, err := c.Do(&Request{
|
||||||
|
Method: OPTIONS,
|
||||||
|
Url: &url.URL{
|
||||||
|
Scheme: "rtsp",
|
||||||
|
Host: u.Host,
|
||||||
|
User: u.User,
|
||||||
|
Path: "/",
|
||||||
|
},
|
||||||
|
SkipResponse: true,
|
||||||
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
c.nconn.Close()
|
||||||
|
<-readDone
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
case <-checkStreamTicker.C:
|
case <-checkStreamTicker.C:
|
||||||
for trackId := range c.rtcpReceivers {
|
for trackId := range c.rtcpReceivers {
|
||||||
if time.Since(c.rtcpReceivers[trackId].LastFrameTime()) >= c.conf.ReadTimeout {
|
if time.Since(c.rtcpReceivers[trackId].LastFrameTime()) >= c.conf.ReadTimeout {
|
||||||
|
c.nconn.Close()
|
||||||
|
<-readDone
|
||||||
return fmt.Errorf("stream is dead")
|
return fmt.Errorf("stream is dead")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user