文档

云剪辑

更新时间:

微短剧解决方案提供通过API进行视频剪辑(云剪辑)的能力。通过阅读本文,您可以了解微短剧视频剪辑(云剪辑)作业的基本API调用方法。

说明

使用微短剧媒体云剪辑,请确保您已基本了解什么是云剪辑。详情参见云剪辑概述

创建云剪辑工程

概述

视频剪辑(云剪辑)服务是视频点播的制作中心,支持剪切拼接、混音、字幕、图片叠加、遮标、转场特效等一系列功能,提供在线可视化的剪辑平台(控制台)及相应的OpenAPI。本文为您介绍云剪辑的系统架构、核心链路以及费用说明等。

接口说明

  • 视频制作在整个视频链路(采集、制作、播放/互动、媒资管理)中具有非常重要的地位,将前期的采集拍摄和最终的分发播放连成一体,起着承前启后的作用。云剪辑服务就是视频点播的制作中心,支持剪切拼接、混音、字幕、图片叠加、遮标、转场特效等一系列功能。

    云剪辑是一个云端一体的产品,包括前端组件/页面与后端服务两大部分。

    • 云剪辑前端组件/页面

      包括剪切、拼接、遮标、文字、调整顺序等组件或页面功能。具体操作,请参见视频剪辑

    • 后端服务

      分为两部分内容:媒体合成服务和云剪辑工程管理服务。

      • 您可以利用在线的云剪辑工具,对上传到点播媒资库的云端素材进行剪辑,提交合成;

      • 也可以自行组织时间线数据,直接提交合成。

      合成的新视频将存储到点播媒资库,您可以快速进行分发播放,无需再进行下载和上传的操作。

示例

调用AddEditingProject接口创建云剪辑工程,示例Demo如下:

package com.aliyun.sample;

import com.aliyun.tea.*;

public class Sample {

    /**
     * <b>description</b> :
     * <p>使用AK&amp;SK初始化账号Client</p>
     * @return Client
     * 
     * @throws Exception
     */
    public static com.aliyun.vod20170321.Client createClient() throws Exception {
        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Endpoint 请参考 https://api.aliyun.com/product/vod
        config.endpoint = "vod.cn-shanghai.aliyuncs.com";
        return new com.aliyun.vod20170321.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.vod20170321.Client client = Sample.createClient();
        com.aliyun.vod20170321.models.AddEditingProjectRequest addEditingProjectRequest = new com.aliyun.vod20170321.models.AddEditingProjectRequest();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            client.addEditingProjectWithOptions(addEditingProjectRequest, runtime);
        } catch (TeaException error) {
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
            // 错误 message
            System.out.println(error.getMessage());
            // 诊断地址
            System.out.println(error.getData().get("Recommend"));
            com.aliyun.teautil.Common.assertAsString(error.message);
        }        
    }
}

微短剧使用云剪辑最佳实践

云剪辑Timeline示例

{
	"VideoLayers": [{
		"VideoLayerClips": [{
			"MediaId": "xxx"
		}]
	}],
	"SubtitleLayers": [{
		"SubtitleLayerClips": [{
			"FileUrl": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-subtitle.srt",
			"SubType": "srt",
			"Type": "Subtitle",
			"Font": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-font.ttf",
			"FontColor": "#ffffff",
			"Y": 0.6927,
			"FontSize": 75,
			"Alignment": "TopCenter",
			"TextWidth": 0.9,
			"AdaptMode": "AutoWrapAtSpacesStrict",
			"SubtitleEffects": [{
				"Type": "Box",
				"Color": "#000000",
				"Opacity": 0.5,
				"XBord": 10,
				"YBord": 10,
				"Radius": 15
			}]
		}]
	}],
	"FECanvas": {
		"Height": 1920,
		"Width": 1080
	}
}

成片视频如下:

实践步骤如下:

  1. vtt文件转srt文件

    目前云剪辑字幕轨道中支持使用srt字幕同时设置字幕样式参数,如果您的字幕格式是vtt,需要使用FFMPEG做一下文件格式转换,转换命令如下:

    ffmpeg -i example.vtt example.srt

    之后可以在字幕轨道中传入字幕srt文件来设置字幕内容,Timeline如下所示:

    {
      "VideoLayers": [{
        "VideoLayerClips": [{
          "MediaId": "xxx"
        }]
      }],
      "SubtitleLayers": [{
        "SubtitleLayerClips": [{
          "FileUrl": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-subtitle.srt",
          "SubType": "srt",
          "Type": "Subtitle",
          "Font": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-font.ttf",
          "FontSize": 75
        }]
      }]
    }
  2. 上传字体/字幕文件到点播

    如果您使用的是点播系统Bucket,可以直接在控制台上传字幕/字体文件,也可以通过上传SDK上传辅助媒资;如果您使用的是自有OSS bucket,可以直接使用OSS SDK将您的字幕/字体文件上传到OSS以便进一步使用。

    1726729079525-83df04d1-6d0b-4cef-8128-65cdddb501a7.png

  3. 设置字幕样式

    字幕轨道支持设置多种字幕样式来灵活实现短剧场景的各种功能,字幕参数如下:

    名称

    类型

    描述

    FontSize

    Int

    当字幕类型为横幅文字时,表示文字的字号。默认为0,最大支持设置到5000。

    FontColor

    String

    当字幕类型为横幅文字时,表示文字的颜色,格式为#后跟16进制值。例如:#ffffff。

    Alignment

    String

    当字幕类型为横幅文字时,用于设置定位对齐方式,默认为TopLeft,支持设置:

    • TopLeft:视频左上角

    • TopCenter:视频竖直中轴线上侧

    • TopRight:视频右上角

    • CenterLeft:视频水平中轴线左侧

    • CenterCenter:视频中心位置

    • CenterRight:视频水平中轴线右侧

    • BottomLeft:视频左下角

    • BottomCenter:视频竖直中轴线下侧

    • BottomRight:视频右下角

    若需要在不同对齐方式下准确定位字幕位置,建议设置以下对齐方式:

    • Left,左对齐,X、Y传入字幕左上角顶点相对于视频左上角的坐标

    • Center,居中对齐,X、Y传入字幕中轴线上边界交点相对于视频左上角的坐标

    • Right,右对齐,X、Y传入字幕右上角顶点相对于视频左上角的坐标

    AdaptMode

    String

    横幅文字当超出视频宽度或超出指定TextWidth时进行自动换行或缩放:

    • AutoWrap:自动换行

    • AutoScale:自动缩放

    • AutoWrapAtSpacesStrict:严格按照在空格位置自动换行(适用于纯英文字幕自动换行场景)

    TextWidth

    Float

    字幕文本框宽度,当设置AdaptMode时生效。将按照该值设置文本框宽度进行自动换行或缩放。不填写时,会按照视频宽度进行自动换行或缩放。当值大于0小于等于1时,表示相对输出视频的宽度,当值大于1时,表示绝对像素值。

    FontUrl

    String

    当字幕类型为横幅文字时,支持使用用户oss的字体文件路径来生成字幕,支持ttf、otf、woff三种格式的字体文件。例如:https://your-bucket.oss-cn-shanghai.aliyuncs.com/example-font.ttf

    • 支持传入「OSS 外网 Endpoint 地址」或者「其它公网可以访问的地址」

    SubtitleEffects

    SubtitleEffect[]

    当字幕类型为横幅文字时,表示文字多层效果。目前支持设置多层描边、多层阴影、高斯模糊效果(高斯模糊仅支持在类型为阴影时使用)和字幕背景效果。字幕圆角样式背景参考该字段细节

    SubtitleEffects内支持设置多层描边、多层阴影、发光效果、字幕背景等多种样式,具体参数协议如下所示:

    名称

    类型

    是否必填

    描述

    Type

    String

    -Outline:描边

    -Shadow:阴影

    -Box:字幕底框

    Bord

    Float

    描边/阴影宽度或高度,当大于1时,表示像素值,当大于0小于1时,表示相对文字大小的宽度或高度。

    XBord

    Float

    描边/阴影宽度,当大于1时,表示像素值,当大于0小于1时,表示相对文字大小的宽度,优先级高于Bord。

    YBord

    Float

    描边/阴影高度,当大于1时,表示像素值,当大于0小于1时,表示相对文字大小的高度,优先级高于Bord。

    Shift

    Float

    描边/阴影左右/上下偏移量,当绝对值大于1时,表示像素值,当绝对值大于0小于1时,表示相对文字大小的偏移量,支持设置负数,效果为向上/左偏移。

    XShift

    Float

    描边/阴影左右偏移量,当绝对值大于1时,表示像素值,当绝对值大于0小于1时,表示相对文字大小的左右偏移量,优先级高于Shift。

    YShift

    Float

    描边/阴影上下偏移量,当绝对值大于1时,表示像素值,当绝对值大于0小于1时,表示相对文字大小的上下偏移量,优先级高于Shift。

    Color

    String

    RGB颜色,格式为#后跟16进制值。例如:#ffffff。

    Opacity

    String

    不透明度,1为完全不透明,0为完全透明。

    Blur

    Float

    高斯模糊范围,像素值,仅支持在Type=Shadow时使用,可以实现字幕外发光效果。

    Radius

    Float

    文字纯色背景圆角半径,仅支持在Type=Box时使用,可以实现字幕背景圆角效果。

    如果期望设置圆角背景,可以在字幕轨道中增加SubtitEffects,参考如下:

    {
      "VideoLayers": [{
        "VideoLayerClips": [{
          "MediaId": "xxx"
        }]
      }],
      "SubtitleLayers": [{
        "SubtitleLayerClips": [{
          "FileUrl": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-subtitle.srt",
          "SubType": "srt",
          "Type": "Subtitle",
          "Font": "https://your-bucket.oss-cn-shanghai.aliyuncs.com/your-font.ttf",
          "FontSize": 75,
          "SubtitleEffects": [{
    				"Type": "Box",
    				"Color": "#000000",
    				"Opacity": 0.5,
    				"XBord": 10,
    				"YBord": 10,
    				"Radius": 15
    			}]
        }]
      }]
    }