This commit is contained in:
2025-10-20 20:36:27 +08:00
parent 07bc8a63db
commit d197a212de
2 changed files with 19 additions and 15 deletions

View File

@ -8,7 +8,7 @@ from time import time
from rich.logging import RichHandler
from rich.progress import Progress
from pickle import dumps, loads
from typing import Optional
from typing import Optional,Callable
import atexit
import re
@ -111,14 +111,17 @@ def fmt_time(t:float|int) -> str:
else:
return f"{round(t)}s"
def process_video(video_path: Path, compress_dir:Optional[Path]=None ,update_func=None):
use=None
sz=video_path.stat().st_size//(1024*1024)
def process_video(
video_path: Path,
compress_dir:Optional[Path]=None ,
update_func:Optional[Callable[[Optional[int],Optional[str]],None]]=None):
if compress_dir is None:
# 在视频文件所在目录下创建 compress 子目录(如果不存在)
compress_dir = video_path.parent / CFG["compress_dir_name"]
else:
assert root
compress_dir /= video_path.parent.relative_to(root)
assert isinstance(compress_dir,Path)
@ -128,7 +131,6 @@ def process_video(video_path: Path, compress_dir:Optional[Path]=None ,update_fun
output_file = compress_dir / (video_path.stem + video_path.suffix)
if output_file.is_file():
logging.warning(f"文件{output_file}存在,跳过")
return use
video_path_str = str(video_path.absolute())
command = get_cmd(video_path_str,output_file)
@ -145,19 +147,21 @@ def process_video(video_path: Path, compress_dir:Optional[Path]=None ,update_fun
while result.poll() is None:
line = " "
while result.poll() is None and line[-1:] not in "\r\n":
assert result.stderr is not None
line+=result.stderr.read(1)
# print(line[-1])
if 'warning' in line.lower():
logging.warning(f"[FFmpeg]({video_path_str}): {line}")
elif 'error' in line.lower():
logging.error(f"[FFmpeg]({video_path_str}): {line}")
elif "frame=" in line:
elif "frame=" in line and update_func is not None:
# print(line,end="")
match = re.search(r"frame=\s*(\d+)",line)
if match:
frame_number = int(match.group(1))
if update_func is not None:
update_func(frame_number)
frame_number = int(match.group(1)) if match else None
match = re.search(r"[\d\.]+x",line)
rate = match.group(0) if match else None
update_func(frame_number,rate)
if result.returncode != 0:
logging.error(f"处理文件 {video_path_str} 失败,返回码: {result.returncode}cmd={' '.join(command)}")
@ -169,7 +173,6 @@ def process_video(video_path: Path, compress_dir:Optional[Path]=None ,update_fun
except KeyboardInterrupt as e:raise e
except Exception as e:
logging.error(f"执行 ffmpeg 命令时发生异常, 文件:{str(video_path_str)}cmd={' '.join(map(str,command))}",exc_info=e)
return use
def traverse_directory(root_dir: Path):
video_extensions = set(CFG["video_ext"])
@ -260,12 +263,12 @@ def traverse_directory(root_dir: Path):
with prog._lock:
completed_start = prog._tasks[main_task].completed
def update_progress(x):
def update_progress(x, rate):
if frames[file] == 0:
prog.update(file_task,description=f"{filename} 已处理{x}")
prog.update(file_task,description=f"{filename} 已处理{x} {f'速率{rate}' if rate else ''}")
else:
prog.update(file_task,completed=x)
prog.update(file_task,completed=x,description=f"{filename} {f'速率{rate}' if rate else ''}")
prog.update(main_task, completed=completed_start+x)
if CFG["save_to"] == "single":

View File

@ -0,0 +1 @@
rich