有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
合成协议可视化编辑在页面上的体现为红框所示部分,进一步体验请登录 腾讯制作云


注意
合成协议用于描述导出合成视频原始资源的组织形式,如果输入协议异常,会引起导出失败等预期外行为

示例合成协议






[
{
"id": "9e841f80-371f-46c7-ae15-70d2a3d7846f",
"items": [
{
"asset_id": "381921553743708603@Public@CME",
"contents": {
"text": "猫头鹰"
},
"duration": 3000,
"id": "2f6897a3-6491-4ac5-8d20-83a32e3ff2fe",
"start_time": 0,
"text_style_id": "381921553743708603@Public@CME",
"type": "subtitle"
},
{
"asset_id": "381921553743708603@Public@CME",
"contents": {
"text": "松鼠"
},
"duration": 3000,
"id": "4a2ecfb5-498d-4218-9ba6-917fe70353d0",
"is_new": true,
"start_time": 3000,
"text_style_id": "381921553743708603@Public@CME",
"type": "subtitle"
}
],
"styles": [
{
"id": "381921553743708603@Public@CME",
"text_style": {
"align": "center",
"bold": 0,
"font": "SimHei",
"font_color": "#ffffff",
"font_size": 60,
"height": 110,
"italic": 0
}
}
],
"type": "subtitle"
},
{
"id": "738157fa-8ae5-4ae0-8ead-b5e8d4ef70d7",
"items": [
{
"asset_id": "5fc609c6b41f1d0001beab46@Public@CME",
"duration": 3000,
"filter_asset_id": "",
"height": 541,
"id": "83069edb-99c3-4a29-8446-6d4feba86832",
"operations": [
{
"params": {
"angle": 0
},
"type": "image_rotate"
}
],
"position": {
"x": 480,
"y": 270
},
"section": {
"from": 0,
"to": 3000
},
"start_time": 0,
"type": "image",
"width": 773
},
{
"asset_id": "5fc609ceb41f1d0001beab95@Public@CME",
"duration": 3000,
"filter_asset_id": "",
"height": 540,
"id": "3ae2a8d4-d326-4367-9712-922580506a51",
"operations": [
{
"params": {
"angle": 0
},
"type": "image_rotate"
}
],
"position": {
"x": 480,
"y": 270
},
"section": {
"from": 0,
"to": 3000
},
"start_time": 3000,
"type": "image",
"width": 811
}
],
"type": "video"
}
]

协议主要概念

舞台:合成视频的可视区域,可视区域包含两个要素,宽高比以及分辨率,目前支持两种比例,16:99:16SDK默认舞台分辨率为 960 * 540。
注意
导出时会使用原素材重新合成,所以导出分辨率和预览分辨率无关,可导出分辨率有三种,具体请参见 导出详情
剪辑时间线:所有在舞台上的资源以及相关内容,都在同一时间线上播放。此时间线与资源本身无关。同一轨道上的时间线不可重叠。
轨道(Track):决定舞台展示层级的容器,顺序字段用数字表示,从小到大,表示从顶层到底层,顶层值为 0,参见 轨道
轨道元素(TrackItem):决定展示内容的容器,只能承载媒资,参见 轨道元素
媒资管理:整合到制作云系统的基本媒体资源,如何导入媒资,具体请参见 导入素材库

基本概念

// 轨道元素
const trackItem = {
id: "45ea83ad-a770-4e4a-a9b2-93cdefa4d369",
start_time: 1440, // 剪辑时间线上的开始时间
duration: 7880, // 剪辑时间线上的持续时间
type: "video", // 素材类型
section: {
// 素材时间戳截取,素材有自身时间线时,才有此属性
from: 0,
to: 7880,
},
asset_id: "5f6464c6ccbc8d0001fc308b", // 素材 id
width: 540,
height: 304,
position: {
x: 270,
y: 480,
},
operations: [
// 对该元素的操作处理,这里是指的旋转,具体请参见 多媒体处理部分
{
type: "image_rotate",
params: {
angle: 0,
},
},
],
};

// 轨道
const track = {
id: "beb45741-c9f0-45b7-a06c-d33b579208b8",
type: "video",
order: 0, // 轨道层级
items: [trackItem], // 轨道上的轨道元素
};

// 后台导出协议:https://cloud.tencent.com/document/product/1156/44159
const TrackData = JSON.stringify([track]);
说明
注意上述轨道协议用于后台导出,不能直接通过 yjplayer.updateData({ tracks }) 更新到播放器,前端通过合成协议助手拼装轨道数据。

轨道

轨道一共有六种类型:titleframesubtitleimageaudiovideo,每种轨道能容纳的素材对应如下:
轨道
容纳素材
中文描述
title
title
文本
subtitle
subtitle
字幕
image
sequence
序列帧(此类素材只能从智能创作素材制作工具产出)
frame
frame,shader
特效
audio
audio
音频
video
video/image/transition
视频/图片/转场
素材类型协议描述请参见 轨道元素。 决定展示内容的容器,只能导入我们的素材库,请参见 导入素材库

轨道元素

主要支持以下类型素材:
名称
说明
视频。
音频。
图片。
作为内容填充的文本文字。
字幕,语音内容的文字展示形式。
特效。
转场。

video

该种类的素材我们提供了更丰富的处理形式,具体请参见 多媒体处理,元素示例如下:
const videoItem = {
id: "45ea83ad-a770-4e4a-a9b2-93cdefa4d369",
start_time: 1440, //剪辑时间线上的开始时间
duration: 7880, //剪辑时间线上的持续时间
type: "video", //素材类型
section: {
// 素材时间戳截取,素材有自身时间线时,才有此属性。
from: 0,
to: 7880,
},
asset_id: "5f6464c6ccbc8d0001fc308b",
width: 540,
height: 304, // 前端预览暂不支持通过 height 调整视频大小
position: {
x: 270,
y: 480,
},
operations: [
//对该元素的操作处理,这里是指的旋转,具体请参见 多媒体处理章节。
{
type: "image_rotate",
params: {
angle: 0,
},
},
],
};

image

该种类的素材我们提供了更丰富的处理形式,具体请参见 多媒体处理,图片除开没有自身时间线外,与视频类型素材基本一致,示例如下:
const imageItem = {
id: "45ea83ad-a770-4e4a-a9b2-93cdefa4d369",
start_time: 1440, //剪辑时间线上的开始时间
duration: 7880, //剪辑时间线上的持续时间
type: "image", //素材类型
asset_id: "5f6464c6ccbc8d0001fc308b",
width: 540,
height: 304, // 前端预览暂不支持通过 height 调整图片大小
position: {
x: 270,
y: 480,
},
operations: [
//详情参见多媒体处理章节。
{
type: "image_rotate",
params: {
angle: 0,
},
},
],
};

audio

该种类的素材我们提供了更丰富的处理形式,具体请参见 多媒体处理,示例如下:
const audioItem = {
id: "3259bbc5-c581-43eb-96a3-1fac66c46aa8",
type: "audio",
order: 0,
items: [
{
id: "c6424c76-0320-4f92-9607-d2a53748fb14",
start_time: 0,
duration: 60080,
type: "audio",
asset_id: "281921553743719902@Public@CME",
section: {
from: 0,
to: 60080,
},
operations: [], //详情参见多媒体处理章节。
},
],
};

title

作为内容填充的文本文字,内容填充的文字可以调整样式,示例数据如下:
const titleItem = {
id: "f83a90eb-a9d9-4634-81d4-c7dc130afaec",
start_time: 80,
duration: 3000,
type: "advanced_title", // 固定文字类型不可变更。
content: {
template_id: "yj_templ_title_text", //固定模板ID,不可变更
params: {
text: "文字标题", //文字内容
text_style: {
//具体属性可参考下面的列表
font_size: 60,
font_color: "#ffffff",
align: "center",
height: 220,
bold: 0,
italic: 0,
},
},
},
position: {
x: 270,
y: 480,
},
width: 240, // 前端预览暂不支持通过 width 调整文字宽度
height: 69, // 前端预览暂不支持通过 height 调整文字高度
transition: [
//动画效果
{
start_time: 0, //动画效果起始时间
duration: 500, //动画效果持续时间
type: "in", //动画类型入场
name: "fade",
},
{
start_time: 2500,
duration: 500,
type: "out", //动画类型出场
name: "move", //
},
],
// 动画效果,用于前端预览,组装复杂协议建议使用我们提供的sdk
transitionFE: {
start: {
name: "FadeIn", //动画类型入场
duration: 500, //动画效果持续时间
},
end: {
name: "MoveOut", //动画类型出场
duration: 500,
},
},
};
说明
文字text_style可支持文字的 通用属性设置。自由文字动画效果,暂时只支持一个入场一个出场
名称
描述
出入场限制
fade
淡入
in,out
move
左移入
in,out
scale
放大
in,out
bounce
弹跳
in

subtitle

字幕类型基本示例如下,字幕类型素材的文字样式轨道通用,所以文字样式是挂载在轨道数据结构:
const subTitleItem = {
id: "3d343d8d-f950-40ea-aa50-e4e0c16cf2f2",
start_time: 480,
duration: 3000,
type: "subtitle",
style_id: "381921553743708206@Public@CME",
text: "字幕文字1",
asset_id: "381921553743708206@Public@CME",
};

/*****
* 字幕样式对象
* **/
const styleItem = {
id: "381921553743708206@Public@CME",
content: {
template_id: "yj_templ_subtitle_common",
params: {
font_size: 60,
font_color: "#ffffff",
align: "center",
height: 110,
bold: 0,
italic: 0,
background_color: "#000000",
background_alpha: 100,
font: "SimHei",
margin_bottom: 125,
font_align: "right",
font_align_margin: 30,
bottom_color: "#3A1616",
bottom_alpha: 100,
border_color: "#FFFFFF",
border_width: 2,
},
},
};
说明
字幕文字的params支持 文字通用设置

frame

注意
特效元素,只支持固定模板,和固定操作。特效必须覆盖其它素材,所以轨道层级处于顶层位置。更多内容请参见 image-glshader
示例:
const item = {
id: "7ae45f5d-f351-4351-b501-64f36ab74f2d",
width: 960,
height: 540, // 前端预览暂不支持通过 height 调整大小
start_time: 0,
duration: 3000,
type: "frame",
operations: [
{
type: "image_glshader",
params: {
name: "LightCircle", //可替换模板
},
},
],
shaderName: "LightCircle", //预览模板
controlVisible: true, // 前端预览控制是否可见
};

transition

注意
转场元素,只支持固定模板。转场元素必须在两个 video 元素之间。转场会叠加两个元素之间时间,转场是平均过渡,所以对转场前后元素有时间要求。推荐使用我们的 SDK 做转场添加操作。具体请参见 典型案例
代码示例:
const tracks = [
{
id: "fdc7bba6-fed6-4fb2-8fe8-e471f599de8b",
type: "video",
order: 0,
items: [
{
id: "11da8fa9-3303-4dd9-9895-c112254ad274",
start_time: 0,
duration: 6620,
type: "video",
section: {
from: 0,
to: 6620,
},
asset_id: "5f3de82664ac1d000117a8e5",
filter_asset_id: "",
width: 960,
height: 540,
position: {
x: 480,
y: 270,
},
operations: [
{
type: "image_rotate",
params: {
angle: 0,
},
},
],
},
/**
*这是转场元素,转场时长3秒,注意前后视频元素与转场元素的时间覆盖。
**/
{
id: "184b06ab-e406-4bc7-b29d-d50c803321cd",
asset_id: "381921553743709257@Public@CME",
start_time: 3620,
duration: 3000,
type: "transition",
prev_item_id: "11da8fa9-3303-4dd9-9895-c112254ad274",
next_item_id: "c3d59391-0e37-4e98-a03a-944fba0670a4",
operations: [
{
type: "trans_image_glt",
params: {
name: "doorway", //转场效果名字
},
},
{
type: "trans_audio_fade_inout",
params: {},
},
],
record: {
prev_item_init: 5120,
next_item_init: 5120,
next_item_start_time: 5120,
},
},
{
id: "c3d59391-0e37-4e98-a03a-944fba0670a4",
start_time: 3620,
duration: 6380,
type: "video",
section: {
from: 3620,
to: 10000,
},
asset_id: "5f3de82664ac1d000117a8e5",
filter_asset_id: "",
width: 960,
height: 540,
position: {
x: 480,
y: 270,
},
operations: [
{
type: "image_rotate",
params: {
angle: 0,
},
},
],
},
],
},
];
转场效果列表
素材 ID
名称
中文描述
617281ea02af87115081286b@Public@CME
crosshatch
交叉网格
617281ea02af87115081286a@Public@CME
colorphase
色彩溶解 2
617281ea02af871150812869@Public@CME
circle
椭圆遮罩
617281ea02af871150812868@Public@CME
cannabisleaf
枫叶遮罩
617281ea02af871150812867@Public@CME
burn
燃烧转场
617281ea02af871150812866@Public@CME
angular
逆时扫描
617281ea02af871150812865@Public@CME
WaterDrop
水滴溶解
617281ea02af871150812864@Public@CME
StereoViewer
分身融合
617281ea02af871150812863@Public@CME
SimpleZoom
拉近变焦
617281ea02af871150812862@Public@CME
GridFlip
网格翻转
617281ea02af871150812861@Public@CME
GlitchDisplace
水银溶解
617281ea02af871150812860@Public@CME
CrossZoom
交叉变焦
617281ea02af87115081285f@Public@CME
ColourDistance
色彩溶解 1
617281ea02af87115081285e@Public@CME
Bounce
向下跳动
617281ea02af87115081285d@Public@CME
Directional
向下平移
617281ea02af87115081285b@Public@CME
fadecolor
黑色转场
617281ea02af87115081285a@Public@CME
LinearBlur
交叉溶解
600590f402af8747f6eb32e8@Public@CME
ZoomInCircles
水波纹
600590f402af8747f6eb32e7@Public@CME
wipeUp
向上收起
600590f402af8747f6eb32e6@Public@CME
wipeRight
向右收起
617281ea02af87115081287f@Public@CME
windowslice
窗口切片
617281ea02af87115081287e@Public@CME
wind
线条向右
617281ea02af87115081287d@Public@CME
undulatingBurnOut
椭圆遮罩 2
617281ea02af87115081287c@Public@CME
squeeze
挤压
617281ea02af87115081287b@Public@CME
squareswire
矩形溶解 2
617281ea02af87115081287a@Public@CME
rotate_scale_fade
风车旋转
617281ea02af871150812879@Public@CME
ripple
波纹溶解
617281ea02af871150812878@Public@CME
randomsquares
矩形溶解 1
617281ea02af871150812877@Public@CME
pixelize
像素溶解
617281ea02af871150812876@Public@CME
pinwheel
风车遮罩
617281ea02af871150812875@Public@CME
perlin
花边遮罩
617281ea02af871150812874@Public@CME
multiply_blend
多重混合
617281ea02af871150812873@Public@CME
morph
缓慢抖动
617281ea02af871150812872@Public@CME
luminance_melt
线条向下
617281ea02af871150812871@Public@CME
kaleidoscope
万花筒
617281ea02af871150812870@Public@CME
hexagonalize
六边形网格
617281ea02af87115081286f@Public@CME
flyeye
水波溶解
617281ea02af87115081286e@Public@CME
fadegrayscale
缓慢渐变
617281ea02af87115081286d@Public@CME
displacement
左上擦除
617281ea02af87115081286c@Public@CME
directionalwipe
右下擦除
600590f402af8747f6eb32e5@Public@CME
wipeLeft
向左收起
600590f402af8747f6eb32e4@Public@CME
wipeDown
向下收起
600590f402af8747f6eb32e3@Public@CME
windowblinds
百叶窗
600590f402af8747f6eb32e2@Public@CME
Swirl
螺旋
600590f402af8747f6eb32e1@Public@CME
swap
放大切换
600590f402af8747f6eb32e0@Public@CME
Radial
雷达扫描
600590f402af8747f6eb32df@Public@CME
PolkaDotsCurtain
弧形扩散
600590f402af8747f6eb32de@Public@CME
polar_function
椭圆扩散
600590f402af8747f6eb32dd@Public@CME
DoomScreenTransition
幕布
600590f402af8747f6eb32dc@Public@CME
cube
立方体
600590f402af8747f6eb32db@Public@CME
circleopen
椭圆聚拢
600590f402af8747f6eb32da@Public@CME
ButterflyWaveScrawler
晃动
381921553743709260@Public@CME
InvertedPageCurl
翻页
381921553743709259@Public@CME
heart
心形
381921553743709256@Public@CME
crosswarp
交叉扭曲
381921553743709258@Public@CME
GlitchMemories
抖动
381921553743709253@Public@CME
Dreamy
波浪
381921553743709257@Public@CME
doorway
门廊
381921553743709255@Public@CME
DreamyZoom
梦幻变焦
381921553743709249@Public@CME
BowTieHorizontal
水平蝴蝶结
381921553743709252@Public@CME
Mosaic
九宫格
381921553743709251@Public@CME
CircleCrop
圆环聚拢
381921553743709250@Public@CME
BowTieVertical
垂直蝴蝶结
381921553743708553@Public@CME
fade
淡入淡出

元素类型及轨道关系

资源类型
元素子类型
所在轨道类型
自由文字
advanced_title
title
音频
audio
audio
马赛克
frame
frame
图片
image
video
视频
video
video
转场
transition
video
字幕
subtitle
subtitle
风格
frame
frame,subType="shader"

轨道元素必要属性

const trackItem = {
id: "61afa77e-8c1f-4fcb-8255-f4d8f4617d0b", // 元素ID,单个剪辑协议内唯一,如果使用我们的sdk,可以不关注此id的的生产。
start_time: 880, // 剪辑时间线上的开始时间。
type: "video", // 素材类型.表明当前素材类型,以决定如何处理.
duration: 3000, // 播放持续时间。
asset_id: "731195088946733255", // 媒资id。
};

轨道元素位置计算

默认的舞台分辨率为960 * 540,采用直角坐标系确定元素位置,以左上角为原点(0,0)。整个舞台位于坐标系第一象限内。元素的position属性默认描述元素中心点。例如一张100*100的图片紧贴原点完整放置在舞台上,那么它的position值为(50,50)。
属性值
类型
说明
x
number
横坐标。
y
number
纵坐标。

轨道元素截取

说明
仅在自身有时间线的元素上存在,例如 音频,视频。
属性值
类型
说明
from
number
片段起始时间戳,单位为毫秒 ms。
to
number
片段末尾时间戳,单位为毫秒 ms。

轨道元素通用数据

文字通用属性

说明
适用于titletext_style属性,以及subtitleparams属性。
属性值
类型
说明
height
number
高度,仅字幕可用。(必要
font_size
number
字体大小。(必要
font_color
string
字体颜色,16 进制 RGB,如 #ffffff。 (必要)
font
string
字体名
font_alpha
number
背景透明度,范围[0, 100]。
font_align
string
水平对齐方式:center(默认)、left、right。
font_uline
number
下划线宽度。
font_align_margin
number
大于等于 0,font_align=left 表示左边距,font_align=right 表示右边距,其他无效。
bold
number
字体加粗,默认 0(不加粗)、1(加粗)。仅可用于黑体、宋体和楷体。字幕(subtitle)使用 bold 属性,内容填充文字(advanced_title)使用 font_bold。
italic
number
字体倾斜,默认 0(正常)、1(斜体),字幕(subtitle)使用 italic 属性,内容填充文字(advanced_title)使用 font_italic。
border_width
number
边框宽度,取值只支持 0 和 1。
border_color
string
边框颜色,border_width 不为 0 时有效。
border_alpha
number
边框透明度,border_width 不为 0 时有效,取值只支持 0 和 100。
shadow_color
string
文字阴影,仅内容填充文字(advanced_title)可用。
shadow_alpha
number
背景透明度,范围[0, 100],shadow_color 存在时有效,仅内容填充文字(advanced_title)可用。
bottom_color
string
文字底色,仅字幕(subtitle)可用。
bottom_alpha
number
文字底色透明度,范围[0, 100],bottom_color 存在时有效,仅字幕(subtitle)可用。
background_color
string
全屏背景颜色,16 进制 RGB,如 #000000
background_alpha
number
全屏背景透明度,范围[0, 100],background_color 存在时有效。
margin_bottom
number
仅字幕(subtitle)可用,默认为 0。

多媒体处理

说明
该属性允许调整素材的一些基础信息,通过operations字段进行设置,完整能力如下列表,Y 表示支持此操作,N 表示不支持。
operation
video
image
audio
transition
frame
备注
image_mirror
支持
支持
不支持
不支持
不支持
图像镜像。
image_rotate
支持
支持
不支持
不支持
不支持
图像旋转。
支持
支持
不支持
不支持
不支持
普通图像滤镜。
支持
支持
不支持
不支持
不支持
Lut 滤镜模板。
image_transparent
支持
支持
不支持
不支持
不支持
图像透明度。
支持
支持
不支持
不支持
不支持
图像剪切,不可单独预览
image_space
支持
支持
不支持
不支持
不支持
图像缩放,不可单独预览
不支持
不支持
不支持
不支持
支持
马赛克。
不支持
不支持
不支持
不支持
支持
特效。
支持
支持
不支持
不支持
支持
运动效果。
audio_volumes
支持
不支持
支持
不支持
不支持
音量调整。
基础示例:
/* 图像(图片、视频图像) 相关的操作 */
const imageMirrorOp = {
type: "image_mirror", // 【必选】【string】 operation 类型,
params: {
left_right: 1, // 【必选】【int】 取值:1-左右镜像
up_down: 1, // 【必选】【int】 取值:1-上下镜像
},
};
// 图像旋转
const imageRotateOp = {
type: "image_rotate", // 【必选】【string】 operation 类型,
params: {
angle: 90, // 【必选】【int】 旋转角度
},
};
// 图像简单滤镜
const imageFilterNormalOp = {
type: "image_filter_normal",
params: {
contrast: 100, // 【必选】【int】 对比度,取值范围 [-100, 100],0 表示不处理
brightness: 50, // 【必选】【int】 亮度,取值范围 [-100, 100],0 表示不处理
saturation: -20, // 【必选】【int】 饱和度,取值范围 [-100, 100],0 表示不处理
},
};

// 图像透明
const imageTransparentOp = {
type: "image_transparent",
params: {
alpha: 0, // 【必选】【int】 透明度,取值范围[0,100],0表示透明
},
};
// 图像裁剪
const imageCropOp = {
type: "image_crop",
params: {
x: 0, // 【必选】【int】 裁剪起始点(相对于item的)
y: 0, // 【必选】【int】 裁剪起始点(相对于item的)
width: 0, // 【必选】【int】 裁剪宽度
height: 0, // 【必选】【int】 裁剪高度
},
};
// 图像马赛克
const imageMosaicOp = {
type: "image_mosaic",
params: {
name: "vague", // 【必选】【string】 马赛克类型,目前只支持模糊(vague)、方块(mosaic)
x: 0, // 【必选】【int】 马赛克起始点(相对于item的)
y: 0, // 【必选】【int】 马赛克起始点(相对于item的)
width: 0, // 【必选】【int】 马赛克宽度
height: 0, // 【必选】【int】 马赛克高度
degree: 100, // 【可选】【int】 马赛克程度,范围[0,100]
},
};

// 调整大小和位置

const imageSpaceOp = {
type: "image_space",
params: {
x: 0, // 【可选】【int】 存在表示新的中心点x
y: 0, // 【可选】【int】 存在表示新的中心点y
width: 0, // 【可选】【int】 存在且大于0,表示新的宽度
height: 0, // 【可选】【int】 存在且大于0,表示新的高度
},
};
// 图像opengl shader效果

const imageGlshaderOp = {
type: "image_glshader"
params: {
name: "xxx", // 【必选】【string】 效果名称
},
};

// 音量调整
const audioOp = {
type: "audio_volumes",
params: {
"all": 52 // 【必选】【number】 音量大小,值域0-100
}
};
crop 裁剪功能预览的流程如下:
1.1 将待裁剪视频按照满屏的方式放置到舞台内。
1.2 在满屏基础上设置裁剪区域。
1.3 还原视频位置信息。
说明
裁剪数据设置流程复杂,如需设置也可以使用我们 SDK 提供的crop方法。
示例:
const item = {
id: "0bfdd748-b548-42f4-9711-09ae5c534061",
start_time: 0,
duration: 63560,
type: "video",
section: {
from: 0,
to: 63560,
},
asset_id: "5f6464c6ccbc8d0001fc308b",
width: 960, //视频原始宽高
height: 254, //视频原始宽高
position: {
//元素原本位置信息
x: 480,
y: 270,
},
operations: [
{
/**
* 对视频重设,让其满屏
**/
type: "image_space",
params: {
x: 480,
y: 270,
width: 960,
height: 540,
},
from: "crop_start", //表示裁剪开始
},
{
/**
* 设置裁剪区域,裁剪区域是一个矩形,
* x,y为裁剪位置
* width,height表示裁剪区域
**/
type: "image_crop",
params: {
x: 376,
y: 28,
width: 223,
height: 59,
},
},
{
/**
* 还原元素位置和大小,这个示例里裁剪开始前与裁剪结束后位置是一样的。
**/
type: "image_space",
params: {
x: 480,
y: 270,
width: 960,
height: 254,
},
from: "crop_end", //裁剪结束
},
],
sizeControl: 0,
};
image-mosaic
说明
特效类轨道必须是覆盖在普通视频轨道之上。
示例:
/***
* 必须使用特效类轨道。
***/
const trackItem = {
id: "adfe3eab-db8f-4b4c-96e8-730bf3a9226d",
type: "frame",
order: 0,
items: [],
};

const item = {
id: "0c5e990d-bdf9-47f6-b1a5-ac7639060e4f",
asset_id: "fe-731195088946733254",
start_time: 0,
duration: 3000,
type: "frame",
operations: [
{
type: "image_mosaic", //类型固定为 image_mosaic
params: {
name: "mosaic", //名字固定为 image_mosaic
degree: 20,
x: 311,
y: 40,
width: 320,
height: 180,
},
},
],
};

/**
* 放入轨道
* */
track.items.push(trackItem);

/**
* 最终数据结构
* */
const data = [trackItem];
image-filter-lut 协议示例大致如下:
const item = {
id: "7edc76a8-1a28-4546-b0ca-fd7403660ca1",
start_time: 0,
duration: 63560,
type: "video",
section: {
from: 0,
to: 63560,
},
asset_id: "5f6464c6ccbc8d0001fc308b",
width: 960,
height: 540,
position: {
x: 480,
y: 270,
},
operations: [
{
type: "image_rotate",
params: {
angle: 0,
},
},
{
/**
* 注意: 这里要使用我们的协议工具辅助完成拼装。
* 详情请看下面
***/
type: "image_filter_lut",
params: {
name: "yj_templ_lut_24", //修改此模板ID即可变更效果
image_url:
"https://1810000000.vod2.myqcloud.com/b64e98acvodcq1810000000/thumbnail/filter/yj_templ_lut_24.png",
},
},
],
};
注意
滤镜素材使用请参见 典型案例-使用公共滤镜
/**
* 所有的滤镜素材
**/
const tplMap = [
{ Name: "氰版照", MaterialId: "5fd329e702af8755735859a1@Public@CME" },
{ Name: "胶片", MaterialId: "5fd329e702af87557358599f@Public@CME" },
{ Name: "魅影", MaterialId: "5fd329e702af87557358599e@Public@CME" },
{ Name: "冷酷", MaterialId: "5fd329e702af87557358599d@Public@CME" },
{ Name: "美式", MaterialId: "5fd329e702af87557358599c@Public@CME" },
{ Name: "天王星", MaterialId: "5fd329e702af8755735859a4@Public@CME" },
{ Name: "柯达", MaterialId: "5fd329e702af87557358599b@Public@CME" },
{ Name: "蜡纸底片", MaterialId: "5fd329e702af8755735859a5@Public@CME" },
{ Name: "凹版照相", MaterialId: "5fd329e702af8755735859a2@Public@CME" },
{ Name: "树脂", MaterialId: "5fd329e702af8755735859a3@Public@CME" },
{ Name: "橙色天空", MaterialId: "5fd329e702af875573585996@Public@CME" },
{ Name: "中性", MaterialId: "5fd329e702af875573585995@Public@CME" },
{ Name: "幻紫", MaterialId: "5fd329e702af875573585994@Public@CME" },
{ Name: "午后", MaterialId: "5fd329e702af87557358599a@Public@CME" },
{ Name: "假日", MaterialId: "5fd329e702af875573585992@Public@CME" },
{ Name: "黄昏", MaterialId: "5fd329e702af875573585999@Public@CME" },
{ Name: "胡桃木", MaterialId: "5fd329e702af875573585991@Public@CME" },
{ Name: "红杉", MaterialId: "5fd329e702af875573585998@Public@CME" },
{ Name: "水墨", MaterialId: "5fd329e702af875573585993@Public@CME" },
{ Name: "卷曲粉红", MaterialId: "5fd329e702af875573585997@Public@CME" },
{ Name: "青山", MaterialId: "5fd329e702af87557358598c@Public@CME" },
{ Name: "朋克", MaterialId: "5fd329e702af87557358598b@Public@CME" },
{ Name: "青色", MaterialId: "5fd329e702af87557358598a@Public@CME" },
{ Name: "城镇", MaterialId: "5fd329e702af875573585989@Public@CME" },
{ Name: "小镇", MaterialId: "5fd329e702af875573585988@Public@CME" },
{ Name: "珠光蓝", MaterialId: "5fd329e702af875573585987@Public@CME" },
{ Name: "巧克力", MaterialId: "5fd329e702af875573585990@Public@CME" },
{ Name: "自由蓝", MaterialId: "5fd329e702af87557358598f@Public@CME" },
{ Name: "都市", MaterialId: "5fd329e702af87557358598e@Public@CME" },
{ Name: "雪域森林", MaterialId: "5fd329e702af87557358598d@Public@CME" },
{ Name: "橘光", MaterialId: "5fd329e702af875573585982@Public@CME" },
{ Name: "蒙层", MaterialId: "5fd329e702af875573585981@Public@CME" },
{ Name: "明亮", MaterialId: "5fd329e702af875573585985@Public@CME" },
{ Name: "洛莫彩色", MaterialId: "5fd329e702af875573585980@Public@CME" },
{ Name: "文艺", MaterialId: "5fd329e702af875573585984@Public@CME" },
{ Name: "藏青", MaterialId: "5fd329e702af87557358597e@Public@CME" },
{ Name: "录影带", MaterialId: "5fd329e702af87557358597f@Public@CME" },
{ Name: "梦想家", MaterialId: "5fd329e702af87557358597c@Public@CME" },
{ Name: "暗调", MaterialId: "5fd329e702af875573585986@Public@CME" },
{ Name: "青柠", MaterialId: "5fd329e702af875573585983@Public@CME" },
{ Name: "暗黑", MaterialId: "5fd329e702af875573585976@Public@CME" },
{ Name: "初秋", MaterialId: "281921553743709738@Public@CME" },
{ Name: "傍晚", MaterialId: "281921553743709742@Public@CME" },
{ Name: "温暖", MaterialId: "281921553743709741@Public@CME" },
{ Name: "冷光", MaterialId: "281921553743709740@Public@CME" },
{ Name: "梦幻", MaterialId: "281921553743709737@Public@CME" },
{ Name: "标准深", MaterialId: "5fd329e702af87557358597b@Public@CME" },
{ Name: "倒叙", MaterialId: "5fd329e702af87557358597a@Public@CME" },
{ Name: "仲夏", MaterialId: "5fd329e702af875573585979@Public@CME" },
{ Name: "青春", MaterialId: "5fd329e702af875573585978@Public@CME" },
{ Name: "老相片", MaterialId: "281921553743709733@Public@CME" },
{ Name: "宁静", MaterialId: "381921553743709127@Public@CME" },
{ Name: "古铜", MaterialId: "281921553743709739@Public@CME" },
{ Name: "清晨", MaterialId: "381921553743709125@Public@CME" },
{ Name: "藕荷", MaterialId: "281921553743709735@Public@CME" },
{ Name: "自然", MaterialId: "381921553743709128@Public@CME" },
{ Name: "早春", MaterialId: "281921553743709736@Public@CME" },
{ Name: "薄暮", MaterialId: "381921553743709126@Public@CME" },
{ Name: "金秋", MaterialId: "281921553743709734@Public@CME" },
{ Name: "晨光", MaterialId: "381921553743709129@Public@CME" },
];
具体效果可登录 腾讯制作云 进行查看,如下图:


image-filter-normal 示例:
const item = {
id: "7edc76a8-1a28-4546-b0ca-fd7403660ca1",
start_time: 0,
duration: 63560,
type: "video",
section: {
from: 0,
to: 63560,
},
asset_id: "5f6464c6ccbc8d0001fc308b",
width: 960,
height: 540,
position: {
x: 480,
y: 270,
},
operations: [
{
type: "image_rotate",
params: {
angle: 0,
},
},
{
type: "image_filter_normal", //修改params值即可调整对应效果
params: {
contrast: 100, //对比度
brightness: 0, //明亮度
saturation: 0, //饱和度
},
},
],
};
image-glshader 基础示例:
/**
* 特效视频只能放到特效轨道上.注意特效必须覆盖其它素材。
* **/
const track = {
id: "61eed235-a61a-4ae0-baaf-49dda661c962",
type: "frame",
order: 1,
items: [],
subType: "shader",
};

/****
* 特效元素
* **/
const trackItem = {
id: "03816c76-4ba0-48bd-b7c7-289f45002652",
width: 960, //宽高取值与舞台保持一致
height: 540, //宽高取值与舞台保持一致
asset_id: "5f0aba91cb093b30566c5da9@Public@CME",
start_time: 0,
duration: 3000,
type: "frame",
operations: [
/**
* 如果是组合特效,则有两个操作对象
* */
{
type: "image_glshader",
params: {
name: "LightCircle", //导出替换值
},
// 注: 组合特效需要注意顺序,顺序改变导出效果会有变化
// {
// type: "image_glshader",
// params: {
// name: "ScBlurThreeY", //导出替换值
// },
// },
// {
// type: "image_glshader",
// params: {
// name: "ScBlurThreeX", //导出替换值
// },
// },
],
/***
* 由于部分滤镜特效是由多种操作组合成,例如注释内的高斯模糊效果,
* 所以预览值和导出值有可能不一样。预览值表示可以在预览组件上看的效果。
* **/
shaderName: "LightCircle", //预览值
// shaderName: "ScBlurThree" // 模糊
};

track.items.push(trackItem)

/**
* 最终数据结构
* */
const data = [trackItem]
所有的特效描述:
预览名称
描述
组合
LightCircle
光斑
LightCircle
Heart
爱心
Heart
Shining
光芒四射
Shining
Blink
亮晶晶
Blink
Bubble
泡泡
Bubble
Snow
飘雪
Snow
Rain
雨滴
Rain
Duotone
双色调
Duotone
FlowingLight
流光
FlowingLight
ChasingLight
逐光
ChasingLight
Rainbow
彩虹
Rainbow
Multicoloured
炫彩
Multicoloured
Shake
抖动
Shake
Swing
摇晃
Swing
SoulOut
灵魂
SoulOut
Hallucination
幻觉
Hallucination
ShineWhite
闪白
ShineWhite
Glitch
故障
Glitch
OldVideo
老电影
OldVideo
Mirror
镜像
Mirror
ScBlurThree
模糊分屏
ScBlurThreeY、ScBlurThreeX
ScGrayThree
黑白三屏
ScGrayThree
ScTwo
两屏
ScTwo
ScThree
三屏
ScThree
ScFour
四屏
ScFour
ScSix
六屏
ScSix
ScNine
九屏
ScNine
具体效果可登录 腾讯制作云 进行查看,如下图:



image_lens_stretch
格式描述:
const op = {
type: "image_lens_stretch",
transformName: "xxx", //【必选】【string】
params: {
name: "xxx", // 【必选】【string】
start_time: 0, // 【可选】【int】 存在且大于等于0,相对于item时间,效果开始时间,默认0
duration: 0, // 【必选】【int】 存在且大于0,效果持续时间
from_center: [], // 【可选】【float 数组】 初始状态中心点,size=2,[x, y],取值>=0,默认0.5
from_scale: [], // 【可选】【float 数组】 初始状态大小, size=2,[width, height],取值>=0,默认1
to_center: [], // 【可选】【float 数组】 目标状态中心点,size=2,[x, y],取值>=0,默认0.5
to_scale: [], // 【可选】【float 数组】 目标状态大小, size=2,[width, height],取值>=0,默认1
},
};
// transformName-params.name

// 通用运动动画
// ZoomOut-Stretch 推远
// ZoomIn-Stretch 拉近
// MoveLeft-Transform 左移
// MoveRight-Transform 右移
// MoveDown-Transform 上移
// MoveUp-Transform 下移

// 文字动画
// FeatherRight-FeatherRight 羽化向右展开
// FeatherLeft-FeatherLeft 羽化向左展开
// Typewriter-Typewriter 打字机
// WipeRight-WipeRight 向右擦除
// WipeLeft-WipeLeft 向左擦除
基础示例:
/****
* 运动元素
* 这里以图片运动为例
* **/
const trackItem = [
{
id: "5e08d7bb-a3df-4721-a9dc-2d7cf1ffb7fe",
type: "video",
order: 0,
items: [
{
id: "94ea0aea-ad23-4e1a-aae1-52f1f8bc5805",
start_time: 0,
duration: 8080,
type: "image",
asset_id: "5f3cca3bb439500001b2edd8",
filter_asset_id: "",
operations: [
{
type: "image_lens_stretch",
transformName: "ZoomOut",
params: {
name: "Stretch",
duration: 8100,
start_time: 0,
from_scale: [2.5, 2.5],
to_scale: [1.1, 1.1],
from_center: [0.5, 0.5],
to_center: [0.5, 0.5],
},
},
{
type: "image_rotate",
params: {
angle: 0,
},
},
],
width: 673,
height: 540,
position: {
x: 480,
y: 270,
},
section: {
from: 0,
to: 8080,
},
transitionFE: {
start: {
name: "",
duration: 0,
},
end: {
name: "",
duration: 0,
},
},
transition: [],
},
],
},
];

/**
* 最终数据结构
* */
const data = [trackItem];

合成协议助手

CMEUtils

YJPlayer.Helper.CMEUtils 协助用户处理媒资素材。

auth

YJPlayer.Helper.CMEUtils.auth
在远端登录,以便获取资源,再次调用可以新增登录角色。
注意
没有登录则以下部分接口无法使用,登录后再调用以下方法。
输入参数
参数
描述
类型
必填
sign
身份验证签名,详情请参见 签名概述
string
返回值
type result = Promise<{
code:string
}>

logout

登出
输入参数 空。
返回值 空。

createTrackItem

创建 轨道元素(trackItem) 数据,可以直接添加到 轨道(track) 中使用。
输入参数
参数
描述
类型
必填
materialIds
string[]
返回值 返回一个基础的视频合成协议元素,详情请参见 轨道元素
type result = Promise<{
id: string;
type: materialType;
start_time: number;
duration: number;
asset_id: string;
}>;
示例
/**
* @auth 登录方法,保证可以调用CME,WebAPI。
* @param sign {{string}} 签名串。
**/
YJPlayer.Helper.CMEUtils.auth({
sign: "your_sign",
})
.then(() => {
console.log("登录成功");
})
.catch((err) => {
console.error("登录异常");
});

/**
* @createTrackItem 创建轨道元素协议数据。
* @param asset_ids {{string[]}} 媒资ID数组
* @param options {{object}} 可选参数
* */
YJPlayer.Helper.CMEUtils.createTrackItem(["materialId1", "materialId2"], {})
.then((data) => {
console.log("创建成功", data);
})
.catch((err) => {
console.log("创建失败", err);
});

Track & TrackItem

YJPlayer.Helper.TrackYJPlayer.Helper.TrackItem 两种操作场景,包含方法如下:
操作场景
命名空间
描述
create
创建一个包含基础协议格式的轨道数据
append
添加轨道元素方法
sort
按照我们预设层级逻辑为轨道重新排列
addMosaic
添加马赛克
添加字幕
create
创建非素材类型的轨道元素
crop
对素材进行裁剪

Track 操作场景

create
输入参数
参数
描述
类型
必填
options
轨道设置,具体类型请参见 轨道描述
{type:'video'/'audio'/....}
index
轨道层级
number
否,默认从 0 开始自增。注:轨道有层级顺序,参考 sort 说明。
返回值 合成协议的基础请参见 轨道数据
interface Track {
id: string;
type: string;
order: number;
items: any[];
}

type result = Promise<Track>;
示例
const imageTrack = YJPlayer.Helper.Track.create({
type: "image",
});
console.log(imageTrack);
append
输入参数
参数
描述
类型
必填
materialId
string
trackItem
object
insertIndex
插入位置,默认插入队尾
number
返回值 已填充元素的轨道数据。
type result = Track;
示例:
const imageTrack = YJPlayer.Helper.Track.create({
type: "image",
});
const item = {};
YJPlayer.Helper.CMEUtils.createTrackItem(["materialId"], {}).then((trackItem) => {
Track.append(imageTrack, trackItem);
console.log(imageTrack);
});

sort
轨道排序方法,会将传入轨道设置到正确的层级上,由于展示问题,部分轨道应该被摆到合适到的位置才会有效果,例如字幕应该是处于靠前位置的轨道。以下是轨道权重,如并列放置则可以随意调整层级:
- title
- frame
- subtitle
- image/audio/video
输入参数
参数
描述
类型
必填
tracks
包含 轨道 数据的数组
object
返回值
已排序的轨道数组。
type result = Track[];
示例
const imageTrack = YJPlayer.Helper.Track.create({
type: "image",
});
const videoTrack = YJPlayer.Helper.Track.create({
type: "video",
});
const subtitleTrack = YJPlayer.Helper.Track.create({
type: "subtitle",
});

const sortedData = YJPlayer.Helper.Track.sort([
imageTrack,
videoTrack,
subtitleTrack,
]);

/**
* subtitle会被排到最前面
* */
console.log(sortedData);

addMosaic
给合成协议添加马赛克。
输入参数
参数
描述
类型
必填
params
左上角开始坐标位置(x,y),裁剪矩行区域 (width,height),{x,y,width,height}
object
fusionData
包含 轨道 的数组
object
返回值 已经添加过马赛克轨道的数据协议。
type result = Track[];
示例
/**
* 先获取一段已有的合成数据。
*/
const fusiontData = [
/*
* 一段轨道数据
**/
];
/**
* 从视频的左上角位置开始,位于(10,10),
* 宽高为(50,50)的部分打上马赛克。
*/
const result = YJPlayer.Helper.Track.addMosaic(
{
x: 10,
y: 10,
width: 50,
height: 50,
},
fusiontData
);
console.log(result);
addSubtitle 添加字幕轨道功能。
输入参数
参数
描述
类型
必填
fusionData
包含 轨道 的数组
object
param
起始时间,持续时间,文字内容 {start_time,duration,text}
object
styles
文字样式 {font_size,font_color,align,italic,background_color,background_alpha,height},请参见 示例
object
返回值 已经添加过字幕轨道的数据协议。
type result = Track[];
示例
/**
* 先获取一段已有的合成数据。
*/
const fusiontData = [
/*
* 一段轨道数据
**/
];
/***
*
* 视频第一秒开始,字幕持续1秒,字幕内容是“这是字幕1”,
* 以此类推
*/
const subtitles = [
{
duration: 1000, //持续时间 ,单位ms
text: "这是字幕1",
start_time: 1000, //开始时间点.单位ms
},
{
duration: 1000,
text: "这是字幕2",
start_time: 3000,
},
];
const result = YJPlayer.Helper.Track.addSubtitle(fusiontData, subtitles, {
font_size: 12, //文字大小 ,单位px
font_color: "#cb0000", // 文字颜色
align: "center", //"center" | "left" | "right"s
italic: false, // 文字斜体
background_color: "#000", //字幕背景
background_alpha: 50, //背景透明度0-100
height: 100, //高度 单位像素
});
console.log(result);

TrackItem 操作场景


create
创建非素材类型的轨道元素,需要传入相关参数。
输入参数
参数
描述
类型
必填
type
元素类型
string
material_type
元素的子类型(同一个元素类型有不同的子类型)
string
start_time
剪辑时间线上的开始时间
number
duration
剪辑时间线上的持续时间
number
width
元素在舞台中展示的宽度
number
height
元素在舞台中展示的高度
number
position
元素在舞台中的位置
object { x: number; y: number;}
section
元素片段时间线
object { from: number; to: number;}
音频、视频、特效等元素必填
text
元素文本内容
string
字幕和文本元素必填
content
元素辅助性元数据内容
object
文本和自由文字元素必填
style_id
字幕样式 ID
string
仅字幕元素必填
asset_url
元素媒资 URL
string
非文本和自由文字元素必填
thumbnail_url
元素媒资 URL,提供裁剪尺寸时可用于内部优化
string
asset_id
元素媒资 ID
string
返回值 携带裁剪操作数据的轨道元素对象,完整数据结构请参见 合成协议
/**
* @create 创建轨道元素协议数据。
* @param options {{object}} 可选参数
* */
const trackItem = YJPlayer.Helper.TrackItem.create({
type: "video",
material_type: "video",
start_time: 0,
duration: 10000,
width: 960,
height: 540,
position: {
x: 480,
y: 270,
},
section: {
from: 0,
to: 10000,
},
asset_url: "https://xxx.xxx.mp4",
});

crop
裁剪视频元素,需要传入舞台相关参数。
输入参数
参数
描述
类型
必填
trackItem
object
options
裁剪区域中心点位置,裁剪大小
object: { x:number , y:number, width:number, height:number }
返回值 携带裁剪操作数据的轨道元素对象,完整数据结构请参见 轨道元素
type result = {
id: string;
asset_id: string;
// ....
operation: any[];
};
示例
/**
* 裁剪的必须是视频元素
* @createTrackItem 创建轨道元素协议数据。
* @param asset_id {{string}} 媒资ID
* @param options {{object}} 可选参数
* */
YJPlayer.Helper.CMEUtils.createTrackItem(["materialId"], {})
.then((data) => {
YJPlayer.Helper.TrackItem.crop(data, {
crop: {
x: 20,
y: 20,
width: 100,
height: 100,
},
stage,
});
console.log("裁剪完成", data);
})
.catch((err) => {
console.log("数据拉取失败", err);
});

典型案例

多个视频首尾衔接

/**
* 传入轨道元素数组,返回一段将传入轨道元素内容首位衔接的完整轨道数据。主要有以下步骤:
* 1. 创建一个轨道。
* 2. 元素添加到轨道上,默认是首尾衔接填充轨道内容。
* 3. 得到一个可以播放的视频合成协议。
*/
async function demo1() {
const trackItems = await YJPlayer.Helper.CMEUtils.createTrackItem([
"materialId1",
"materialId2",
"materialId3",
]);
const track = YJPlayer.Helper.Track.create({
type: "video",
});
trackItems.forEach((element) => {
YJPlayer.Helper.Track.append(track, element);
});
console.log("track:", track);
const resultData = [track];
console.log(resultData);
return resultData;
}

裁剪视频

/**
* 裁剪视频步骤:
* 1. 创建一个轨道。
* 2. 得到一个视频/图片轨道元素。对其使用裁剪方法。
* 3. 裁剪后的元素添加到轨道内。
* 4. 得到一个可以播放的视频合成协议。
*/
async function demo2() {
const trackItems = await YJPlayer.Helper.CMEUtils.createTrackItem([
"materialId1",
"materialId2",
"materialId3",
]);
const track = YJPlayer.Helper.Track.create({
type: "video",
});
/**
* 在宽高为960,540的舞台上
* 从视频的左上角位置(100,100)
* 截取宽50 ,高50的画面
*/
const cropedElement = YJPlayer.Helper.TrackItem.crop(trackItems[0], {
rect: {
x: 100,
y: 100,
width: 50,
height: 50,
},
stage: {
width: 960,
height: 540,
},
});
YJPlayer.Helper.Track.append(track, cropedElement);
const resultData = [track];
console.log(resultData);
return resultData;
}

使用公共滤镜

/**
* 对一个已有的视频/图片轨道元素应用一个lut滤镜素材:
* 1. 通过素材ID创建视频/图片元素
* 2. 应用lut滤镜效果
* 3. 创建轨道,并装填轨道
* 4. 得到一个可预览协议
**/
async function demo0() {
const trackItems = await YJPlayer.Helper.CMEUtils.createTrackItem([
"materialId1",
"materialId2",
"materialId3",
]);
for (const i = 0; i < trackItems.length; ++i) {
/**
* 胶片滤镜应用,胶片滤镜ID 为 '5fd329e702af8755735859a1@Public@CME'
* 全部滤镜查看请到滤镜部分查看
***/
await YJPlayer.Helper.TrackItem.lut(
trackItems[i],
"5fd329e702af87557358599f@Public@CME"
);
}

/*
设置滤镜强度,通过 filter_strength 字段
https://vs-cdn.tencent-cloud.com/sdk/yj-player-1.4.10.js 版本以上支持
{
"type": "image_filter_lut",
"params": {
"name": "yj_templ_lut_87",
"image_url": "https://1810000000.vod2.myqcloud.com/b64e98acvodcq1810000000/thumbnail/filter/yj_templ_lut_87.png",
"filter_strength": 100
}
}
*/

const track = YJPlayer.Helper.Track.create({
type: "video",
});
trackItems.forEach((element) => {
YJPlayer.Helper.Track.append(track, element);
});
console.log("track:", track);
const resultData = [track];
console.log(resultData);
return resultData;
}

视频添加转场

/***
* 添加视频转场:
* 1. 获取一段已有的视频合成协议。
* 2. 向其中添加一个视频转场。
* 3. 得到一个已经处理好的视频合成协议。
*/
async function demo3() {
/**
* 先获取一段已有的合成数据。
*/
const fusionData = demo1();
/**
* 创建一个公共的视频转场元素,这里使用的是九宫格效果。
* 查阅转场元素涉及相关素材ID请到转场部分查看。
*
*/
const transition = await YJPlayer.Helper.CMEUtils.createTrackItem([
"381921553743709252@Public@CME",
]);
/**
* 将转场添加到视频轨道的第一个视频片段后。
*/
YJPlayer.Helper.Track.append(fusionData[0], transition[0], 1);
return fusionData;
}

视频打马赛克

/***
* 对合成视频部分打马赛克。
* 1. 获得一个合成协议。
* 2. 调用轨道场景内添加马赛克方法。
* 3. 得到一个已经处理好的视频合成协议。
*/
async function demo3() {
/**
* 先获取一段已有的合成数据。
*/
const fusionData = demo1();
/**
* 从视频时间线起始点打上马赛克。
* 坐标位于(10,10)的位置
* 持续时长为5s
* 马赛克宽高为(200,200)
*/
const result = YJPlayer.Helper.Track.addMosaic(
fusionData,
{
start_time: 0,
duration: 5000,
degree: 50,
x: 10,
y: 10,
width: 200,
height: 200,
},
0 // 0为马赛克效果,1为高斯模糊效果
);
console.log(result);
return result;
}

设置默认字幕

/***
* 添加默认字幕:
* 1. 获取一段已有的视频合成协议。
* 2. 调用轨道场景内添加字幕方法。
* 3. 得到一个已经处理好的视频合成协议。
*/
async function demo4() {
const trackItems = await YJPlayer.Helper.CMEUtils.createTrackItem([
"materialId1",
"materialId2",
"materialId3",
]);
/**
* 先获取一段已有的合成数据。
*/
const fusionData = demo1(trackItems);

/***
*
* 视频第一秒开始,字幕持续1秒,字幕内容是“这是字幕1”,
* 以此类推
*/
const subtitles = [
{
duration: 1000, //持续时间 ,单位ms
text: "这是字幕1",
start_time: 1000, //开始时间点.单位ms
},
{
duration: 1000,
text: "这是字幕2",
start_time: 3000,
},
];
const result = YJPlayer.Helper.Track.addSubtitle(fusionData, subtitles);
console.log(result);
return result;
}

序列帧-贴片/序列帧-文字/序列帧-特效

/**
* 1. 创建一个对应类型轨道
* 2. 通过指定素材ID创建轨道元素,【注意】此功能对象不可进行序列化,对象中包含BLOB类型数据
* 3. 装填轨道
* 4. 得到一个可预览协议
**/
/**
* 序列帧-贴片
*/
async function demo9() {
// image-sequence
const track = YJPlayer.Helper.Track.create({
type: "image",
});

const trackItem = await YJPlayer.Helper.TrackItem.createSequence(
"608a7497c1af830001c9292e@Public@CME", //素材ID
yjPlayer // yjPlayer 实例,参考【播放器】部分
// 可选参数
// {
// width?: number
// height?: number
// position?: {
// x: number
// y: number
// }
// start_time?: number
// duration?: number
// }
);

YJPlayer.Helper.Track.append(track, trackItem);
const resultData = [track];
return resultData;
}

/**
* 序列帧-文字
*/
async function demo10() {
// title-sequence_title
const track = YJPlayer.Helper.Track.create({
type: "title",
});
const trackItem = await YJPlayer.Helper.TrackItem.createSequence(
"608bc4d689ea7200013ff244@Public@CME", //素材ID
yjPlayer //yjPlayer的实例
// {
// width?: number
// height?: number
// position?: {
// x: number
// y: number
// }
// start_time?: number
// duration?: number
// content?: 文字可用的配置项,参考 advanced_title
// }
);
YJPlayer.Helper.Track.append(track, trackItem);
const resultData = [track];
return resultData;
}

/**
* 序列帧-特效
*/
async function demo11() {
// frame-sequence_effect
// subType: shader

const track = YJPlayer.Helper.Track.create({
type: "shader",
});
const trackItem = await YJPlayer.Helper.TrackItem.createSequence(
"60ebfe3852840e0001b4836c@Public@CME", //素材ID
yjPlayer //yjPlayer的实例
// {
// start_time?: number
// duration?: number
// }
);
YJPlayer.Helper.Track.append(track, trackItem);
const resultData = [track];
return resultData;
}