📚 离职知识库

豆包视频理解(走云雾中转)—— 实测可用

2026-07-20 实测跑通:用云雾这把 key,通过 OpenAI 兼容接口调 doubao-seed-2-1-pro-260628, 直接把本地视频 base64 内联发进去,能准确理解画面 + 文字 + 环境音。 这是目前国内可直连、免翻墙、又能吃视频的最强一档

#核心配置

接口:   https://yunwu.ai/v1/chat/completions   (标准 OpenAI /chat/completions)
Key:    <KEY>   (与云雾文本同一把 key)
模型:   doubao-seed-2-1-pro-260628
能力:   对话 / 工具 / 识图 / 视频 / 思考

#关键:视频怎么传

豆包在 OpenAI 兼容协议下,视频放进 messages[].content 数组,type 用 video_url, url 填 base64 的 data URI(本地文件)或公网视频 URL:

{
  "model": "doubao-seed-2-1-pro-260628",
  "messages": [{
    "role": "user",
    "content": [
      {"type": "text", "text": "详细描述这个视频"},
      {"type": "video_url", "video_url": {"url": "data:video/mp4;base64,AAAA..."}}
    ]
  }]
}
  • 本地小视频(建议 < 20MB)直接 base64 内联即可;再大先 ffmpeg 压缩或抽帧。
  • 音轨会随视频一起进模型(豆包官方称支持音画联合理解)。

#实测记录(2026-07-20)

  • 素材:556KB / 4.4 秒 / 720×1280 竖屏带音频
  • 结果:准确识别现场画面,读出背景板文字、楼层标识、观众/三脚架摄影设备/竖幅, 并描述了现场嘈杂人声 → 画面 + 环境音都成功进入模型
  • 消耗:prompt 6406 token + completion 2090 token(4.4 秒视频)
  • 计价:云雾该模型 ⚡9/⚡45(或 ⚡18/⚡90,分组不同)每 1M token,单次约 0.15 额度,极便宜

#注意

  • 云雾没有 Gemini(视频理解最强档)也没有阶跃 StepFun;国产直连里豆包 Seed 是画面+音频+时间戳最全的,故视频理解首选它。
  • 云雾另一可选:qwen3-vl-plus / qwen3-vl-flash(更便宜,但不支持视频里的音频,只看画面)。
  • 付费额度 key,泄露到 yunwu.ai 控制台作废重建,同步更新配置和脚本。

#一键脚本(key 改为读环境变量)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
豆包视频理解(走云雾中转,OpenAI 兼容接口)—— 实测可用
用法:
    YUNWU_API_KEY=<你的key> python3 doubao-video-understand.py <视频路径> ["自定义提问"]
说明:
- 本地小视频直接 base64 内联发送(建议 < 20MB;再大就先 ffmpeg 压或抽帧)。
- 模型:doubao-seed-2-1-pro-260628(支持识图/视频/思考/工具)。
- 音频:豆包官方称支持音画联合理解,本脚本已把整段视频(含音轨)传入。
"""
import base64, json, sys, os, urllib.request, urllib.error

API_KEY = os.environ["YUNWU_API_KEY"]  # 从环境变量读,不写死在脚本里
BASE = "https://yunwu.ai/v1/chat/completions"
MODEL = "doubao-seed-2-1-pro-260628"

def main():
    if len(sys.argv) < 2:
        print("用法: YUNWU_API_KEY=xxx python3 doubao-video-understand.py <视频路径> [提问]")
        sys.exit(1)
    video = os.path.expanduser(sys.argv[1])
    prompt = sys.argv[2] if len(sys.argv) > 2 else \
        "请详细描述这个视频里发生了什么:画面内容、动作、如果有声音也说说听到了什么。"

    size = os.path.getsize(video)
    if size > 20 * 1024 * 1024:
        print(f"[警告] 视频 {size/1024/1024:.1f}MB 偏大,base64 内联可能超请求体限制,建议先压缩或抽帧。")

    with open(video, "rb") as f:
        data_uri = "data:video/mp4;base64," + base64.b64encode(f.read()).decode()

    payload = {
        "model": MODEL,
        "messages": [{
            "role": "user",
            "content": [
                {"type": "text", "text": prompt},
                {"type": "video_url", "video_url": {"url": data_uri}},
            ],
        }],
    }
    req = urllib.request.Request(
        BASE, data=json.dumps(payload).encode(),
        headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=300) as resp:
            r = json.load(resp)
        print("USAGE:", r.get("usage"))
        print("=" * 40)
        print(r["choices"][0]["message"]["content"])
    except urllib.error.HTTPError as e:
        print("HTTP ERROR", e.code)
        print(e.read().decode()[:2000])

if __name__ == "__main__":
    main()

来源:配置信息/豆包视频理解-云雾中转.md;配置信息/doubao-video-understand.py(整理于 2026-08-18)