Add support for start and end frames.

This commit is contained in:
jueming
2025-07-26 12:06:16 +08:00
parent c672dd3734
commit 49332e05b5
2 changed files with 83 additions and 32 deletions
+29 -9
View File
@@ -30,7 +30,9 @@
### 4. Volcengine Doubao Seedance - 豆包Seedance视频生成节点 (新增)
- 火山引擎豆包Seedance视频生成模型
- 支持文生视频和图生视频两种模式
- 支持文生视频、图生视频和首尾帧图生视频三种模式
- 支持两种模型:pro和lite-i2v版本
- lite-i2v模型支持首尾帧图生视频(传入2张图片)
- 支持所有模型文本命令参数:分辨率、宽高比、时长、帧率等
- 支持多种视频分辨率:480p、720p、1080p
- 支持9种宽高比和2种特殊比例模式
@@ -99,10 +101,10 @@ pip install -r requirements.txt
2. 添加 `Volcengine Doubao Seedance` 节点
3. 配置参数:
- **ark_api_key**: 火山方舟API密钥
- **model**: 模型ID (默认doubao-seedance-1-0-pro-250528)
- **model**: 模型ID (doubao-seedance-1-0-pro-250528 或 doubao-seedance-1-0-lite-i2v-250428)
- **prompt**: 视频生成提示词,支持中英文
- **image**: 输入图片 (可选,图生视频模式)
- **image_role**: 图片角色 (可选,first_frame或last_frame)
- **first_frame**: 首帧图片 (可选,图生视频模式)
- **last_frame**: 尾帧图片 (可选,首尾帧图生视频模式)
- **resolution**: 视频分辨率 (可选,480p/720p/1080p)
- **ratio**: 视频宽高比 (可选,9种比例+特殊模式)
- **duration**: 视频时长 (可选,5秒或10秒)
@@ -189,13 +191,25 @@ pip install -r requirements.txt
- 16fps → 较低帧率
- 24fps → 标准帧率(默认)
- **图片角色**(图生视频模式):
- first_frame → 首帧图片(默认)
- last_frame → 尾帧图片
- **图片输入方式**(图生视频模式):
- first_frame → 首帧图片输入
- last_frame → 尾帧图片输入
- **模型选择**:
- doubao-seedance-1-0-pro-250528 → 专业版模型,支持文生视频和单图生视频
- doubao-seedance-1-0-lite-i2v-250428 → 轻量版图生视频模型,支持首尾帧图生视频
- **使用模式**:
- 文生视频:仅输入提示词
- 首帧图生视频:连接first_frame输入+提示词
- 尾帧图生视频:连接last_frame输入+提示词
- 首尾帧图生视频:连接first_frame和last_frame输入+提示词(推荐使用lite-i2v模型)
- **使用建议**:
- 提示词描述要清晰具体,避免过于抽象
- 图生视频模式下,输入图片质量会影响生成效果
- 首尾帧模式下,两张图片的宽高比应该一致,系统会以首帧为准自动裁剪尾帧
- 参数名称直观:first_frame表示首帧,last_frame表示尾帧,用户一目了然
- 建议根据实际需求选择合适的分辨率和时长
- 使用keep_ratio或adaptive可以更好地适配输入图片
@@ -251,8 +265,11 @@ pip install -r requirements.txt
### Doubao Seedance 特定注意事项 (新增)
- 视频生成为异步处理,通常需要几分钟时间
- 程序会自动轮询查询结果,请耐心等待
- 支持文生视频和图生视频两种模式
- 支持文生视频、图生视频和首尾帧图生视频三种模式
- 图生视频模式下,输入图片质量会影响生成效果
- 首尾帧模式需要使用lite-i2v模型,连接first_frame和last_frame两个输入
- 首尾帧图片的宽高比不一致时,以首帧图片为主,尾帧会自动裁剪适配
- 参数名称已优化:first_frame和last_frame直观明确,无需额外的角色设置
- 生成的视频URL有效期为24小时,请及时下载保存
- 输入图片和提示词需要通过内容审核
- 建议根据实际用途选择合适的分辨率和时长参数
@@ -290,6 +307,8 @@ pip install -r requirements.txt
- **提示词审核未通过**: 检查提示词内容是否符合平台规范
- **图片审核未通过**: 检查输入图片内容是否符合平台规范
- **参数错误**: 确认所有参数值是否在支持范围内
- **首尾帧图片错误**: 使用首尾帧模式时确保正确连接first_frame和last_frame输入
- **模型与功能不匹配**: pro模型不支持首尾帧,lite-i2v模型专为图生视频设计
- **任务超时**: 可能服务器繁忙,可稍后重试
- **视频生成失败**: 检查提示词和参数设置,重新尝试
- **下载失败**: 网络连接问题,检查网络状态
@@ -321,7 +340,8 @@ pip install -r requirements.txt
- 支持异步任务提交和轮询查询机制
- 完整的模型文本命令参数支持
- 智能图片格式转换和Base64编码
- 支持文生视频和图生视频两种模式
- 支持文生视频、图生视频和首尾帧图生视频三种模式
- 支持多张图片输入和角色配置
- 完善的错误处理和重试机制
- 视频文件自动下载和命名管理
- 支持所有官方模型参数配置
+54 -23
View File
@@ -23,7 +23,7 @@ class VolcengineDoubaoSeedance:
"multiline": False,
"tooltip": "火山方舟API密钥"
}),
"model": (["doubao-seedance-1-0-pro-250528"], {
"model": (["doubao-seedance-1-0-pro-250528", "doubao-seedance-1-0-lite-i2v-250428"], {
"default": "doubao-seedance-1-0-pro-250528",
"tooltip": "模型ID"
}),
@@ -34,12 +34,11 @@ class VolcengineDoubaoSeedance:
}),
},
"optional": {
"image": ("IMAGE", {
"tooltip": "输入图片(图生视频模式)"
"first_frame": ("IMAGE", {
"tooltip": "首帧图片(图生视频模式)"
}),
"image_role": (["first_frame", "last_frame"], {
"default": "first_frame",
"tooltip": "图片角色:首帧或尾帧"
"last_frame": ("IMAGE", {
"tooltip": "尾帧图片(首尾帧图生视频模式,配合lite-i2v模型使用)"
}),
"resolution": (["480p", "720p", "1080p"], {
"default": "720p",
@@ -264,7 +263,7 @@ class VolcengineDoubaoSeedance:
print(f"下载视频时发生错误: {str(e)}")
return None
def generate_video(self, ark_api_key, model, prompt, image=None, image_role="first_frame",
def generate_video(self, ark_api_key, model, prompt, first_frame=None, last_frame=None,
resolution="720p", ratio="adaptive", duration=5, framepersecond=24,
watermark=False, seed=-1, camerafixed=False, filename_prefix="doubao_seedance"):
"""主要的视频生成函数"""
@@ -292,23 +291,55 @@ class VolcengineDoubaoSeedance:
"text": text_with_commands
})
# 如果有图片,添加图片内容(图生视频模式)
if image is not None:
print("检测到输入图片,使用图生视频模式")
image_base64 = self.image_to_base64(image)
image_content = {
"type": "image_url",
"image_url": {
"url": image_base64
# 处理图片输入(图生视频模式)
if first_frame is not None or last_frame is not None:
if first_frame is not None and last_frame is not None:
print("检测到首尾帧图片,使用首尾帧图生视频模式")
# 处理首帧图片
first_frame_base64 = self.image_to_base64(first_frame)
first_frame_content = {
"type": "image_url",
"image_url": {
"url": first_frame_base64
},
"role": "first_frame"
}
}
# 如果指定了图片角色,添加role字段
if image_role in ["first_frame", "last_frame"]:
image_content["role"] = image_role
content_list.append(image_content)
content_list.append(first_frame_content)
# 处理尾帧图片
last_frame_base64 = self.image_to_base64(last_frame)
last_frame_content = {
"type": "image_url",
"image_url": {
"url": last_frame_base64
},
"role": "last_frame"
}
content_list.append(last_frame_content)
elif first_frame is not None:
print("检测到首帧图片,使用图生视频模式")
first_frame_base64 = self.image_to_base64(first_frame)
first_frame_content = {
"type": "image_url",
"image_url": {
"url": first_frame_base64
},
"role": "first_frame"
}
content_list.append(first_frame_content)
elif last_frame is not None:
print("检测到尾帧图片,使用图生视频模式")
last_frame_base64 = self.image_to_base64(last_frame)
last_frame_content = {
"type": "image_url",
"image_url": {
"url": last_frame_base64
},
"role": "last_frame"
}
content_list.append(last_frame_content)
else:
print("使用文生视频模式")