Fix ghost exec/ffmpeg process

This commit is contained in:
Alex X
2024-06-05 19:59:22 +03:00
parent 756be9801e
commit 9bb36ebb6c
4 changed files with 15 additions and 3 deletions
+6 -2
View File
@@ -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
) )
+5 -1
View File
@@ -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)
+3
View File
@@ -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()
} }
+1
View File
@@ -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