You've already forked FrameTour-RenderWorker
feat(task): 支持图片素材类型的视频渲染
- 添加 IMAGE_EXTENSIONS 常量定义支持的图片格式 - 实现 get_material_type 方法优先使用服务端类型或根据URL后缀推断 - 添加 is_image_material 方法判断素材是否为图片类型 - 修改 RenderSegmentVideoHandler 支持图片转视频流程 - 实现 _convert_image_to_video 方法将静态图片转换为视频 - 更新下载步骤为先检测素材类型再确定输入文件扩展名 - 添加图片素材转换为视频的处理逻辑 - 重构步骤编号以匹配新的处理流程 - 优化错误提示信息支持HTTP/HTTPS协议检查
This commit is contained in:
@@ -9,6 +9,12 @@ from enum import Enum
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Dict, Any, Optional, List
|
||||
from datetime import datetime
|
||||
from urllib.parse import urlparse, unquote
|
||||
import os
|
||||
|
||||
|
||||
# 支持的图片扩展名
|
||||
IMAGE_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.webp', '.bmp', '.gif'}
|
||||
|
||||
|
||||
class TaskType(Enum):
|
||||
@@ -369,6 +375,37 @@ class Task:
|
||||
"""获取绑定的素材 URL(实际可下载的 HTTP URL)"""
|
||||
return self.payload.get('boundMaterialUrl')
|
||||
|
||||
def get_material_type(self) -> str:
|
||||
"""
|
||||
获取素材类型
|
||||
|
||||
优先使用服务端下发的 materialType 字段,
|
||||
如果不存在则根据 URL 后缀自动推断。
|
||||
|
||||
Returns:
|
||||
素材类型:"video" 或 "image"
|
||||
"""
|
||||
# 优先使用服务端下发的类型
|
||||
material_type = self.payload.get('materialType')
|
||||
if material_type in ('video', 'image'):
|
||||
return material_type
|
||||
|
||||
# 降级:根据 URL 后缀推断
|
||||
material_url = self.get_material_url()
|
||||
if material_url:
|
||||
parsed = urlparse(material_url)
|
||||
path = unquote(parsed.path)
|
||||
_, ext = os.path.splitext(path)
|
||||
if ext.lower() in IMAGE_EXTENSIONS:
|
||||
return 'image'
|
||||
|
||||
# 默认视频类型
|
||||
return 'video'
|
||||
|
||||
def is_image_material(self) -> bool:
|
||||
"""判断素材是否为图片类型"""
|
||||
return self.get_material_type() == 'image'
|
||||
|
||||
def get_render_spec(self) -> RenderSpec:
|
||||
"""获取渲染规格"""
|
||||
return RenderSpec.from_dict(self.payload.get('renderSpec'))
|
||||
|
||||
Reference in New Issue
Block a user