From c9650977f63e7d8c2a86a0df18702719a49844ab Mon Sep 17 00:00:00 2001 From: Vamsidhar Yeddu Date: Mon, 26 Jun 2023 13:51:41 +0530 Subject: [PATCH 1/3] kill ffmpeg process on finish up if enabled --- ffmpeg_streaming/_media.py | 6 ++++++ ffmpeg_streaming/_process.py | 10 +++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/ffmpeg_streaming/_media.py b/ffmpeg_streaming/_media.py index e8aab5b..2d17948 100644 --- a/ffmpeg_streaming/_media.py +++ b/ffmpeg_streaming/_media.py @@ -42,6 +42,8 @@ def __init__(self, media, _format: Format, **options): self.options = options self.pipe = None self.output_temp = False + self.process = None + self.kill_process_on_exit = options.pop('kill_process_on_exit', False) def finish_up(self): """ @@ -55,6 +57,8 @@ def finish_up(self): shutil.move(os.path.dirname(self.output_), os.path.dirname(str(self.output))) else: shutil.rmtree(os.path.dirname(str(self.output_)), ignore_errors=True) + if self.kill_process_on_exit: + self.process.__exit__() @abc.abstractmethod def set_up(self): @@ -103,6 +107,7 @@ def _run(self, ffmpeg_bin, monitor: callable = None, **options): @TODO: add documentation """ with Process(self, command_builder(ffmpeg_bin, self), monitor, **options) as process: + self.process = process self.pipe, err = process.run() async def async_run(self, ffmpeg_bin, monitor: callable = None, **options): @@ -177,6 +182,7 @@ class HLS(Streaming): PERIODIC_RE_KEY_FLAG = 'periodic_rekey' MASTER_PLAYLIST_IS_SAVED = False + def set_up(self): """ @TODO: add documentation diff --git a/ffmpeg_streaming/_process.py b/ffmpeg_streaming/_process.py index 5ddead8..7374b55 100644 --- a/ffmpeg_streaming/_process.py +++ b/ffmpeg_streaming/_process.py @@ -58,11 +58,14 @@ def __init__(self, media, commands: str, monitor: callable = None, **options): self.process = _p_open(commands, **options) self.media = media self.monitor = monitor + self.exited = False def __enter__(self): return self - def __exit__(self, exc_type, exc_val, exc_tb): + def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): + logging.info("exiting ffmpeg process.") + self.exited = True self.process.kill() def _monitor(self): @@ -119,8 +122,9 @@ def run(self): if self.process.poll(): error = str(Process.err) if Process.err else str(Process.out) - logging.error('ffmpeg failed to execute command: {}'.format(error)) - raise RuntimeError('ffmpeg failed to execute command: ', error) + if not self.exited: + logging.error('ffmpeg failed to execute command: {}'.format(error)) + raise RuntimeError('ffmpeg failed to execute command: ', error) logging.info("ffmpeg executed command successfully") From f2df97e5df88f0f8894c71727762ed35ac7c4ead Mon Sep 17 00:00:00 2001 From: Vamsidhar Yeddu Date: Mon, 26 Jun 2023 14:02:58 +0530 Subject: [PATCH 2/3] rm extra line --- ffmpeg_streaming/_media.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ffmpeg_streaming/_media.py b/ffmpeg_streaming/_media.py index 2d17948..1fda912 100644 --- a/ffmpeg_streaming/_media.py +++ b/ffmpeg_streaming/_media.py @@ -182,7 +182,6 @@ class HLS(Streaming): PERIODIC_RE_KEY_FLAG = 'periodic_rekey' MASTER_PLAYLIST_IS_SAVED = False - def set_up(self): """ @TODO: add documentation From 9b12030fd0cb8b12b86b5ad107ce9895f1f87d28 Mon Sep 17 00:00:00 2001 From: Vamsidhar Yeddu Date: Mon, 26 Jun 2023 16:41:49 +0530 Subject: [PATCH 3/3] need to pop from options before setting options in class --- ffmpeg_streaming/_media.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ffmpeg_streaming/_media.py b/ffmpeg_streaming/_media.py index 1fda912..e5e856e 100644 --- a/ffmpeg_streaming/_media.py +++ b/ffmpeg_streaming/_media.py @@ -39,11 +39,11 @@ def __init__(self, media, _format: Format, **options): self.key = None self.media = media self.format = _format - self.options = options self.pipe = None self.output_temp = False self.process = None self.kill_process_on_exit = options.pop('kill_process_on_exit', False) + self.options = options def finish_up(self): """