From a18fcc81c8aefdd0cf9fac605446ef1f74252e9e Mon Sep 17 00:00:00 2001 From: Arnaud_Cayrol Date: Wed, 9 Apr 2025 21:41:20 +0200 Subject: [PATCH] Add progress report for ffmpeg --- main.py | 32 ++++++++++++++++++++++++++++---- timelapse.py | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index b17b544..56d226b 100644 --- a/main.py +++ b/main.py @@ -97,16 +97,39 @@ def background_process(person_id, padding_percent, resize_size, face_resolution_ "-i", os.path.join(OUTPUT_FOLDER, "*.jpg"), "-c:v", "libx264", "-pix_fmt", "yuv420p", + "-progress", "pipe:1", output_video ] try: - subprocess.run(ffmpeg_command, check=True) - progress_info["video_path"] = output_video - progress_info["status"] = "video_done" + progress_info["completed"] = 0 + progress_info["total"] = 100 + progress_info["status"] = "video_compiling" + + process = subprocess.Popen(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + universal_newlines=True) + for line in process.stdout: + line = line.strip() + if line: + if line.startswith("frame="): + try: + parts = line.split("=") + frame = int(parts[1].strip()) + progress_info["completed"] = min(frame, progress_info["total"]) + except Exception: + pass + if "progress=end" in line: + progress_info["completed"] = progress_info["total"] + break + process.wait() + if process.returncode == 0: + progress_info["status"] = "video_done" + else: + progress_info["status"] = "Video compilation failed." except subprocess.CalledProcessError as e: progress_info["status"] = f"Video compilation failed: {e}" else: progress_info["status"] = "done" + except Exception as e: progress_info["status"] = f"error: {e}" @@ -225,4 +248,5 @@ def index(): if __name__ == "__main__": - app.run(host="0.0.0.0", port=5000) \ No newline at end of file + app.run(host="0.0.0.0", port=5000) + \ No newline at end of file diff --git a/timelapse.py b/timelapse.py index e7920d6..aff1290 100644 --- a/timelapse.py +++ b/timelapse.py @@ -444,4 +444,4 @@ def process_faces(config: ProcessConfig, max_workers=1, progress_callback=None, progress_callback(completed_count, total_assets) logger.info(f"Finished processing. {len(processed_files)} images saved out of {total_assets} assets.") - return processed_files \ No newline at end of file + return processed_files