D-ID API异步视频处理完成后无法获取视频URL,返回pending_url的问题咨询
D-ID API异步视频处理完成后无法获取视频URL,返回pending_url的问题咨询
我完全懂你现在的困扰——刚成功创建完talk就立刻去查询详情,结果拿到的是pending_url,状态还显示started,根本拿不到想要的成品视频链接。其实这是D-ID API的正常异步处理逻辑,生成AI驱动的视频需要一定的处理时间,不是即时就能完成的,咱们得用正确的方式等待处理完成才行。下面给你两种常用的解决方案:
方案一:轮询检查状态(快速上手,适合测试/小场景)
这是最直接的方式,就是定期调用查询talk详情的接口,直到状态变成done,这时响应里就会出现result_url(也就是最终的视频链接)。
修改你的Flask代码示例:
你可以在POST请求成功后,添加一个循环来轮询状态,记得加上延迟避免太频繁请求(防止触发API限流),同时设置最大重试次数避免无限循环:
# ... 之前的POST请求代码 ... if response.status_code == 201: id_video = response.json()["id"] print(f"开始轮询talk {id_video}的处理状态...") import time max_retries = 20 # 根据视频长度调整,比如10秒左右的视频大概重试5-10次 retry_interval = 3 # 每次间隔3秒 for _ in range(max_retries): # 构造GET请求 url = f"https://api.d-id.com/talks/{id_video}" headers = { "accept": "application/json", "authorization": f"Bearer {bearer_token}" } get_response = requests.get(url, headers=headers) get_data = get_response.json() status = get_data.get("status") print(f"当前状态: {status}") if status == "done": # 处理完成,拿到视频链接 result_url = get_data.get("result_url") print(f"视频处理完成!链接: {result_url}") return f"视频链接: {result_url}" elif status == "failed": # 处理失败,返回错误信息 error_msg = get_data.get("error", "未知错误") print(f"视频处理失败: {error_msg}") return f"视频处理失败: {error_msg}" # 还在处理,等待后重试 time.sleep(retry_interval) # 超过最大重试次数 return "视频处理超时,请稍后再查询"
方案二:使用Webhook(高效推荐,适合生产环境)
如果是生产环境,轮询会占用不必要的资源,更推荐用Webhook机制:在创建talk的时候,指定一个你的回调URL,当视频处理完成(或失败)时,D-ID会主动把结果推送到这个URL,你只需要在回调接口里处理返回的数据就行。
修改POST请求的Payload:
在创建talk的payload里添加webhook字段,指定你的公网可访问的回调地址:
payload = { "source_url": source_url, "script": { "type": "text", "subtitles": "false", "provider": { "type": "microsoft", "voice_id": "Sara" }, "input": input_text }, "config": { "fluent": "false", "pad_audio": "0.0" }, "webhook": "https://your-domain.com/did-webhook" # 替换成你的回调URL }
编写Flask回调接口:
然后在你的Flask应用里添加一个接收Webhook的路由:
@app.route('/did-webhook', methods=['POST']) def did_webhook(): data = request.get_json() talk_id = data.get("id") status = data.get("status") if status == "done": result_url = data.get("result_url") print(f"Talk {talk_id}处理完成,视频链接: {result_url}") # 这里可以把链接存到数据库或者做其他业务处理 elif status == "failed": error_msg = data.get("error") print(f"Talk {talk_id}处理失败: {error_msg}") # 必须返回200状态码,告诉D-ID你已经收到回调 return "", 200
一些注意事项:
- 状态说明:D-ID的talk状态除了
created、started,还有done(成功完成)、failed(处理失败),一定要处理失败的情况,避免卡住。 - 轮询间隔:不要设置得太频繁,建议2-5秒一次,否则可能触发API的限流机制。
- Webhook要求:你的回调URL必须能被公网访问,并且正确处理POST请求,返回200状态码,否则D-ID会重复推送回调。
备注:内容来源于stack exchange,提问作者Ramiro
相关产品推荐
相关产品推荐

