You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:24:37