Fix ghost exec/ffmpeg process
This commit is contained in:
@@ -113,7 +113,7 @@ func handleRTSP(url string, cmd *exec.Cmd, path string) (core.Producer, error) {
|
|||||||
cmd.Stdout = os.Stdout
|
cmd.Stdout = os.Stdout
|
||||||
}
|
}
|
||||||
|
|
||||||
waiter := make(chan core.Producer)
|
waiter := make(chan *pkg.Conn, 1)
|
||||||
|
|
||||||
waitersMu.Lock()
|
waitersMu.Lock()
|
||||||
waiters[path] = waiter
|
waiters[path] = waiter
|
||||||
@@ -149,6 +149,10 @@ func handleRTSP(url string, cmd *exec.Cmd, path string) (core.Producer, error) {
|
|||||||
return nil, fmt.Errorf("exec/rtsp\n%s", cmd.Stderr)
|
return nil, fmt.Errorf("exec/rtsp\n%s", cmd.Stderr)
|
||||||
case prod := <-waiter:
|
case prod := <-waiter:
|
||||||
log.Debug().Stringer("launch", time.Since(ts)).Msg("[exec] run rtsp")
|
log.Debug().Stringer("launch", time.Since(ts)).Msg("[exec] run rtsp")
|
||||||
|
prod.OnClose = func() error {
|
||||||
|
log.Debug().Msgf("[exec] kill rtsp")
|
||||||
|
return errors.Join(cmd.Process.Kill(), cmd.Wait())
|
||||||
|
}
|
||||||
return prod, nil
|
return prod, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,7 +161,7 @@ func handleRTSP(url string, cmd *exec.Cmd, path string) (core.Producer, error) {
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
log zerolog.Logger
|
log zerolog.Logger
|
||||||
waiters = map[string]chan core.Producer{}
|
waiters = make(map[string]chan *pkg.Conn)
|
||||||
waitersMu sync.Mutex
|
waitersMu sync.Mutex
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ func (p *Producer) reconnect(workerID, retry int) {
|
|||||||
for _, media := range conn.GetMedias() {
|
for _, media := range conn.GetMedias() {
|
||||||
switch media.Direction {
|
switch media.Direction {
|
||||||
case core.DirectionRecvonly:
|
case core.DirectionRecvonly:
|
||||||
for _, receiver := range p.receivers {
|
for i, receiver := range p.receivers {
|
||||||
codec := media.MatchCodec(receiver.Codec)
|
codec := media.MatchCodec(receiver.Codec)
|
||||||
if codec == nil {
|
if codec == nil {
|
||||||
continue
|
continue
|
||||||
@@ -219,6 +219,7 @@ func (p *Producer) reconnect(workerID, retry int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
receiver.Replace(track)
|
receiver.Replace(track)
|
||||||
|
p.receivers[i] = track
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,6 +235,9 @@ func (p *Producer) reconnect(workerID, retry int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// stop previous connection after moving tracks (fix ghost exec/ffmpeg)
|
||||||
|
_ = p.conn.Stop()
|
||||||
|
// swap connections
|
||||||
p.conn = conn
|
p.conn = conn
|
||||||
|
|
||||||
go p.worker(conn, workerID)
|
go p.worker(conn, workerID)
|
||||||
|
|||||||
@@ -304,5 +304,8 @@ func (c *Conn) Close() error {
|
|||||||
if c.mode == core.ModeActiveProducer {
|
if c.mode == core.ModeActiveProducer {
|
||||||
_ = c.Teardown()
|
_ = c.Teardown()
|
||||||
}
|
}
|
||||||
|
if c.OnClose != nil {
|
||||||
|
_ = c.OnClose()
|
||||||
|
}
|
||||||
return c.conn.Close()
|
return c.conn.Close()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ type Conn struct {
|
|||||||
|
|
||||||
Backchannel bool
|
Backchannel bool
|
||||||
Media string
|
Media string
|
||||||
|
OnClose func() error
|
||||||
PacketSize uint16
|
PacketSize uint16
|
||||||
SessionName string
|
SessionName string
|
||||||
Timeout int
|
Timeout int
|
||||||
|
|||||||
Reference in New Issue
Block a user