| import shutil |
| from pathlib import Path |
|
|
| from dotenv import load_dotenv |
| import subprocess |
| import os |
| import uuid |
|
|
| from app.utils.path_helper import get_runtime_dir |
| load_dotenv() |
| api_path = os.getenv("API_BASE_URL", "http://localhost") |
| BACKEND_PORT= os.getenv("BACKEND_PORT", 8483) |
|
|
| BACKEND_BASE_URL = f"{api_path}:{BACKEND_PORT}" |
|
|
| from typing import Optional |
| def generate_screenshot(video_path: str, output_dir: str, timestamp: int, index: int) -> str: |
| """ |
| 使用 ffmpeg 生成截图,返回生成图片路径 |
| """ |
| output_dir = Path(output_dir) |
| output_dir.mkdir(parents=True, exist_ok=True) |
|
|
| filename = f"screenshot_{index:03}_{uuid.uuid4()}.jpg" |
| output_path = output_dir / filename |
|
|
| command = [ |
| "ffmpeg", |
| "-ss", str(timestamp), |
| "-i", str(video_path), |
| "-frames:v", "1", |
| "-q:v", "2", |
| str(output_path), |
| "-y" |
| ] |
|
|
| print("Running command:", command) |
| result = subprocess.run(command, capture_output=True, text=True) |
|
|
| if result.returncode != 0: |
| print("ffmpeg failed:", result.stderr) |
|
|
| return str(output_path) |
|
|
|
|
|
|
| def save_cover_to_static(local_cover_path: str, subfolder: Optional[str] = "cover") -> str: |
| """ |
| 将封面图片保存到 static 目录下,并返回前端可访问的路径 |
| :param local_cover_path: 本地原封面路径(比如提取出来的jpg) |
| :param subfolder: 子目录,默认是 cover,可以自定义 |
| :return: 前端访问路径,例如 /static/cover/xxx.jpg |
| """ |
| |
| |
| |
| target_dir = get_runtime_dir(os.path.join("static", subfolder or "cover")) |
|
|
| |
| file_name = os.path.basename(local_cover_path) |
| target_path = os.path.join(target_dir, file_name) |
| shutil.copy2(local_cover_path, target_path) |
| image_relative_path = f"/static/{subfolder}/{file_name}".replace("\\", "/") |
| url_path = f"{BACKEND_BASE_URL.rstrip('/')}/{image_relative_path.lstrip('/')}" |
| |
| return url_path |
|
|