Skip to content

Commit cd6d882

Browse files
committed
feat: kling video extend
1 parent 3778361 commit cd6d882

File tree

3 files changed

+237
-1
lines changed

3 files changed

+237
-1
lines changed

docs/zh/models/kling/api/video-extend.md

+32-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ updatedAt: 2025-05-09
4747
4848
<<< @/zh/snippets/video-extend-api.py{5-6,19-24}
4949

50-
## 响应参数示例
50+
## 生成响应参数
5151

5252
> 业务码的含义请参考 [业务码](/zh/models/kling/api/business-code.md)
5353
@@ -65,5 +65,36 @@ updatedAt: 2025-05-09
6565
}
6666
```
6767

68+
## 查询响应参数
6869

70+
```
71+
{
72+
"code": 0, //错误码;具体定义见1.1错误码
73+
"message": "string", //错误信息;具体定义见1.1错误码
74+
"request_id": "string", //请求ID,系统生成,用于跟踪请求、排查问题;全局唯一
75+
"data":{
76+
"task_id": "string", //任务ID,系统生成;全局唯一
77+
"task_status": "string", //任务状态,枚举值:submitted(已提交)、processing(处理中)、succeed(成功)、failed(失败)
78+
"task_status_msg": "string", //任务状态信息,当任务失败时展示失败原因(如触发平台的内容风控等)
79+
"task_info":{ //任务创建时的参数信息
80+
"parent_video": {
81+
"id": "string", //续写前的视频ID;全局唯一
82+
"url": "string", //续写前视频的URL(请注意,为保障信息安全,生成的图片/视频会在30天后被清理,请及时转存)
83+
"duration": "string" //续写前的视频总时长,单位s
84+
}
85+
}, //任务创建时用户填写的详细信息
86+
"task_result":{
87+
"videos":[ //数组是为了保留扩展性,以防未来要支持n
88+
{
89+
"id": "string", //续写后的完整视频ID;全局唯一
90+
"url": "string", //续写后视频的URL
91+
"duration": "string" //视频总时长,单位s
92+
}
93+
]
94+
}
95+
"created_at": 1722769557708, //任务创建时间,Unix时间戳、单位ms
96+
"updated_at": 1722769557708, //任务更新时间,Unix时间戳、单位ms
97+
}
98+
}
99+
```
69100

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
title: 可灵 Kling 视频延长案例
3+
gitChangelog: false
4+
updatedAt: 2025-05-11
5+
---
6+
7+
# 可灵 Kling 视频延长
8+
9+
这是一个视频延长的示例,使用 kling 延长视频。
10+
11+
> [!TIP]
12+
> 视频延长是计算密集型任务,特别是高质量、高分辨率视频可能需要数十秒甚至数分钟处理时间,为了让用户发送请求后可以立即收到响应(任务ID),而不必等待整个生成过程,因此用户可以同时提交多个生成任务,然后异步查询结果。
13+
> 同时这样的队列系统允许服务提供商根据可用GPU/TPU资源智能调度任务。
14+
15+
通常来说,视频延长的常见流程是:
16+
17+
1. `POST`: 调用 `视频延长api` 提交视频延长任务,返回获取 `task_id`
18+
2. `GET`: 根据 `task_id` 调用 `查询视频api` 查看视频延长任务是否完成。
19+
20+
本示例实现了每隔一秒轮询任务状态,直到任务完成,然后返回视频 url 和 id。
21+
22+
## 代码示例
23+
24+
> 深色背景为可以修改的参数,非必选参数已经注释,可以按照自己的需求启用。
25+
26+
27+
<<< @/zh/snippets/kling-video-extend.py{124-125,132-138}
28+
29+
30+
## 返回结果
31+
32+
返回结果为视频的 url 和 id,视频的有效期一般为 30 天,推荐尽快下载或者转存。
33+
34+
```
35+
36+
```
37+
38+
## 流程图
39+
40+
```mermaid
41+
flowchart TD
42+
A[开始] --> B[初始化 KlingVideoExtend 实例]
43+
B --> C[调用 extend_video 方法]
44+
45+
C --> D[准备参数: task_id, video_id, prompt等]
46+
D --> E[调用 _kling_extend_video 提交任务]
47+
E --> F[获取task_id]
48+
49+
F --> G[开始循环查询结果]
50+
G --> H[调用 _query_video_extend_result 查询]
51+
52+
H --> I{任务是否完成?}
53+
I -->|否| J{是否超时?}
54+
J -->|否| K[等待1秒]
55+
K --> H
56+
J -->|是| L[返回超时信息]
57+
58+
I -->|是| M[获取结果: video_url, video_id]
59+
M --> N[返回视频URL和视频ID]
60+
61+
L --> O[结束]
62+
N --> O
63+
```
+142
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
import http.client
2+
import json
3+
import time
4+
5+
class KlingVideoExtend:
6+
def __init__(self, api_token, api_url):
7+
"""初始化 Kling 视频延长生成器
8+
9+
参数:
10+
api_token: API 密钥
11+
api_url: API 节点地址
12+
"""
13+
self.api_url = api_url
14+
self.api_token = api_token
15+
# 初始化 HTTP 连接
16+
self.conn = http.client.HTTPSConnection(self.api_url)
17+
self.endpoint = "/kling/v1/videos/video-extend"
18+
# 设置请求头
19+
self.headers = {
20+
'Authorization': f'Bearer {self.api_token}',
21+
'Content-Type': 'application/json'
22+
}
23+
24+
def _kling_extend_video(self, task_id, video_id, prompt, negative_prompt="", cfg_scale=0.5, callback_url=""):
25+
"""使用 kling 提交视频延长任务
26+
27+
参数:
28+
task_id: str, 任务ID
29+
video_id: str, 要延长的视频ID
30+
prompt: str, 文本提示词,指导延长方向
31+
negative_prompt: str, 负向文本提示词
32+
cfg_scale: float, 提示词参考强度
33+
callback_url: str, 回调地址,可以用于 webhook 等通知场景
34+
返回:
35+
task_id: 生成任务的 id
36+
"""
37+
# 构建请求体,请求的核心参数
38+
payload = {
39+
"task_id": task_id,
40+
"video_id": video_id,
41+
"prompt": prompt,
42+
"negative_prompt": negative_prompt,
43+
"cfg_scale": cfg_scale,
44+
"callback_url": callback_url
45+
}
46+
47+
# 发送 POST 请求,提交视频延长任务
48+
self.conn.request("POST", self.endpoint, json.dumps(payload), self.headers)
49+
# 获取响应
50+
res = self.conn.getresponse()
51+
# 读取响应内容并解析为 JSON
52+
json_data = json.loads(res.read().decode("utf-8"))
53+
54+
if 'code' in json_data and json_data['code'] == 0:
55+
# 成功则返回提交的任务 id
56+
return json_data['data']['task_id']
57+
else:
58+
# 失败则返回错误信息
59+
raise Exception(f"API调用失败:{json_data['message']}")
60+
61+
def _query_video_extend_result(self, task_id):
62+
"""使用查询接口获取视频延长结果
63+
64+
参数:
65+
task_id: 生成任务的 id
66+
返回:
67+
video_url: 延长后的视频 url,任务未完成时返回 None
68+
"""
69+
# 构建查询路径
70+
query_path = f"{self.endpoint}/{task_id}"
71+
72+
# 发送 GET 请求,查询视频延长任务状态
73+
self.conn.request("GET", query_path, None, self.headers)
74+
# 获取响应
75+
res = self.conn.getresponse()
76+
# 读取响应内容并解析为 JSON
77+
json_data = json.loads(res.read().decode("utf-8"))
78+
79+
# 如果任务状态为成功,则返回视频 url
80+
if json_data['data']['task_status'] == "succeed":
81+
video_url = json_data['data']['task_result']['videos'][0]['url']
82+
video_id = json_data['data']['task_result']['videos'][0]['id']
83+
return video_url, video_id
84+
else:
85+
return None
86+
87+
def extend_video(self, task_id, video_id, prompt, negative_prompt="", cfg_scale=0.5, callback_url="", timeout=300):
88+
"""实现功能,根据预设的参数延长视频并返回延长后的视频 url
89+
90+
参数:
91+
task_id: str, 任务ID
92+
video_id: str, 要延长的视频ID
93+
prompt: str, 文本提示词,指导延长方向
94+
negative_prompt: str, 负向文本提示词
95+
cfg_scale: float, 提示词参考强度
96+
callback_url: str, 回调地址,可以用于 webhook 等通知场景
97+
timeout: int, 超时时间(秒)
98+
返回:
99+
video_url: 延长后的视频 url
100+
"""
101+
# 调用视频延长 API 提交任务,返回获取 task_id
102+
task_id = self._kling_extend_video(task_id, video_id, prompt, negative_prompt, cfg_scale, callback_url)
103+
104+
start_time = time.time()
105+
106+
# 轮询等待生成完成
107+
while True:
108+
# 根据 task_id 调用查询 API 查看任务是否完成
109+
video_url, video_id = self._query_video_extend_result(task_id)
110+
# 如果任务完成,则返回视频 url
111+
if video_url is not None:
112+
return video_url, video_id
113+
# 如果轮询超时,则返回 None
114+
if time.time() - start_time > timeout:
115+
print(f"请求达到 {timeout} 秒超时")
116+
return None
117+
# 轮询间隔 1 秒
118+
time.sleep(1)
119+
print(f"等待视频延长结果生成,{int(time.time() - start_time)} 秒", flush=True)
120+
121+
122+
# 使用示例
123+
if __name__ == "__main__":
124+
API_URL = "www.dmxapi.cn" # API 节点地址
125+
DMX_API_TOKEN = "sk-XXXXXXXXXXXXXX" # API 密钥
126+
127+
# 创建视频延长生成器实例
128+
kling_video_extend = KlingVideoExtend(api_token=DMX_API_TOKEN, api_url=API_URL)
129+
130+
# 延长视频
131+
video_url, video_id = kling_video_extend.extend_video(
132+
task_id="CjhDaWgU7GAAAAAAAb1QfA", # [必选] 任务ID
133+
video_id="bc17f1e8-6c7b-440c-bd30-e47fb1c82932", # [必选] 要延长的视频ID
134+
prompt="继续展示动物的走动,保持相同的风格和氛围", # [必选] 文本提示词
135+
# negative_prompt="突然的场景转换, 光线变化, 画面抖动", # 负向提示词
136+
# cfg_scale=0.5, # 提示词参考强度,设置较高以保持连贯性
137+
# callback_url="", # 回调地址
138+
# timeout=300 # 等待超时时间,视频处理通常需要更长时间
139+
)
140+
141+
print(video_url)
142+
print(video_id)

0 commit comments

Comments
 (0)