You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.4 KiB
41 lines
1.4 KiB
import threading
|
|
import tempfile
|
|
import time
|
|
|
|
class ProgressFfmpeg(threading.Thread):
|
|
def __init__(self, vid_duration_seconds, progress_update_callback):
|
|
threading.Thread.__init__(self, name="ProgressFfmpeg")
|
|
self.stop_event = threading.Event()
|
|
self.output_file = tempfile.NamedTemporaryFile(mode="w+", delete=False)
|
|
self.vid_duration_seconds = vid_duration_seconds
|
|
self.progress_update_callback = progress_update_callback
|
|
|
|
def run(self):
|
|
while not self.stop_event.is_set():
|
|
latest_progress = self.get_latest_ms_progress()
|
|
completed_percent = latest_progress / self.vid_duration_seconds
|
|
self.progress_update_callback(completed_percent)
|
|
time.sleep(0.1)
|
|
|
|
def get_latest_ms_progress(self):
|
|
lines = self.output_file.readlines()
|
|
if lines:
|
|
for line in lines:
|
|
if "out_time_ms" in line:
|
|
out_time_ms_str = line.split("=")[1].strip()
|
|
if out_time_ms_str.isnumeric():
|
|
return float(out_time_ms_str) / 1000000.0
|
|
else:
|
|
# Handle the case when "N/A" is encountered
|
|
return 0 # None
|
|
return 0 # None
|
|
|
|
def stop(self):
|
|
self.stop_event.set()
|
|
|
|
def __enter__(self):
|
|
self.start()
|
|
return self
|
|
|
|
def __exit__(self, *args, **kwargs):
|
|
self.stop() |