脚本化自动成片

本文旨在介绍在脚本化自动成片场景下的合成参数、进阶配置、SDK调用示例。

说明
  • 为了更好地阅读本文,建议您在阅读之前先了解智能一键成片中与【脚本化自动成片】相关的内容。

  • 名词解释:

    • “全局口播”模式:可以通过多个完整的口播文案随机搭配脚本节点,从而实现批量视频混剪。

    • “分组口播”模式:可以通过将一个完整的口播文案拆分成多个段落,并分别与脚本的各个节点进行巧妙搭配,以实现更佳的效果。

  • 支持脚本化自动成片的区域:华东2(上海)、华北2(北京)、华东1(杭州)、华南1(深圳)。

使用说明

InputConfig 参数说明

说明

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

参数

类型

说明

是否必填

支持模式

MediaGroupArray

List<MediaGroup>

脚本化自动成片模式。输入为脚本化素材,支持设置分组名、素材列表

分组名:不超过50个字符,不支持emoji。

素材列表:媒资ID或素材OSS URL。

最多40个分组,每组最多200个素材。

  • 全局口播

  • 分组口播

TitleArray

List<String>

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

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

  • 全局口播

  • 分组口播

SubHeadingArray

List<SubHeading>

副标题设置

  • 全局口播

  • 分组口播

SpeechTextArray

List<String>

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

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

  • 全局口播

StickerArray

List<Sticker>

贴纸数组,每次合成随机选一个。

最多50个。

  • 全局口播

  • 分组口播

BackgroundMusicArray

List<String>

背景音乐数组,每次合成随机选一个。

最多50个,支持媒资ID 或 OSS URL。

  • 全局口播

  • 分组口播

BackgroundImageArray

List<String>

背景图片数组,每次合成随机选择一个。

最多50个,支持媒资ID 或 OSS URL。

  • 全局口播

  • 分组口播

MediaGroup 参数说明

说明

“全局口播模式”与“分组口播模式”的MediaGroup参数配置差异可根据表格列“支持模式”区分。

参数

类型

说明

是否必填

支持模式

GroupName

String

分组名

不超过50个字符,不支持emoji。

  • 全局口播

  • 分组口播

MediaArray

List<String>

素材列表,支持 mediaId 或 url。

最多40个分组,每组最多200个素材。

  • 全局口播

  • 分组口播

SpeechTextArray

List<String>

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

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

  • 分组口播

Duration

Float

当前分组截取视频的时长,默认5秒。仅限SpeechTextArray为空时填写

  • 分组口播

SubHeading 参数说明

说明

“全局口播模式”与“分组口播模式”的SubHeading参数配置说明相同。

参数

类型

说明

是否必填

Level

Integer

副标题级别。

枚举:

1:一级副标题

2:二级副标题

3:三级副标题

4:四级副标题

5:五级副标题

TitleArray

List<String>

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

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

Sticker 参数说明

说明

“全局口播模式”与“分组口播模式”的Sticker参数配置说明相同。

参数

类型

说明

是否必填

MediaId

String

贴纸、logo、水印等图片ID

二选一必填

都填写时优先取用MediaId

MediaURL

String

图片URL,仅支持自有OSS

X

Float

参考VideoTrackClip.X

Y

Float

参考VideoTrackClip.Y

Width

Float

参考VideoTrackClip.Width

Height

Float

参考VideoTrackClip.Height

DynamicFrames

Integer

动图的帧数

否,贴纸为动图时填写

全局口播模式-参数示例

{
  "MediaGroupArray": [
    {
      "GroupName": "UseMediaId",
      "MediaArray": [
        "****9d46c886b45481030f6e****",
        "****c886810b4549d4630f6e****"
      ]
    },
    {
      "GroupName": "UseOssUrl",
      "MediaArray": [
        "http://test-bucket.oss-cn-shanghai.aliyuncs.com/test1.mp4",
        "http://test-bucket.oss-cn-shanghai.aliyuncs.com/test2.png"
      ]
    }
  ],
  "TitleArray": [
    "回龙观盒马鲜生开业啦",
    "盒马鲜生开业啦"
  ],
  "SubHeadingArray": [
    {
      "Level": 1,
      "TitleArray": ["副标题1", "副标题2"]
    },
    {
      "Level": 3,
      "TitleArray": ["三级副标题"]
    }
  ],
  "SpeechTextArray": [
    "附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹,这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙,大家也快来看看呀",
    "附近的商场新开了一家盒马鲜生,今天是第一天开业,赶紧来凑热闹"
  ],
  "StickerArray": [
    {
      "MediaId": "****9d46c8b4548681030f6e****",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    },
    {
      "MediaURL": "http://test-bucket.oss-cn-shanghai.aliyuncs.com/test3.png",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    }
  ],
  "BackgroundMusicArray": [
    "****b4549d46c88681030f6e****",
    "****549d46c88b4681030f6e****",
    "http://test-bucket.oss-cn-shanghai.aliyuncs.com/test4.mp3"
  ],
  "BackgroundImageArray": [
    "****6c886b4549d481030f6e****",
    "****9d46c8548b4681030f6e****",
    "http://test-bucket.oss-cn-shanghai.aliyuncs.com/test1.png"
  ]
}

分组口播模式-参数示例

{
  "MediaGroupArray": [{
    "GroupName": "start",
    "MediaArray": ["https://ice-*****-test.oss-cn-*****.aliyuncs.com/0-test-batch-editing-materials/1.jpeg", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/0-test-batch-editing-materials/highway.mp4"],
    "Duration": 5
  },
    {
      "GroupName": "group1",
      "MediaArray": ["https://ice-*****-test.oss-cn-*****.aliyuncs.com/0-test-batch-editing-materials/160134%2B9859695-2032aa5c-2803-47cd-bf65-8a40d66598db.png", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/0-test-batch-editing-materials/cloud.mp4"],
      "SpeechTextArray": ["附近的商场新开了一家盒马鲜生,今天是第一天开业", "今天是这家盒马鲜生第一天开业"]
    },
    {
      "GroupName": "group2",
      "MediaArray": ["https://ice-*****-test.oss-cn-*****.aliyuncs.com/0-test-batch-editing-materials/normal%20video.mp4", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/0-test-batch-editing-materials/3.jpeg"],
      "SpeechTextArray": ["这家盒马面积不大,但商场里的人不少,零食、酒水都比较便宜,排队的人都排成了长龙", "现场特别热闹,人山人海,商品琳琅满目"]
    },
    {
      "GroupName": "group3",
      "MediaArray": ["https://ice-*****-test.oss-cn-*****.aliyuncs.com/0-test-batch-editing-materials/young_sunset_walk.mp4"],
      "SpeechTextArray": ["快来看看吧", "快点来看看吧"]
    },
    {
      "GroupName": "end",
      "MediaArray": ["https://ice-*****-test.oss-cn-*****.aliyuncs.com/0-test-batch-editing-materials/media_type_as_video.jpg", "https://ice-auto-test.oss-cn-shanghai.aliyuncs.com/0-test-batch-editing-materials/highway.mp4"],
      "Duration": 5
    }
  ],
  "TitleArray": [
    "回龙观盒马鲜生开业啦",
    "盒马鲜生开业啦"
  ],
  "StickerArray": [
    {
      "MediaId": "****9d46c8b4548681030f6e****",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    },
    "SubHeadingArray": [
    {
      "Level": 1,
      "TitleArray": ["副标题1", "副标题2"]
    },
    {
      "Level": 3,
      "TitleArray": ["三级副标题"]
    }
  ],
    {
      "MediaURL": "http://test-bucket.oss-cn-*****.aliyuncs.com/test3.png",
      "X": 10,
      "Y": 100,
      "Width": 300,
      "Height": 300
    }
  ],
  "BackgroundMusicArray": [
    "****b4549d46c88681030f6e****",
    "****549d46c88b4681030f6e****",
    "http://test-bucket.oss-cn-*****.aliyuncs.com/test4.mp3"
  ],
  "BackgroundImageArray": [
    "****6c886b4549d481030f6e****",
    "****9d46c8548b4681030f6e****",
    "http://test-bucket.oss-cn-*****.aliyuncs.com/test1.png"
  ]
}

EditingConfig 参数说明

用户可通过配置EditingConfig,指定成片素材的音量、位置及其他合成参数。

说明

除了以下参数外,其余参数皆支持“全局口播模式”和“分组口播模式”:

  • ProcessConfig.AlignmentMode仅在“全局口播模式”下生效;

参数

类型

说明

是否必填

MediaConfig

JSON

输入视频素材相关配置。

支持字段:

  • Volume: 输入视频的音量。取值:[0, 10.0],支持小数,例:0.5。

  • MediaMetaDataArray: 媒资meta信息列表。单个MediaMetaData包含以下字段

    • Media: 媒资ID 或 OSS URL,需和InputConfig 中传入的素材保持一致。

    • GroupName:此处填入媒资所属的分组。

    • TimeRangeList:入出点范围列表,每个素材支持指定多段入出点,从中选取片段合成。单个TimeRange字段如下:

      • In:素材入点

      • Out:素材出点

TitleConfig

JSON

标题相关配置。支持配置字幕参数,字段详见:横幅文字

SubHeadingConfig

JSON

JSON说明:

key:Level

value:横幅文字

示例如下:

{
    "1": {
      "Y": 0.3,
      "FontSize": 40
    },
    "3": {
      "Y": 0.5,
      "FontSize": 30
    }
  }

SpeechConfig

JSON

口播文案相关配置。

支持字段:

  • Volume:口播音频的音量。取值:[0, 10.0],支持小数,例:0.5。

  • AsrConfig:支持配置字幕参数,字段详见:横幅文字

  • Voice:指定单个或多个口播音色。当指定多个voice时,会随机选取一个合成。例:"zhimiao_emo,zhilun"。

  • SpeechRate:语速,取值范围:-500~500,默认值:0。

    • [-500, 0, 500] 对应的语速倍速区间为 [0.5, 1.0, 2.0]。

说明

计算方法如下:

  • 0.8倍速(1-1/0.8)/0.002 = -125

  • 1.2倍速(1-1/1.2)/0.001 = 166

小于1倍速时,使用0.002系数。

大于1倍速时,使用0.001系数。

实际算法结果取近似值。

  • Style:口播声音风格,默认为空。若同时指定Voice和Style,则优先取用Voice。取值:

    • "Gentle": 柔和

    • "Serious":严肃

    • "Entertainment":娱乐

  • CustomizedVoice:支持自定义的音色,填写人声克隆的VoiceId。若填写了此字段,Voice和Style将失效。

BackgroundMusicConfig

JSON

背景音乐相关配置。

支持字段:

  • Volume:背景音乐的音量。取值:[0, 10.0],支持小数,例:0.5。

  • Style:背景音乐风格,默认为空。若InputConfig中已配置背景音乐,此字段不生效。取值:

    • "bgm-beauty":时尚

    • "bgm-chinese-style":中国风

    • "bgm-cuisine":美食

    • "bgm-dynamic":动感

    • "bgm-quirky":怪诞

    • "bgm-relaxing":轻松

    • "bgm-romantic":浪漫

    • "bgm-upbeat":欢快

BackgroundImageConfig

JSON

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

支持字段:

  • SubType:背景类型。取值:

    • "Color":纯色背景

    • "Blur":背景模糊

  • Radius:模糊半径,当SubType=Blur时,此参数生效,取值范围[0.01, 1]

  • Color:背景颜色。SubType=Color时,此参数生效,16进制RGB颜色,例:#000000。

ProcessConfig

混剪处理配置。

支持字段:

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

  • AllowVfxEffect:是否允许添加特效效果,默认false。

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

  • AllowTransition:是否允许添加转场效果,默认false。

  • TransitionList:自定义转场效果列表,当AllowTransition=true时,随机选取列表中的一个转场效果进行合成。例:["directional", "linearblur"]

  • UseUniformTransition:单个成片中是否使用一致的转场效果,默认true。

  • AlignmentMode:表示视频和口播文案的对齐模式。仅在“全局口播模式”下生效。取值:

    • "AutoSpeed":视频轨道时长按照音频轨道缩放,默认。

    • "Cut":视频轨道时长按照音频轨道截断。

ProduceConfig

JSON

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

参数示例

{
  "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坐标值
  },
   "SubHeadingConfig": {
    "1": {
      "Y": 0.3,
      "FontSize": 40
    },
    "3": {
      "Y": 0.5,
      "FontSize": 30
    }
  },
  "SpeechConfig": {
    "Volume": 1,  // 口播音频默认用原始音量
    "SpeechRate": 0,
    "Voice": null,
    "Style": null,
    "CustomizedVoice": null  // 若填写了此字段,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坐标值
    }
  },
  "BackgroundMusicConfig": {
    "Volume": 0.2,   // 背景音乐默认用20%音量,
    "Style": null
  },
  "ProcessConfig": {
    "SingleShotDuration": 3,      // 拆条后的镜头时长
    "AllowVfxEffect": false,	  // 是否添加特效效果
    "AllowTransition": false,	  // 是否添加转场效果
    "AlignmentMode": "AutoSpeed"  // 仅支持全局口播模式下支持此字段
  }
}

OutputConfig 参数说明

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

说明

“全局口播模式”与“分组口播模式”的OutputConfig参数配置说明是相同的。

参数

类型

必填

说明

MediaURL

String

成片输出到OSS时必填

输出视频地址,必须要有占位符

如:http://xxx.oss-cn-shanghai.aliyuncs.com/xxx_{index}.mp4

StorageLocation

String

成片输出到VOD时必填

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

如:outin-xxxxxx.oss-cn-shanghai.aliyuncs.com

FileName

String

成片输出到VOD时必填

输出文件名称,必须要有占位符,

如:xxx_{index}.mp4

GeneratePreviewOnly

Boolean

否,默认false

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

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

Count

Integer

否,默认1

输出视频数,数量上限为100。

MaxDuration

Float

输出视频单片时长上限。

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

  • 分组口播模式无需设置该参数;

  • FixedDuration和MaxDuration只能二选一;

  • 时长规则详见处理逻辑

FixedDuration

Float

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

  • 分组口播模式不支持设置该参数;

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

  • FixedDuration和MaxDuration只能二选一;

  • 时长规则详见处理逻辑

Width

Integer

成片宽,px

Height

Integer

成片高,px

Video

JSONObject

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

参数示例

{
 	"MediaURL": "http://xxx.oss-cn-shanghai.aliyuncs.com/xxx_{index}.mp4",
 	"Count": 20,
 	"MaxDuration": 15,
 	"Width": 1080,
 	"Height": 1920,
 	"Video": {"Crf": 27},
        "GeneratePreviewOnly":false
}

SDK调用示例

前提条件

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

代码示例

以全局口播模式为例

展开查看代码示例

package com.example;

import java.util.*;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import com.aliyun.ice20201109.Client;
import com.aliyun.ice20201109.models.*;
import com.aliyun.teaopenapi.models.Config;


/**
 *  需要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 ScriptBatchEditingService {

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

    public static void main(String[] args) throws Exception {
        ScriptBatchEditingService scriptBatchEditingService = new ScriptBatchEditingService();
        scriptBatchEditingService.initClient();
        scriptBatchEditingService.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 {

        // 视频素材
        JSONObject mediaGroup1 = new JSONObject();
        mediaGroup1.put("GroupName", "start");
        mediaGroup1.put("MediaArray", Arrays.asList(
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-start-1.mp4"
        ));

        JSONObject mediaGroup2 = new JSONObject();
        mediaGroup2.put("GroupName", "middle");
        mediaGroup2.put("MediaArray", Arrays.asList(
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-m-1.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-m-2.mp4",
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-m-3.mp4"
        ));

        JSONObject mediaGroup3 = new JSONObject();
        mediaGroup3.put("GroupName", "end");
        mediaGroup3.put("MediaArray", Arrays.asList(
            "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-end-1.mp4"
        ));

        JSONArray mediaGroupArray = new JSONArray();
        mediaGroupArray.add(mediaGroup1);
        mediaGroupArray.add(mediaGroup2);
        mediaGroupArray.add(mediaGroup3);

        // 口播文案
        List<String> speechTextArray = Arrays.asList(
            "假期纠结去哪儿玩?云南泸沽湖邀您共赴一场与自然的约会。湛蓝湖水如镜,映照着摩梭女儿国的独特风情,如诗如画。泛舟湖心,感受猪槽船摇曳的岁月静好;仰望女神山,倾听古老神秘的故事传说。还在等什么,快来泸沽湖共享这一份静谧而迷人的湖光山色吧!",
            "假期规划还在犹豫不决?何不考虑赴一场云南泸沽湖的自然盛宴。那湛蓝如镜的湖面,映射出摩梭女儿国独特的民俗风情,如诗如画,引人入胜。您可在湖心悠然泛舟,体验猪槽船摇曳间的宁静岁月;也可抬头瞻仰神圣女神山,倾听那穿越千年的古老神秘传说。快来泸沽湖,共享这片静谧而迷人的湖光山色所带来的无尽诗意吧!"
        );

        // 视频标题
        List<String> titleArray = Arrays.asList(
            "泸沽湖:湖光山色中的摩梭风情",
            "探寻秘境泸沽湖",
            "沉浸式体验泸沽湖"
        );

        JSONObject inputConfig = new JSONObject();
        inputConfig.put("MediaGroupArray", mediaGroupArray);
        inputConfig.put("SpeechTextArray", speechTextArray);
        inputConfig.put("TitleArray", titleArray);

        // 生成的成片数
        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/script/output_{index}_w.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 script 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

{
  "MediaGroupArray": [{
    "GroupName": "start",
    "MediaArray": [
      "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-start-1.mp4"
    ]
  },
    {
      "GroupName": "middle",
      "MediaArray": [
        "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-m-1.mp4",
        "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-m-2.mp4",
        "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-m-3.mp4"
      ]
    },
    {
      "GroupName": "end",
      "MediaArray": [
        "http://ice-document-materials.oss-cn-shanghai.aliyuncs.com/test_media/lgh/lgh-end-1.mp4"
      ]
    }
  ],
  "SpeechTextArray": [
    "假期纠结去哪儿玩?云南泸沽湖邀您共赴一场与自然的约会。湛蓝湖水如镜,映照着摩梭女儿国的独特风情,如诗如画。泛舟湖心,感受猪槽船摇曳的岁月静好;仰望女神山,倾听古老神秘的故事传说。还在等什么,快来泸沽湖共享这一份静谧而迷人的湖光山色吧!",
    "假期规划还在犹豫不决?何不考虑赴一场云南泸沽湖的自然盛宴。那湛蓝如镜的湖面,映射出摩梭女儿国独特的民俗风情,如诗如画,引人入胜。您可在湖心悠然泛舟,体验猪槽船摇曳间的宁静岁月;也可抬头瞻仰神圣女神山,倾听那穿越千年的古老神秘传说。快来泸沽湖,共享这片静谧而迷人的湖光山色所带来的无尽诗意吧!"
  ],
  "TitleArray": [
    "泸沽湖:湖光山色中的摩梭风情",
    "探寻秘境泸沽湖",
    "沉浸式体验泸沽湖"
  ]
}

展开查看OutputConfig

{
  "Count": 4,
  "Height": 1080,
  "Width": 1920,
  "MediaURL": "http://<your-bucket>.oss-<region-id>.aliyuncs.com/script/output_{index}_w.mp4"
}

结果示例

竖屏

横屏

混剪逻辑与进阶配置

处理逻辑

全局口播模式:

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

  • 如果有输入全局口播文案,在数量足够的前提下,尽量不重复选取。例如:输入3条文案,需要生成5条视频,则5条成片中会出现相同文案,但3条文案都会被使用至少一次。

  • 按照分组顺序,先每组随机挑选一个拆条后的视频片段,进行前后拼接。如果输入了全局口播文案且视频总时长少于口播时长,则优先从非首尾分组中随机选取视频片段,直到视频总时长与口播时长相当。

  • 成片时长规则:

    • 输入了全局口播文案:成片时长=口播文案的时长。

    • 没有输入全局口播文案:

分组口播模式:

  • 和「全局口播模式」相同,先对长视频进行拆条。相比于全局口播模式,分组口播模式的口播文案在MediaGroup中进行分组设置。因此,MediaGroup新增了SpeechTextArray字段。采用分组口播模式时,无需设置InputConfig.SpeechText或SpeechTextArray,若进行设置将导致错误。

  • MediaGroup.SpeechTextArray 为空,说明这个素材组无口播,用Duration控制该组时长,默认5s。

  • 每组支持传入多组口播,如果所有组的口播数量一致(除去无口播组),则默认按顺序组合。比如所有组都选用第N个口播片段。如果每组的口播数量不一致,则每组随机选一个口播片段,最后合并成完整口播。

进阶配置

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

典型场景

  • 如果仅输入一个分组(MediaGroup),并且该组内存在一个或多个视频,则对输入素材进行随机剪辑与拼接;若未设置口播,但仍希望生成一定时长的成片,则需设置OutputConfig.FixedDuration,否则生成的成片仅会包含一个3秒的小片段。

  • 如果输入多个分组,每组包含一个或多个视频,并且每个视频的时长彼此接近,例如均为5秒左右,且希望按顺序从每组中选择一个片段进行前后拼接,则需将EditingConfig.ProcessConfig.SingleShotDuration设置为5秒(尽量保持与原始素材长度大致一致),通过此操作,能够确保不再对“已选择为片段的素材”进行截取。

  • 当输入一个分组时,如果该分组包含图片和视频,则有一定几率会选取到图片,此时图片将占满整个成片。因此,建议避免采用这种使用方式。图片时长的计算逻辑如下:

应用示例

示例一:通过口播分组模式配置片头片尾

适用场景

如果您希望为视频添加一致的片头和片尾,并配备统一的口播,请参阅该场景的示例。

示例参数

展开查看InputConfig参数示例

{
    "mediaGroupArray": [
        {
            "duration": 4,
            "groupName": "opening",
            "mediaArray": [
                "https://*****.****.****/public-template/video/movie_apsara_4.mp4"
            ]
        },
        {
            "groupName": "group1",
            "mediaArray": [
                "http://*****.****.****/test_media/lgh/lgh-start-1.mp4"
            ],
            "speechTextArray": [
                "假期纠结去哪儿玩?",
                "假期规划还在犹豫不决?"
            ]
        },
        {
            "groupName": "group2",
            "mediaArray": [
                "http://*****.****.****/test_media/lgh/lgh-m-1.mp4",
                "http://*****.****.****/test_media/lgh/lgh-m-2.mp4",
                "http://*****.****.****/test_media/lgh/lgh-m-3.mp4"
            ],
            "speechTextArray": [
                "云南泸沽湖邀您共赴一场与自然的约会。湛蓝湖水如镜,映照着摩梭女儿国的独特风情,如诗如画。泛舟湖心,感受猪槽船摇曳的岁月静好;仰望女神山,倾听古老神秘的故事传说。还在等什么",
                "何不考虑赴一场云南泸沽湖的自然盛宴。那湛蓝如镜的湖面,映射出摩梭女儿国独特的民俗风情,如诗如画,引人入胜。您可在湖心悠然泛舟,体验猪槽船摇曳间的宁静岁月;也可抬头瞻仰神圣女神山,倾听那穿越千年的古老神秘传说。快来泸沽湖"
            ]
        },
        {
            "groupName": "group3",
            "mediaArray": [
                "http://*****.****.****/test_media/lgh/lgh-end-1.mp4"
            ],
            "speechTextArray": [
                "快来泸沽湖共享这一份静谧而迷人的湖光山色吧!",
                "共享这片静谧而迷人的湖光山色所带来的无尽诗意吧!"
            ]
        },
        {
            "duration": 4,
            "groupName": "ending",
            "mediaArray": [
                "https://*****.****.****/public-template/video/movie_apsara_3.mp4"
            ]
        }
    ]
}

展开查看EditingConfig参数示例

{
    "MediaConfig": {
        "MediaMetaDataArray": [
            {
                "Media": "https://*****.****.****/public-template/video/movie_apsara_4.mp4",
                "GroupName": "opening",
                "TimeRangeList": [
                    {
                        "In": 1.5,
                        "Out": 5.5
                    }
                ]
            },
            {
                "Media": "https://*****.****.****/public-template/video/movie_apsara_3.mp4",
                "GroupName": "ending",
                "TimeRangeList": [
                    {
                        "In": 1.5,
                        "Out": 5.5
                    }
                ]
            }
        ]
    }
}

展开查看OutputConfig参数示例

{
    "count": 10,
    "height": 1920,
    "mediaURL": "https://*****.****.****/lgh-opening-ending/1731294507380_{index}.mp4",
    "width": 1080,
    "widthHeightRatio": 0.5625
}

示例展示

示例二:通过脚本化自动成片制作人脸集锦视频

如果您对人脸集锦场景相关的需求感兴趣,建议您查阅相关最佳实践:人脸集锦视频制作最佳实践

相关文档