Stop ffmpeg when shutting down

This commit is contained in:
Nick Mowen 2023-06-19 06:57:11 -06:00
parent 936cba75fb
commit 6c1fda11f6

View File

@ -25,7 +25,9 @@ from frigate.const import (
) )
from frigate.events.maintainer import EventTypeEnum from frigate.events.maintainer import EventTypeEnum
from frigate.ffmpeg_presets import parse_preset_input from frigate.ffmpeg_presets import parse_preset_input
from frigate.log import LogPipe
from frigate.object_detection import load_labels from frigate.object_detection import load_labels
from frigate.video import start_or_restart_ffmpeg, stop_ffmpeg
from frigate.util import get_ffmpeg_arg_list, listen from frigate.util import get_ffmpeg_arg_list, listen
try: try:
@ -138,6 +140,7 @@ class AudioEventMaintainer(threading.Thread):
) )
) )
self.pipe_file = None self.pipe_file = None
self.logpipe = LogPipe(f"ffmpeg.{self.config.name}.audio")
self.audio_listener = None self.audio_listener = None
def detect_audio(self, audio) -> None: def detect_audio(self, audio) -> None:
@ -186,17 +189,14 @@ class AudioEventMaintainer(threading.Thread):
(EventTypeEnum.audio, "end", self.config.name, detection) (EventTypeEnum.audio, "end", self.config.name, detection)
) )
def init_ffmpeg(self) -> None: def restart_audio_pipe(self) -> None:
try: try:
os.mkfifo(self.pipe) os.mkfifo(self.pipe)
except FileExistsError: except FileExistsError:
pass pass
self.audio_listener = sp.Popen( start_or_restart_ffmpeg(
self.ffmpeg_cmd, self.ffmpeg_cmd, logger, self.logpipe, None, self.audio_listener
stdout=sp.DEVNULL,
stdin=sp.DEVNULL,
start_new_session=True,
) )
def read_audio(self) -> None: def read_audio(self) -> None:
@ -207,12 +207,12 @@ class AudioEventMaintainer(threading.Thread):
audio = np.frombuffer(self.pipe_file.read(self.chunk_size), dtype=np.int16) audio = np.frombuffer(self.pipe_file.read(self.chunk_size), dtype=np.int16)
self.detect_audio(audio) self.detect_audio(audio)
except BrokenPipeError as e: except BrokenPipeError as e:
logger.error(f"There was a broken pipe :: {e}") self.restart_audio_pipe()
# TODO fix broken pipe
pass
def run(self) -> None: def run(self) -> None:
self.init_ffmpeg() self.restart_audio_pipe()
while not self.stop_event.is_set(): while not self.stop_event.is_set():
self.read_audio() self.read_audio()
stop_ffmpeg(self.audio_listener, logger)