mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-11 18:42:49 +00:00
56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
import os
|
|
from uuid import uuid4
|
|
from loguru import logger
|
|
from typing import Dict, List, Optional, Tuple
|
|
|
|
from app.services import material
|
|
|
|
|
|
class VideoService:
|
|
@staticmethod
|
|
async def crop_video(
|
|
video_path: str,
|
|
video_script: List[dict]
|
|
) -> Tuple[str, Dict[str, str]]:
|
|
"""
|
|
裁剪视频服务
|
|
|
|
Args:
|
|
video_path: 视频文件路径
|
|
video_script: 视频脚本列表
|
|
|
|
Returns:
|
|
Tuple[str, Dict[str, str]]: (task_id, 裁剪后的视频片段字典)
|
|
视频片段字典格式: {timestamp: video_path}
|
|
"""
|
|
try:
|
|
task_id = str(uuid4())
|
|
|
|
# 从脚本中提取时间戳列表
|
|
time_list = [scene['timestamp'] for scene in video_script]
|
|
|
|
# 调用裁剪服务
|
|
subclip_videos = material.clip_videos(
|
|
task_id=task_id,
|
|
timestamp_terms=time_list,
|
|
origin_video=video_path
|
|
)
|
|
|
|
if subclip_videos is None:
|
|
raise ValueError("裁剪视频失败")
|
|
|
|
# 更新脚本中的视频路径
|
|
for scene in video_script:
|
|
try:
|
|
scene['path'] = subclip_videos[scene['timestamp']]
|
|
except KeyError as err:
|
|
logger.error(f"更新视频路径失败: {err}")
|
|
|
|
logger.debug(f"裁剪视频成功,共生成 {len(time_list)} 个视频片段")
|
|
logger.debug(f"视频片段路径: {subclip_videos}")
|
|
|
|
return task_id, subclip_videos
|
|
|
|
except Exception as e:
|
|
logger.exception("裁剪视频失败")
|
|
raise |