通用场景

更新时间:2025-04-24 05:12:06

本文旨在介绍在智能图文匹配成片-通用场景下的合成参数、进阶配置、SDK调用示例。

重要
  • 脚本化自动成片与智能图文匹配成片共用同一个提交任务API。有关如何通过参数区分这两者,请参见参数区别说明

  • 注意:在此接口中,所有媒资的OSS URL中的区域(region)必须与调用OpenAPI服务地址中的区域(region)保持一致。

  • 支持的区域:华东2(上海)、华北2(北京)、华东1(杭州)、华南1(深圳)、美国(西部)、新加坡。

  • 在实际使用过程中,请将文档所有参数示例中的 [your-bucket]、[your-region-id]、[your-file-name]、[your-file-path]、媒资ID(例如:“****9d46c8b4548681030f6e****”)等参数替换为您的实际值。

说明
  • 为了更好地阅读本文,建议您在阅读本文之前先通过智能一键成片操作指南了解【智能图文匹配成片-通用场景】相关的概念与使用流程。

  • 智能图文匹配-通用场景包含两种成片模式。本文将针对以下几种“模式”进行详细阐述:

    • 全局口播模式

    • 分镜脚本模式

使用说明

InputConfig 参数说明

用户可通过配置InputConfig,指定视频素材、口播、背景音乐、贴纸等基础素材的参数配置。

参数

类型

说明

示例值

是否必填

支持模式

MediaArray

List<String>

通过上传媒资指定剪辑素材。支持传入媒资ID或素材OSS URL列表,视频总时长最多两小时。

["****b4549d46c88681030f6e****","****549d46c88b4681030f6e****"]

MediaArrayMediaSearchInput二选一必填

全部支持

MediaSearchInput

MediaSearchInput

通过指定检索库和主题描述文本智能搜索匹配的剪辑素材。

{"LibSearchCondition":{"SearchLibs":["ims-default-search-lib","test-20"],"SearchText":"阿里云小助手正在学习如何直播带货"}}

全部支持

TitleArray

List<String>

标题数组,每次合成随机选一个

最多50个,每个标题不超过50

["标题1","标题2"]

全部支持

SubHeadingArray

List<SubHeading>

副标题设置

[{"Level":1,"TitleArray":["一级副标题1","一级副标题2"]},{"Level":3,"TitleArray":["三级副标题"]}]

全部支持

SpeechTextArray

List<String>

  • 口播文案数组,每次合成随机选一个。

  • 最多50个,每条口播文案最长1000个字符。

  • 支持通过SSML标记语言控制语音合成

    重要

    当前仅支持<break> <s> <phoneme>

["口播内容1","口播内容2"]

  • 全局口播模式

SceneInfo

SceneInfo

场景信息,用于场景相关的参数.

详见参数示例:全局口播模式参数示例:分镜脚本模式

  • 分镜脚本模式

StickerArray

List<Sticker>

  • 贴纸数组,每次合成随机选一个。最多50个,支持媒资ID 或 OSS URL。

  • 随机规则:假设传入10个贴纸,成片数量设置为20。首先,随机生成一个110之间的数字,例如3,然后按照3、4、5、6、7、8、9、10、1、2、3、4、5、6、7...的顺序选择贴纸。

[{"MediaId":"****9d46c8b4548681030f6e****","X":10,"Y":100,"Width":300,"Height":300,"Opacity":0.6}]

全部支持

BackgroundMusicArray

List<String>

  • 背景音乐数组,每次合成随机选一个。最多50个,支持媒资ID 或 OSS URL。

  • 随机规则:假设传入10个背景音乐,成片数量设置为20。首先,随机生成一个110之间的数字,例如3,然后按照3、4、5、6、7、8、9、10、1、2、3、4、5、6、7...的顺序选择背景音乐。

["****b4549d46c88681030f6e****","****549d46c88b4681030f6e****"]

全部支持

BackgroundImageArray

List<String>

  • 背景图片数组,每次合成随机选择一个。最多50个,支持媒资ID 或 OSS URL。

  • 随机规则:假设传入10张背景图,成片数量设置为20。首先,随机生成一个110之间的数字,例如3,然后按照3、4、5、6、7、8、9、10、1、2、3、4、5、6、7...的顺序选择背景图。

["****b4549d46c88681030f6e****","****549d46c88b4681030f6e****"]

全部支持

MediaSearchInput 参数说明

参数

类型

说明

是否必填

LibSearchCondition

LibSearchCondition

检索库搜索条件设置

必填

LibSearchCondition 参数说明

参数

类型

说明

示例值

是否必填

SearchLibs

List<String>

检索库列表

["ims-default-search-lib"]

SearchText

String

主题描述文本,用于描述目标匹配素材的主题内容,文本内容最长20个字符。

海洋、珊瑚礁、海豹、海豚、海洋环境

SceneInfo 参数说明

参数

类型

说明

是否必填

Scene

String

匹配场景类型,通用场景下固定传值“General”即可。

ShotInfo

ShotInfo

设置分镜脚本。

说明

此参数只适用于分镜脚本模式,如果是全局口播模式无需设置此参数。

ShotInfo 参数说明

说明

此参数只适用于分镜脚本模式,如果是全局口播模式无需设置此参数。

参数

类型

说明

是否必填

ShotScripts

List<ShotScript>

分镜脚本数组

ShotScript 参数说明

说明

此参数只适用于分镜脚本模式,如果是全局口播模式无需设置此参数。

参数

类型

说明

示例值

是否必填

ScriptText

String

单个分镜中的脚本文案,用于描述分镜的内容

他最近在研制一种新的魔法药剂。

SpeechText

String

  • 单个分镜中的口播文案,长度不超过100个字符

  • 支持通过SSML标记语言控制语音合成

    重要

    当前仅支持<break> <s> <phoneme>

老魔法师丹尼在倒腾着奇怪的仪器,他最近在研制一种新的魔法药剂。

Duration

Float

分镜的时长,仅在没有口播时生效,如果存在口播,分镜时长自动按口播时长计算。

5

Volume

Float

  • 输入视频的音量。如果在此处设置了音量(Volume),则当前分镜内的视频音量将与此处的音量对齐。而EditingConfig.MediaConfig.Volume将不再对此分组生效。

  • 取值:[0, 10.0],支持两位小数。

0.5

参数示例:全局口播模式

{
  // MediaArray和MediaSearchInput二选一
  "MediaArray": [
    "****9d46c886b45481030f6e****",
    "****c886810b4549d4630f6e****",
    "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test1.mp4",
    "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test2.png"
  ],
  // MediaArray和MediaSearchInput二选一
  "MediaSearchInput": {
        "LibSearchCondition": {
            "SearchLibs": [
                "ims-default-search-lib",
                "test-20"
            ],
            "SearchText": "阿里云小助手正在学习如何直播带货"
      }
  },
  "TitleArray": [
    "回龙观盒马鲜生开业啦",
    "盒马鲜生开业啦"
  ],
  "SubHeadingArray": [
    {
      "Level": 1,
      "TitleArray": ["副标题1", "副标题2"]
    },
    {
      "Level": 3,
      "TitleArray": ["三级副标题"]
    }
  ],
  "SpeechTextArray": [
    "附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
    "附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹",
    "<speak>战火<phoneme alphabet=\"py\" ph=\"zheng4 hao3\">正酣</phoneme>。今天,我们的主角,乒坛传奇马龙,正向着荣耀的巅峰发起冲击。1/4决赛中面对实力强劲的户上隼辅,马龙毫不畏惧,每一个回合都全力以赴。他精准的球路和冷静的判断,让他在这场比赛中占据了上风。最终,马龙成功战胜对手,晋级四强。</speak>"
  ],
  "Sticker": {
    "MediaId": "****b681034549d46c880f6e****",
    "X": 10,
    "Y": 100,
    "Width": 300,
    "Height": 300,
    "Opacity": 0.6
  },
  "StickerArray": [
    {
      "MediaId": "****9d46c8b4548681030f6e****",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300,
      "Opacity": 0.6
    },
    {
      "MediaURL": "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test3.png",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    }
  ],
  "BackgroundMusicArray": [
    "****b4549d46c88681030f6e****",
    "****549d46c88b4681030f6e****",
    "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test4.mp3"
  ],
  "BackgroundImageArray": [
    "****6c886b4549d481030f6e****",
    "****9d46c8548b4681030f6e****",
    "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test1.png"
  ]
}

参数示例:分镜脚本模式

{
  // MediaArray和MediaSearchInput二选一
  "MediaArray": ["****9d46c886b45481030f6e****", "****c886810b4549d4630f6e****"],
  // MediaArray和MediaSearchInput二选一
  "MediaSearchInput": {
        "LibSearchCondition": {
            "SearchLibs": [
                "ims-default-search-lib",
                "test-20"
            ],
            "SearchText": "阿里云小助手正在学习如何直播带货"
      }
  },
  "SceneInfo": {
    "Scene": "General", // General 通用匹配 
    "ShotInfo": {
      "ShotScripts": [
        {
          "ScriptText": "这里是第一场分镜的脚本文案",
          "SpeechText": "这是第一场分镜的口播文案,改分镜的时长与口播时长一致"
        },
        {
          "ScriptText": "这里是第二场分镜的脚本文案,无口播文案时支持设置Duration控制分镜时长",
          "Duration": 5.0, // 无口播文案时支持设置
          "Volume": 1.0 // 设置分镜中视频素材的音量
        },
        {
          "ScriptText": "这里是第三场分镜的脚本文案",
          "SpeechText": "<speak>口播文案支持ssml。战火<phoneme alphabet=\"py\" ph=\"zheng4 hao3\">正酣</phoneme>。今天,我们的主角,乒坛传奇马龙,正向着荣耀的巅峰发起冲击。<s>1/4决赛中面对实力强劲的户上隼辅,马龙毫不畏惧,每一个回合都全力以赴</s>他精准的球路和冷静的判断,让他在这场比赛中占据了上风。最终,马龙成功战胜对手,晋级四强<break time=\"1000ms\"/></speak>"
        }
      ]
    }
  },
   "TitleArray": [
    "回龙观盒马鲜生开业啦",
    "盒马鲜生开业啦"
  ],
  "SubHeadingArray": [
    {
      "Level": 1,
      "TitleArray": ["副标题1", "副标题2"]
    },
    {
      "Level": 3,
      "TitleArray": ["三级副标题"]
    }
  ],
  "StickerArray": [
    {
      "MediaId": "****9d46c8b4548681030f6e****",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    },
    {
      "MediaURL": "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test3.png",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    }
  ],
  "BackgroundMusicArray": [
    "****b4549d46c88681030f6e****",
    "****549d46c88b4681030f6e****",
    "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test4.mp3"
  ],
  "BackgroundImageArray": [
    "****6c886b4549d481030f6e****",
    "****9d46c8548b4681030f6e****",
    "http://[your-bucket].oss-[your-region-id].aliyuncs.com/test1.png"
  ]
}

EditingConfig 参数说明

用户可通过配置EditingConfig,指定成片素材的标题字体、音量、位置及其他合成参数。如无特殊需求,建议客户使用默认配置,该字段可置空。

说明

通用场景下的“全局口播模式”和“分镜脚本模式”参数说明皆相同。

参数

类型

说明

示例值

是否必填

MediaConfig

JSON

输入视频素材相关配置。

详见参数示例

TitleConfig

JSON

标题相关配置。支持配置字幕参数。

详见参数示例

SubHeadingConfig

JSON

多级副标题相关配置。支持设置字幕参数。

JSON字段说明:

详见参数示例

SpeechConfig

JSON

口播文案相关配置。

详见参数示例

BackgroundMusicConfig

JSON

背景音乐相关配置。

{"Volume":0.2}

BackgroundImageConfig

JSON

背景图相关配置。如果InputConfig中已配置背景图,则此字段不生效。

{"SubType":"Blur","Radius":0.5}

ProcessConfig

JSON

混剪处理配置。

详见参数示例

FECanvas

JSON

用于前端页面预览时的画布配置。

{"Width": 1080,"Height": 1920}

ProduceConfig

JSON

普通剪辑合成配置,字段详见:EditingProduceConfig

{"AutoRegisterInputVodMedia":true,"OutputWebmTransparentChannel":true,"CoverConfig":{"StartTime":3.3},"AudioChannelCopy":"left","PipelineId":"***d54a97cff4108b555b01166d4b***","MaxBitrate":5000,"KeepOriginMaxBitrate":false,"KeepOriginVideoMaxFps":false}

ProcessConfig 参数说明

参数

类型

说明

示例值

是否必填

SingleShotDuration

Float

长视频素材进行剪辑时会自动拆条,拆条后单镜头的时长,单位秒。

5

否,默认3

EnableClipSplit

Boolean

表示是否进行AI拆条(按照视频画面切换,自动拆分长素材)。如果为true,SingleShotDuration参数则失效。

false

否,默认false

AllowVfxEffect

Boolean

  • 是否允许添加特效效果,特效示例详见:特效效果示例

  • 成片中第一个视频片段的特效随机选择范围:"slightshow", "starfieldshinee", "starfieldshinee2", "starsparkle", "colorfulripples", "starfield"

  • 其余视频片段的特效随机选择范围:"zoomslight", "zoom", "zoominout", "slightshake"

true

否,默认false

VfxEffectProbability

Float

特效应用在每个视频片段上的概率,取值:0.0 - 1.0,支持2位小数。

0.6

否,默认0.5

AllowTransition

Boolean

是否允许添加转场效果。

true

否,默认false

TransitionDuration

Float

转场时长,单位秒。如果转场时长 > 片段时长 - 1,则该片段上的转场效果不会生效。

0.5

否,默认0.5

TransitionList

List<String>

自定义转场效果列表,当AllowTransition=true时,随机选取列表中的一个转场效果进行合成。转场效果的可选范围详见转场效果库。如果此参数为空,则会从以下转场效果中随机选取:"linearblur", "colordistance", "crosshatch", "dreamyzoom", "doomscreentransition_up"

["directional", "linearblur"]

UseUniformTransition

Boolean

单个成片中是否使用一致的转场效果。

true

否,默认true

AllowFilter

Boolean

是否允许添加自定义滤镜

false

否,默认false

FilterList

List<String>

自定义滤镜效果列表,当AllowFilter=true时,随机选取列表中的一个滤镜进行合成,滤镜效果的可选范围滤镜效果示例,如果此参数为空,则不会添加滤镜效果。

["m1", "m2"]

AllowDuplicateMatch

Boolean

表示匹配过的片段是否允许重复使用。

false

否,默认false

ImageDuration

Float

图片素材的持续时长,单位秒。

2

否,默认2

EditingConfig参数示例

EditingConfig 中的所有参数均为非必填项,以下是默认配置。

{
  "MediaConfig": {
    "Volume": 0 // 默认视频素材静音
  },
  "TitleConfig": {
    "Alignment": "TopCenter",
    "AdaptMode": "AutoWrap",
    "Font": "Alibaba PuHuiTi 2.0 95 ExtraBold",
    "SizeRequestType": "Nominal",
    "Y": 0.1, // 成片为竖屏时,标题Y坐标值
    "Y": 0.05, // 成片为横屏时,标题Y坐标值
    "Y": 0.08 // 成片为方屏时,标题Y坐标值
  },
  "SpeechConfig": {
    "Volume": 1,  // 口播音频默认用原始音量
    "SpeechRate": 0,
    "Voice": null,
    "Style": null,
    "CustomizedVoice": null, // 人声克隆voiceId,若填写了此字段,Voice和Style将失效。
    "AsrConfig": {
      "Alignment": "TopCenter",
      "AdaptMode": "AutoWrap",
      "Font": "Alibaba PuHuiTi 2.0 65 Medium",
      "SizeRequestType": "Nominal",
      "Spacing": -1,
      "Y": 0.8, // 成片为竖屏时,字幕Y坐标值
      "Y": 0.9, // 成片为横屏时,字幕Y坐标值
      "Y": 0.85 // 成片为方屏时,字幕Y坐标值
    }
  },
  "SubHeadingConfig": {
    "1": {
      "Y": 0.3,
      "FontSize": 40
    },
    "3": {
      "Y": 0.5,
      "FontSize": 30
    }
  },
  "BackgroundMusicConfig": {
    "Volume": 0.2,   // 背景音乐默认用20%音量,
    "Style": null
  },
  "ProcessConfig": {
    "SingleShotDuration": 3,      // 拆条后的镜头时长,SingleShotDuration和EnableClipSplit二选一
    "EnableClipSplit": false      // 是否进行AI拆条,如果为true,SingleShotDuration参数则失效
    "AllowVfxEffect": false,	  // 是否添加特效效果
    "AllowTransition": false,	  // 是否添加转场效果
    "AllowDuplicateMatch": false, // 图文匹配模式下,匹配过的片段是否允许重复使用
  }
}

TemplateConfig 参数说明

TemplateConfig为一键成片的公共参数,用于设置一键成片模板。详细参数说明和使用示例详见TemplateConfig 参数说明

OutputConfig 参数说明

说明
  • 用户可通过配置OutputConfig,指定成片输出地址、名称规则、成片的宽高、输出成片数量等合成参数配置。

  • 通用场景下的“全局口播模式”和“分镜脚本模式”参数说明皆相同。

参数

类型

说明

示例值

是否必填

MediaURL

String

输出视频地址,必须要有占位符 {index}.

规则:http://[your-bucket].oss-[your-region-id].aliyuncs.com/[your-file-path]/[your-file-name]_{index}.mp4

示例:http://example.oss-cn-shanghai.aliyuncs.com/example/example_{index}.mp4

GeneratePreviewOnly=true时,且成片输出到OSS时必填

StorageLocation

String

指定输出到VOD的媒资文件存储地址。

规则:[your-vod-bucket].oss-[your-region-id].aliyuncs.com

示例:outin-****6c886b4549d481030f6e****.oss-cn-shanghai.aliyuncs.com

GeneratePreviewOnly=true时,且成片输出到VOD时必填

FileName

String

输出文件名称,必须要有占位符 {index}。

规则:[your-file-name]__{index}.mp4

示例:example_{index}.mp4

GeneratePreviewOnly=true时,且成片输出到VOD时必填

GeneratePreviewOnly

Boolean

  • GeneratePreviewOnly = true时,表示当前任务仅生成预览用的时间线,不实际合成,可不填写输出视频的地址。

  • 一键成片任务完成后,通过GetBatchMediaPoducingJob查询任务结果,返回的子任务列表中会包含剪辑工程projectId,再调用GetEditingProject可获取到预览时间线。

false

否,默认false

Count

Integer

输出视频数

  • 全局口播模式:上限为100。

  • 分镜脚本模式:上限为100。

10

否,默认1

MaxDuration

Float

输出视频单片时长上限。

如果有确定「口播文本」参数,以口播文本tts时长为准,当前参数无效;

如果无「口播文本」,以当前设置单片时长为最大时长,默认15s。

20

否,默认15

FixedDuration

Float

输出视频单片的固定时长。如果设置了固定时长,视频时长将会对齐此参数。

注意:

  • 分镜脚本模式不支持设置该参数;

  • 全局口播模式下,在SpeechTextArray为空的情况下可支持设置此参数;

  • FixedDurationMaxDuration只能二选一;

20

否,默认15

Width

Integer

成片宽,px

1080

Height

Integer

成片高,px

1920

Video

JSONObject

输出视频流相关配置,Crf、Codec

{"Crf": 27}

参数示例

{
 	"MediaURL": "http://[your-bucket].oss-[your-region-id].aliyuncs.com/[your-file-path]/[your-file-name]_{index}.mp4",
 	"Count": 1,
 	"MaxDuration": 15,
 	"Width": 1080,
 	"Height": 1920,
 	"Video": {"Crf": 27},
        "GeneratePreviewOnly":false
}

SDK调用示例

前提条件

您已安装IMS服务端SDK,详情请参见准备工作

代码示例

以全局口播模式为例

展开查看代码示例

展开查看代码示例
package com.example;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;

import java.util.*;

/**
 *  需要maven引入二方包依赖:
 *   <dependency>
 *      <groupId>com.aliyun</groupId>
 *      <artifactId>ice20201109</artifactId>
 *      <version>2.3.0</version>
 *  </dependency>
 *  <dependency>
 *      <groupId>com.alibaba</groupId>
 *      <artifactId>fastjson</artifactId>
 *      <version>1.2.9</version>
 *  </dependency>
 */

public class SmartMixBatchEditingService {

    static final String regionId = "[your-bucket]"; // 智能图文匹配支持cn-shanghai,cn-beijing,cn-hangzhou
    static final String bucket = "[your-region-id]";
    private Client iceClient;

    public static void main(String[] args) throws Exception {
        SmartMixBatchEditingService smartMixBatchEditingService = new SmartMixBatchEditingService();
        smartMixBatchEditingService.initClient();
        smartMixBatchEditingService.runExample();
    }

    public void initClient() throws Exception {
        // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
        // 本示例以将AccessKey ID和 AccessKey Secret保存在环境变量为例说明。配置方法请参见:https://help.aliyun.com/zh/sdk/developer-reference/v2-manage-access-credentials?spm=a2c4g.11186623.0.0.423350fbOTFdOB#2a38e5c14b4em
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        Config config = new Config();
        config.setCredential(credentialClient);

        // 如需硬编码AccessKey ID和AccessKey Secret,代码如下,但强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
        // config.accessKeyId = <第二步创建的AccessKey ID>;
        // config.accessKeySecret = <第二步创建的AccessKey Secret>;
        config.endpoint = "ice." + regionId + ".aliyuncs.com";
        config.regionId = regionId;
        iceClient = new Client(config);
    }

    public void runExample() throws Exception {

        // 视频素材
        List<String> mediaArray = Arrays.asList(
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-1.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-2.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-3.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-4.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-5.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-6.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-7.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-8.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-9.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-10.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-11.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-12.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-13.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-14.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-15.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-16.mp4"
        );

        // 口播文案
        String speechText = "在那广袤无垠的蔚蓝深处,一幅生机勃勃的画卷正徐徐展开。清澈碧蓝的海水中,珊瑚礁犹如海底森林,五彩斑斓,它们是海洋生物多样性的重要基石,为无数的小鱼、贝类和海藻提供庇护所。慵懒而可爱的海狮们,在岩石上享受着温暖阳光的沐浴,惬意地晒着太阳,与大自然和谐共生。海豚在蔚蓝的海水中结伴畅游,彼此追逐嬉戏,展现着大自然赋予的灵动与智慧。然而美丽的海洋环境正面临着前所未有的挑战。各种垃圾污染如同伤疤一般烙印在海洋的肌肤之上,无情地侵蚀着原本纯净的生态环境。众多物种面临食物短缺、疾病增多乃至种群减少的危机。我们必须行动起来,守护这份美丽而又脆弱的蓝色家园,让未来的海洋再次恢复它的纯净与活力。";

        // 视频标题
        String title = "守护蓝色家园";

        JSONObject inputConfig = new JSONObject();
        inputConfig.put("MediaArray", mediaArray);
        inputConfig.put("SpeechText", speechText);
        inputConfig.put("Title", title);

        // 生成的成片数
        int produceCount = 4;

        // 成片宽高,生成竖屏文件
        int outputWidth = 1080;
        int outputHeight = 1920;

        //// 成片宽高,生成横屏文件
        //int outputWidth = 1920;
        //int outputHeight = 1080;

        // 成片oss地址,需包含{index} 占位符
        String mediaUrl = "http://" + bucket + ".oss-" + regionId + ".aliyuncs.com/smart_mix/output_{index}.mp4";

        JSONObject outputConfig = new JSONObject();
        outputConfig.put("MediaURL", mediaUrl);
        outputConfig.put("Count", produceCount);
        outputConfig.put("Width", outputWidth);
        outputConfig.put("Height", outputHeight);

        // 提交一键成片任务
        SubmitBatchMediaProducingJobRequest request = new SubmitBatchMediaProducingJobRequest();
        request.setInputConfig(inputConfig.toJSONString());
        request.setOutputConfig(outputConfig.toJSONString());

        SubmitBatchMediaProducingJobResponse response = iceClient.submitBatchMediaProducingJob(request);
        String jobId = response.getBody().getJobId();
        System.out.println("Start smart mix batch job, batchJobId: " + jobId);

        // 轮询任务状态直到全部结束
        System.out.println("Waiting job finished...");
        int maxTry = 3000;
        int i = 0;
        while (i < maxTry) {
            Thread.sleep(3000);
            i++;
            GetBatchMediaProducingJobRequest getRequest = new GetBatchMediaProducingJobRequest();
            getRequest.setJobId(jobId);
            GetBatchMediaProducingJobResponse getResponse = iceClient.getBatchMediaProducingJob(getRequest);
            String status = getResponse.getBody().getEditingBatchJob().getStatus();
            System.out.println("BatchJobId: " + jobId + ", status:" + status);

            if ("Failed".equals(status)) {
                System.out.println("Batch job failed. JobInfo: " + JSONObject.toJSONString(getResponse.getBody().getEditingBatchJob()));
                throw new Exception("Produce failed. BatchJobId: " + jobId);
            }

            if ("Finished".equals(status)) {
                System.out.println("Batch job finished. JobInfo: " + JSONObject.toJSONString(getResponse.getBody().getEditingBatchJob()));
                break;
            }
        }
    }
}

package com.example;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;

import java.util.*;

/**
 *  需要maven引入二方包依赖:
 *   <dependency>
 *      <groupId>com.aliyun</groupId>
 *      <artifactId>ice20201109</artifactId>
 *      <version>2.3.0</version>
 *  </dependency>
 *  <dependency>
 *      <groupId>com.alibaba</groupId>
 *      <artifactId>fastjson</artifactId>
 *      <version>1.2.9</version>
 *  </dependency>
 */

public class SmartMixBatchEditingService {

    static final String regionId = "[your-region-id]"; // 智能图文匹配支持cn-shanghai,cn-beijing,cn-hangzhou
    static final String bucket = "[your-bucket]";
    private Client iceClient;

    public static void main(String[] args) throws Exception {
        SmartMixBatchEditingService smartMixBatchEditingService = new SmartMixBatchEditingService();
        smartMixBatchEditingService.initClient();
        smartMixBatchEditingService.runExample();
    }

    public void initClient() throws Exception {
        // 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
        // 本示例以将AccessKey ID和 AccessKey Secret保存在环境变量为例说明。配置方法请参见:https://www.alibabacloud.com/help/zh/sdk/developer-reference/v2-manage-access-credentials
        com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();

        Config config = new Config();
        config.setCredential(credentialClient);

        // 如需硬编码AccessKey ID和AccessKey Secret,代码如下,但强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
        // config.accessKeyId = <第二步创建的AccessKey ID>;
        // config.accessKeySecret = <第二步创建的AccessKey Secret>;
        config.endpoint = "ice." + regionId + ".aliyuncs.com";
        config.regionId = regionId;
        iceClient = new Client(config);
    }

    public void runExample() throws Exception {

        // 视频素材
        List<String> mediaArray = Arrays.asList(
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-1.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-2.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-3.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-4.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-5.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-6.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-7.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-8.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-9.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-10.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-11.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-12.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-13.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-14.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-15.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-16.mp4"
        );

        // 口播文案
        String speechText = "在那广袤无垠的蔚蓝深处,一幅生机勃勃的画卷正徐徐展开。清澈碧蓝的海水中,珊瑚礁犹如海底森林,五彩斑斓,它们是海洋生物多样性的重要基石,为无数的小鱼、贝类和海藻提供庇护所。慵懒而可爱的海狮们,在岩石上享受着温暖阳光的沐浴,惬意地晒着太阳,与大自然和谐共生。海豚在蔚蓝的海水中结伴畅游,彼此追逐嬉戏,展现着大自然赋予的灵动与智慧。然而美丽的海洋环境正面临着前所未有的挑战。各种垃圾污染如同伤疤一般烙印在海洋的肌肤之上,无情地侵蚀着原本纯净的生态环境。众多物种面临食物短缺、疾病增多乃至种群减少的危机。我们必须行动起来,守护这份美丽而又脆弱的蓝色家园,让未来的海洋再次恢复它的纯净与活力。";

        // 视频标题
        String title = "守护蓝色家园";

        JSONObject inputConfig = new JSONObject();
        inputConfig.put("MediaArray", mediaArray);
        inputConfig.put("SpeechText", speechText);
        inputConfig.put("Title", title);

        // 生成的成片数
        int produceCount = 4;

        // 成片宽高,生成竖屏文件
        int outputWidth = 1080;
        int outputHeight = 1920;

        //// 成片宽高,生成横屏文件
        //int outputWidth = 1920;
        //int outputHeight = 1080;

        // 成片oss地址,需包含{index} 占位符
        String mediaUrl = "http://" + bucket + ".oss-" + regionId + ".aliyuncs.com/smart_mix/output_{index}.mp4";

        JSONObject outputConfig = new JSONObject();
        outputConfig.put("MediaURL", mediaUrl);
        outputConfig.put("Count", produceCount);
        outputConfig.put("Width", outputWidth);
        outputConfig.put("Height", outputHeight);

        // 提交一键成片任务
        SubmitBatchMediaProducingJobRequest request = new SubmitBatchMediaProducingJobRequest();
        request.setInputConfig(inputConfig.toJSONString());
        request.setOutputConfig(outputConfig.toJSONString());

        SubmitBatchMediaProducingJobResponse response = iceClient.submitBatchMediaProducingJob(request);
        String jobId = response.getBody().getJobId();
        System.out.println("Start smart mix batch job, batchJobId: " + jobId);

        // 轮询任务状态直到全部结束
        System.out.println("Waiting job finished...");
        int maxTry = 3000;
        int i = 0;
        while (i < maxTry) {
            Thread.sleep(3000);
            i++;
            GetBatchMediaProducingJobRequest getRequest = new GetBatchMediaProducingJobRequest();
            getRequest.setJobId(jobId);
            GetBatchMediaProducingJobResponse getResponse = iceClient.getBatchMediaProducingJob(getRequest);
            String status = getResponse.getBody().getEditingBatchJob().getStatus();
            System.out.println("BatchJobId: " + jobId + ", status:" + status);

            if ("Failed".equals(status)) {
                System.out.println("Batch job failed. JobInfo: " + JSONObject.toJSONString(getResponse.getBody().getEditingBatchJob()));
                throw new Exception("Produce failed. BatchJobId: " + jobId);
            }

            if ("Finished".equals(status)) {
                System.out.println("Batch job finished. JobInfo: " + JSONObject.toJSONString(getResponse.getBody().getEditingBatchJob()));
                break;
            }
        }
    }
}

API调用入参详情

展开查看InputConfig

{
	"MediaArray": [
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-1.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-2.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-3.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-4.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-5.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-6.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-7.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-8.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-9.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-10.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-11.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-12.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-13.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-14.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-15.mp4",
		"http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/sea/sea-16.mp4"
	],
	"SpeechText": "在那广袤无垠的蔚蓝深处,一幅生机勃勃的画卷正徐徐展开。清澈碧蓝的海水中,珊瑚礁犹如海底森林,五彩斑斓,它们是海洋生物多样性的重要基石,为无数的小鱼、贝类和海藻提供庇护所。慵懒而可爱的海狮们,在岩石上享受着温暖阳光的沐浴,惬意地晒着太阳,与大自然和谐共生。海豚在蔚蓝的海水中结伴畅游,彼此追逐嬉戏,展现着大自然赋予的灵动与智慧。然而美丽的海洋环境正面临着前所未有的挑战。各种垃圾污染如同伤疤一般烙印在海洋的肌肤之上,无情地侵蚀着原本纯净的生态环境。众多物种面临食物短缺、疾病增多乃至种群减少的危机。我们必须行动起来,守护这份美丽而又脆弱的蓝色家园,让未来的海洋再次恢复它的纯净与活力。",
	"Title":"守护蓝色家园"
}

展开查看OutputConfig

{
  "Count": 4,
  "Height": 1080,
  "Width": 1920,
  "MediaURL": "http://[your-bucket].oss-[your-region-id].aliyuncs.com/[your-file-path]/[your-file-name]_{index}.mp4"
}

结果示例

竖屏

横屏

竖屏

横屏

混剪逻辑与进阶配置

处理逻辑

全局口播模式:

  • 如果视频素材通过“指定检索库+设定主题描述文本”方式进行选择,则可以通过“主题描述文本”作为检索条件,在指定检索库中智能搜索出相应的视频片段作为输入视频。

  • 如果输入视频为长视频片段,会先进行拆条,混剪时选取拆条后的视频片段进行拼接合成。拆条后单镜头的时长默认为3s,您也可以通过参数SingleShotDuration指定镜头时长。

  • 如果没有口播文案,则随机选取视频片段进行前后拼接,合成大约15s的成片。

  • 如果有口播文案,则进行图文智能匹配并对齐口播文案,批量合成多条成片。

分镜脚本模式:

  • 如果视频素材是通过“指定检索库+设定主题描述文本”方式进行指定,则应通过“主题描述文本”在指定检索库中进行智能搜索,以提取相应的视频片段作为输入视频。

  • 在分镜脚本模式下,无需设置SpeechTextArray/SpeechText,通过SceneInfo.ShotInfo.ShotScripts控制成片中的每一个分镜的内容、时长、口播等信息。

  • 在单个分镜中,优先通过脚本文案进行片段的智能截取和匹配,如未设置脚本文案,但设置了口播文案,则通过口播文案进行匹配。

  • 在单个分镜中,分镜的时长与口播时长或自定义时长进行对齐。

进阶配置

进阶配置详见批量一键成片混剪逻辑与进阶配置

相关文档

  • 本页导读 (1)
  • 使用说明
  • InputConfig 参数说明
  • MediaSearchInput 参数说明
  • LibSearchCondition 参数说明
  • SceneInfo 参数说明
  • ShotInfo 参数说明
  • ShotScript 参数说明
  • 参数示例:全局口播模式
  • 参数示例:分镜脚本模式
  • EditingConfig 参数说明
  • ProcessConfig 参数说明
  • EditingConfig参数示例
  • TemplateConfig 参数说明
  • OutputConfig 参数说明
  • 参数示例
  • SDK调用示例
  • 前提条件
  • 代码示例
  • 结果示例
  • 混剪逻辑与进阶配置
  • 处理逻辑
  • 进阶配置
  • 相关文档