豆包视频理解(走云雾中转)—— 实测可用
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)