资讯动态

Spring-ai-alibaba视频生成

发布时间:2026/8/4 5:16:39 来源:尧图企业网站定制
文章目录Spring AI Alibaba 视频模型实战文生视频 / 图生视频版本一、依赖引入二、yml 配置三、代码案例文生视频四、代码案例多图参考合成五、代码案例本地图片 → 图生视频六、临时 URL 立刻落盘Spring AI Alibaba 视频模型实战文生视频 / 图生视频用 Spring AI Alibaba 的DashScopeVideoModel完成文生视频、多图参考合成、本地图生视频。对应模块spring-video-demo。版本Spring Boot3.4.5spring-ai-alibaba-starter-dashscope1.1.2.1Java17Spring-ai更新速度快,请以官方为准可参考网址:Spring-ai官网Spring-ai阿里巴巴阿里百炼模型广场开发者指南(API/SDK)一、依赖引入dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.alibaba.cloud.ai/groupIdartifactIdspring-ai-alibaba-starter-dashscope/artifactIdversion1.1.2.1/version/dependencydependencygroupIdcom.alibaba/groupIdartifactIddashscope-sdk-java/artifactIdversion2.22.18/version/dependency二、yml 配置spring:application:name:spring-video-demoai:dashscope:api-key:${DASHSCOPE_API_KEY}video:options:# 默认文生视频接口里可覆盖为 wanx2.1-vace-plus / wanx2.1-i2v-turbo 等model:wan2.6-t2v三、代码案例文生视频RestControllerRequestMapping(/ai/video)publicclassText2Video{privatefinalDashScopeVideoModelvideoModel;publicText2Video(DashScopeVideoModelvideoModel){this.videoModelvideoModel;}/** * GET /ai/video/text2video?prompt... * call() 内部会提交异步任务并轮询直到成功或失败。 */GetMapping(/text2video)publicStringtext2Video(RequestParam(defaultValue一只猫在草地上奔跑)Stringprompt){// 1组装模型、输入、输出参数DashScopeVideoOptionsoptionsDashScopeVideoOptions.builder().model(DashScopeModel.VideoModel.WAN26_T2V.getName())// wan2.6-t2v.input(DashScopeVideoOptions.InputOptions.builder().prompt(prompt)// 正向提示词可写分镜.negativePrompt()// 反向提示词不想出现的内容.build()).parameters(DashScopeVideoOptions.ParametersOptions.builder().size(1280*720)// 分辨率 宽*高.shotType(multi)// 多镜头.duration(10)// 时长秒.promptExtend(true)// 提示词智能扩写.seed(12345L)// 随机种子便于复现.build()).build();// 2Prompt 正文 OptionsVideoPromptvideoPromptVideoPrompt.builder().content(prompt).options(options).build();// 3同步等待生成完成VideoResponseresponsevideoModel.call(videoPrompt);DashScopeVideoResponse.VideoOutputoutputresponse.getResult().getOutput();if(outputnull){return生成失败: 无 output;}if(output.videoUrl()!null!output.videoUrl().isBlank()){// 立刻下载到本地 video/避免 OSS 签名 URL 过期后 AccessDeniedreturnVideoFileHelper.successMessage(output.videoUrl(),output.taskId(),output.taskStatus());}return生成未完成或失败: statusoutput.taskStatus(), taskIdoutput.taskId();}}四、代码案例多图参考合成RestControllerRequestMapping(/ai/video)publicclassVideoSynthesis{privatefinalDashScopeVideoModelvideoModel;// 官方示例参考图公网可访问privatestaticfinalListStringDEFAULT_REF_IMAGESList.of(http://wanx.alicdn.com/material/20250318/image_reference_2_5_16.png,http://wanx.alicdn.com/material/20250318/image_reference_1_5_16.png);publicVideoSynthesis(DashScopeVideoModelvideoModel){this.videoModelvideoModel;}/** * GET /ai/video/synthesis?prompt... * 功能image_reference多图参考 → 视频 */GetMapping(/synthesis)publicStringsynthesis(RequestParam(defaultValue女孩从雾气森林中走出)Stringprompt){DashScopeVideoOptionsoptionsDashScopeVideoOptions.builder().model(DashScopeModel.VideoModel.WANX21_VACE_PLUS.getName())// wanx2.1-vace-plus.input(DashScopeVideoOptions.InputOptions.builder().function(image_reference)// 功能类型多图参考.prompt(prompt).refImagesUrl(DEFAULT_REF_IMAGES)// 参考图 URL 列表.build()).parameters(DashScopeVideoOptions.ParametersOptions.builder().promptExtend(true)// 与参考图顺序对应第一张主体第二张背景.objOrBg(List.of(obj,bg)).size(1280*720).build()).build();VideoPromptvideoPromptVideoPrompt.builder().content(prompt).options(options).build();VideoResponseresponsevideoModel.call(videoPrompt);DashScopeVideoResponse.VideoOutputoutputresponse.getResult().getOutput();if(output!nulloutput.videoUrl()!null!output.videoUrl().isBlank()){returnVideoFileHelper.successMessage(output.videoUrl(),output.taskId(),output.taskStatus());}return生成失败或未完成;}}五、代码案例本地图片 → 图生视频云端读不到你电脑上的路径所以把MultipartFile转成 Base64 data URI。/** * POST /ai/video/image2video * form-datafile本地图片prompt可选运动描述 */PostMapping(/image2video)publicStringimage2Video(RequestParam(file)MultipartFilefile,RequestParam(defaultValue图片中的主体轻轻走动镜头缓慢推进)Stringprompt)throwsIOException{if(filenull||file.isEmpty()){return请上传图片表单字段名: file;}// MultipartFile → data:image/png;base64,xxxxStringimgUrltoImageDataUri(file);DashScopeVideoOptionsoptionsDashScopeVideoOptions.builder().model(DashScopeModel.VideoModel.WANX21_I2V_TURBO.getName())// wanx2.1-i2v-turbo.input(DashScopeVideoOptions.InputOptions.builder().prompt(prompt).imgUrl(imgUrl)// 首帧公网 URL 或 data URI.build()).parameters(DashScopeVideoOptions.ParametersOptions.builder().size(1280*720).promptExtend(true).duration(5).build()).build();VideoResponseresponsevideoModel.call(VideoPrompt.builder().content(prompt).options(options).build());DashScopeVideoResponse.VideoOutputoutputresponse.getResult().getOutput();if(output!nulloutput.videoUrl()!null!output.videoUrl().isBlank()){returnVideoFileHelper.successMessage(output.videoUrl(),output.taskId(),output.taskStatus());}return生成失败或未完成;}/** 上传图片 → data:{mime};base64,{data} */privatestaticStringtoImageDataUri(MultipartFilefile)throwsIOException{Stringmimefile.getContentType();if(mimenull||!mime.startsWith(image/)){mimeimage/png;}Stringbase64Base64.getEncoder().encodeToString(file.getBytes());returndata:mime;base64,base64;}六、临时 URL 立刻落盘返回的 OSS 地址带Expires/Signature过期或截断后会出现AccessDenied。生成成功后立刻下载publicfinalclassVideoFileHelper{/** 运行目录下的 video/ */publicstaticfinalPathVIDEO_DIRPaths.get(video);/** 从签名 URL 下载 mp4成功返回本地绝对路径 */publicstaticStringdownload(StringvideoUrl,StringtaskId){try{Files.createDirectories(VIDEO_DIR);PathpathVIDEO_DIR.resolve(video-taskId.mp4);try(InputStreaminURI.create(videoUrl).toURL().openStream()){Files.copy(in,path,StandardCopyOption.REPLACE_EXISTING);}returnpath.toAbsolutePath().toString();}catch(Exceptione){e.printStackTrace();returnnull;}}publicstaticStringsuccessMessage(StringvideoUrl,StringtaskId,Stringstatus){Stringlocaldownload(videoUrl,taskId);return视频 URL: videoUrl\ntaskId: taskId\nstatus: status(local!null?\n本地文件: local:\n本地下载失败);}}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价