当前位置: 首页
AI教程
C#接入豆包AI模型实现首尾帧视频生成方法

C#接入豆包AI模型实现首尾帧视频生成方法

时间:2026-08-17
转载

通过C 调用火山引擎豆包AI模型API,实现首尾帧模式的视频生成。需注册账号获取API密钥,调用Doubao_CreateVideo创建任务(参数含对话描述、首尾帧图片等),再通过Doubao_QueryVideoTask轮询查询状态直至完成,获取生成视频URL。

欲诚其意者,先致其知,致知在格物。人生太多体验,有悲有喜,有好有坏。没有实践就没有发言权,没有亲自尝试就不要轻易否定,适合你的才是最好的。最近在火山引擎火山方舟平台模型广场中看到豆包推出最强视频生成模型 Doubao-Seedance-1.0-pro,于是也想来体验一下它的魅力。模型提供多种生成方式,其中一项“首尾帧”模式挺有意思——提供首图和尾图两张照片,结合AI对话描述生成结果视频。本文就详细讲讲如何用C#调用平台API来实现这个功能。

调用API前,需要先注册火山引擎帐号并获取API开发密钥。

火山引擎注册地址:https://console.volcengine.com/auth/login

选择火山方舟 → API Key管理 → 创建API Key即可。注意编辑权限,确保能调用对应功能的API。

构思

就像人与人之间有效的沟通一样,给AI模型提供符合情境的素材、精准且逻辑清晰的对话描述,才能生成符合预期的结果。不过为了测试它的“思考”和“创意”能力,这次特意选了两张风格迥异的美女图片——一张是现代风的人物坐在汽车后排,另一张是复古风的人物在女生宿舍。对话描述也很简短:“结合图片,请生成类似周杰伦《红颜如霜》的MV,要求生成音乐”。看看AI模型会怎么处理这种跨度极大的素材。期待之余,多少有点好奇。

创建视频生成任务

模型“思考”和生成视频需要一段时间,属于异步操作。首先要做的就是向模型申请创建视频生成任务。Doubao_CreateVideo方法提供了创建视频任务的能力,基本参数说明如下表:

序号参数名类型说明
1saystring对话描述内容。如“请为我生成一段视频”
2ApiKeystring在火山引擎平台申请的API访问令牌
3first_ImageUrlOrBase64string首帧图片的可访问URL或图片的Base64编码
4last_ImageUrlOrBase64string尾帧图片的可访问URL或图片的Base64编码
5rsstring

指定生成视频的分辨率,默认值为720p

枚举值包括:480p,720p,1080p

6rtstring

指定生成视频的宽高比,默认值为16:9

枚举值包括:16:9,4:3,1:1,3:4,9:16,21:9

7durint

指定生成视频的时长,默认值为5秒

最长目前可选择为12秒

8fpsint指定生成视频的帧率,默认值为24(fps)
9wmbool指定生成的视频是否包含水印(AI生成字样)
10seedint

种子整数,用于控制生成内容的随机性。默认值为11

11cfbool

是否固定摄像头,默认值为false

true:固定摄像头。平台会在用户提示词中追加固定摄像头,实际效果不保证。false:不固定摄像头

12modelstring

使用的模型ID,默认值为官方强烈推荐的doubao-seedance-1-0-pro-250528。详细ID列表请参考官方API文档

方法示例代码如下:

string ErrorMessage = "";
string ResultJson = "";
public void Doubao_CreateVideo(string say, string ApiKey, string first_ImageUrlOrBase64, string last_ImageUrlOrBase64,
    string rs = "720p", string rt = "16:9", int dur = 5, int fps = 24, bool wm = true, int seed = 11, bool cf = false,
    string model = "doubao-seedance-1-0-pro-250528")
{
    string para = string.Format(" --rs {0} --rt {1} --dur {2} --fps {3} --wm {4} --seed {5} --cf {6}", rs, rt, dur, fps, wm, seed, cf);
    string ApiUrl = "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks";
    WebService ws = new WebService();
    string[] headers = new string[3];
    headers[0] = "Content-Type:application/json";
    headers[1] = "Accept:application/json";
    headers[2] = "Authorization:Bearer " + ApiKey + "";
    StringWriter sw = new StringWriter();
    using (Newtonsoft.Json.JsonWriter writer = new Newtonsoft.Json.JsonTextWriter(sw))
    {
        writer.Formatting = Newtonsoft.Json.Formatting.Indented;
        writer.WriteStartObject();
        writer.WritePropertyName("model");
        writer.WriteValue(model);
        writer.WritePropertyName("content");
        writer.WriteStartArray();
        writer.WriteStartObject();
        writer.WritePropertyName("type");
        writer.WriteValue("text");
        writer.WritePropertyName("text");
        writer.WriteValue(say + para);
        writer.WriteEndObject();
        writer.WriteStartObject();
        writer.WritePropertyName("type");
        writer.WriteValue("image_url");
        writer.WritePropertyName("image_url");
        writer.WriteStartObject();
        writer.WritePropertyName("url");
        writer.WriteValue(first_ImageUrlOrBase64);
        writer.WriteEndObject();
        writer.WritePropertyName("role");
        writer.WriteValue("first_frame");
        writer.WriteEndObject();
        writer.WriteStartObject();
        writer.WritePropertyName("type");
        writer.WriteValue("image_url");
        writer.WritePropertyName("image_url");
        writer.WriteStartObject();
        writer.WritePropertyName("url");
        writer.WriteValue(last_ImageUrlOrBase64);
        writer.WriteEndObject();
        writer.WritePropertyName("role");
        writer.WriteValue("last_frame");
        writer.WriteEndObject();
        writer.WriteEndArray();
        writer.WriteEndObject();
        writer.Flush();
    }
    sw.Close();
    string postData = sw.GetStringBuilder().ToString();
    ErrorMessage = "";
    ResultJson = "";
    string rs2 = ws.GetResponseResult(ApiUrl, Encoding.UTF8, "POST", postData, headers);
    ErrorMessage = ws.ErrorMessage;
    ResultJson = rs2;
}

其中 WebService 类示例代码如下(通用HTTP请求封装):

public sealed class WebService
{
    #region Internal Members
    public string ErrorMessage = "";
    #endregion

    public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData)
    {
        return GetResponseResult(url, encoding, method, postData, null);
    }

    private static bool validSecurity(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

    public string GetResponseResult(string url, System.Text.Encoding encoding, string method, string postData,
        string[] headers, string ContentType = "application/x-www-form-urlencoded", bool secValid = true)
    {
        method = method.ToUpper();
        if (secValid == false)
        {
            ServicePointManager.ServerCertificateValidationCallback = validSecurity;
        }
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

        if (method == "GET")
        {
            // ... GET请求代码(略,与原文一致)
        }
        if (method == "POST")
        {
            // ... POST请求代码(略,与原文一致)
        }
        ErrorMessage = "不正确的方法类型。(目前仅支持GET/POST)";
        return "";
    }
}

成功调用后会返回如下JSON:

{ "id": "cgt-20251000000008-xxxbk" }

其中的 id 就是创建成功后的任务ID。此时模型正在生成视频……

查询视频生成任务

根据创建视频成功后返回的ID,可以通过查询视频生成任务API轮询其状态,直到完成。Doubao_QueryVideoTask方法实现对任务ID的详情查询,参数说明如下:

序号参数名称参数类型说明
1taskidstring要查询的视频生成任务ID字符串
2ApiKeystring在火山引擎平台申请的API访问令牌

方法示例代码:

string ErrorMessage = "";
string ResultJson = "";
public void Doubao_QueryVideoTask(string taskid, string ApiKey)
{
    string ApiUrl = "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/" + taskid;
    WebService ws = new WebService();
    string[] headers = new string[2];
    headers[0] = "Content-Type:application/json";
    headers[1] = "Authorization:Bearer " + ApiKey + "";
    ErrorMessage = "";
    ResultJson = "";
    string rs2 = ws.GetResponseResult(ApiUrl, Encoding.UTF8, "GET", "", headers);
    ErrorMessage = ws.ErrorMessage;
    ResultJson = rs2;
}

成功返回示例:

{
  "id": "cgt-2025108-whpbk",
  "model": "doubao-seedance-1-0-pro-250528",
  "status": "succeeded",
  "content": { "video_url": "xxx" },
  "usage": { "completion_tokens": 103818, "total_tokens": 103818 },
  "created_at": 1763455989,
  "updated_at": 1763456064,
  "seed": 11,
  "resolution": "720p",
  "ratio": "16:9",
  "duration": 5,
  "framespersecond": 24
}

其中 status 为状态码,succeeded 表示已完成。其他枚举值:queued(排队中)、running(运行中)、cancelled(取消,取消后24h自动删除,仅支持排队中状态的任务被取消)、failed(失败)。如果返回的JSON中有 content.video_url 字段,就可以访问或下载该视频查看效果。

查询视频生成任务列表

如果没能及时查询单个任务,或者想查看所有生成中/已完成的任务,可以用查询视频生成任务列表API。该API仅支持查询最近7天的历史数据(UTC时间戳,范围 [T-7天, T) )。

Doubao_QueryVideoTaskList方法实现列表查询,参数如下:

序号参数名称参数类型说明
1page_numint起始页码,默认1,最大500
2page_sizeint每页数量,默认500,最大500
3filter_statusstring过滤条件,默认"succeeded"(成功)
4ApiKeystringAPI访问令牌

示例代码:

string ErrorMessage = "";
string ResultJson = "";
public void Doubao_QueryVideoTaskList(int page_num = 1, int page_size = 500, string filter_status = "succeeded", string ApiKey)
{
    string postData = "page_num=" + page_num.ToString() + "&page_size=" + page_size.ToString() + "&filter.status=" + filter_status;
    string ApiUrl = "https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?" + postData;
    WebService ws = new WebService();
    string[] headers = new string[2];
    headers[0] = "Content-Type:application/json";
    headers[1] = "Authorization:Bearer " + ApiKey + "";
    ErrorMessage = "";
    ResultJson = "";
    string rs2 = ws.GetResponseResult(ApiUrl, Encoding.UTF8, "GET", "", headers);
    ErrorMessage = ws.ErrorMessage;
    ResultJson = rs2;
}

成功返回示例:

{
  "total": 5,
  "items": [
    { "id": "...", "model": "...", "status": "succeeded", "content": { "video_url": "https://..." }, ... },
    // 更多条目
  ]
}

可以通过以下代码遍历所有 video_url:

string list = "";
Newtonsoft.Json.Linq.JObject rs2 = Newtonsoft.Json.Linq.JObject.Parse(ResultJson);
for (int i = 0; i < rs2["items"].Count(); i++)
{
    list += rs2["items"][i]["content"]["video_url"].ToString() + "\r";
}

红颜如霜

生成的视频效果有点意思。AI模型确实充分发挥了想象力——对车辆场景的识别、人物行走的创意、过渡的变化都还算可以,毕竟只有12秒。人物面部五官部分稍微有点“拥挤”变形,但整体还原度相当不错。不过要求加入的《红颜如霜》音乐背景没有混入合成,估计是音乐版权的问题。于是自己录了一段歌曲片段,用手机视频编辑软件合成,最终效果如下:

AI模型生成的视频

小结

生成视频会消耗不少 tokens。注册时如果用的是先用后付模式,体验之后发现帐户欠费了——这一点需要特别留意费用说明和消耗情况,根据自己的需求来就好。

相关API文档链接:

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

本文面向CAD零基础学习者,系统讲解坐标输入、图层管理与基础绘图命令的核心用法。通过分步实操与常见问题排查,帮助新手建立精确绘图习惯,掌握规范出图的基础能力。

时间:2026-09-01 16:53
CAD从入门到项目交付:绘图、标注、图块与实战工作流

CAD从入门到项目交付:绘图、标注、图块与实战工作流

掌握CAD的核心在于建立“画得准、标得清、复用快、交付稳”的工作流。本文提供从环境设置、高频命令组合、标注规范、图块标准化到项目分阶段交付的完整路径,帮助初学者避免常见返工陷阱,独立完成可检查、可复用、可打印的工程图纸。

时间:2026-09-01 16:52
Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

本文详细解析 Claude Code 登录前的账号类型区分方法,涵盖个人订阅、Teams 席位与企业 Enterprise 席位的授权路径差异。提供终端登录命令、环境变量排查及常见异常处理步骤,帮助用户快速完成正确授权并避免登录路径混淆。

时间:2026-09-01 14:27
Claude Code 文件修改前的权限模式配置与命令审批指南

Claude Code 文件修改前的权限模式配置与命令审批指南

本文详细介绍Claude Code在修改文件前的权限模式配置方法,包括defaultMode可选值、permissions allow与deny规则设置、多层级配置文件管理以及 status验证技巧,帮助开发者安全高效地使用AI编程助手。

时间:2026-09-01 14:12
Claude Code接入VS Code后先测扩展和终端命令

Claude Code接入VS Code后先测扩展和终端命令

在VS Code中接入Claude Code后,建议优先验证扩展面板与集成终端两条入口。本文提供标准检查顺序、关键命令与常见故障排查路径,帮助你快速确认环境就绪,避免后续开发受阻。

时间:2026-09-01 14:10
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全