[扣子工作流一] 通过编程为米核剪映小助手添加关键帧
segment_infos1和segment_infos2是调用Add_images之后返回的segment_info片断。通过为每一个片段添加关键帧实现动画效果
async function main({ params }: Args): Promise
// 2. 为第一个视频片段生成关键帧
const segment_infos1_list = [];
for(let i=0;i<segment_infos1.length;i++){
const start = segment_infos1[i].start;
const end = segment_infos1[i].end;
// 2.1 生成垂直方向(Y轴)关键帧 - 上下跳动
// 每隔900000微秒(0.9秒)打一个关键帧
const countY = (end - start) / 900000;
for(let j=0;j<countY;j++){
// 交替值:-250px 和 -150px
let value = j%2==0 ? -250 : -150;
// 将像素值转换为归一化值(除以1080 - 视频高度)
segment_infos1_list.push({
"offset": j*900000, // 关键帧时间偏移(从片段开始计算)
"property": "KFTypePositionY", // 关键帧属性:Y轴位置
"segment_id": segment_infos1[i].id,
"value": value/1080 // 归一化后的值(-250/1080 ≈ -0.231, -150/1080 ≈ -0.139)
});
}
// 2.2 生成水平方向(X轴)关键帧 - 左右移动
// 每隔700000微秒(0.7秒)打一个关键帧
const countX = (end - start) / 700000;
for(let j=0;j<countX;j++){
// 交替值:-1024px 和 -824px
let value = j%2==0 ? -1024 : -824;
segment_infos1_list.push({
"offset": j*700000,
"property": "KFTypePositionX", // 关键帧属性:X轴位置
"segment_id": segment_infos1[i].id,
"value": value/1920 // 归一化后的值(除以1920 - 视频宽度)
});
}
}
// 3. 为第二个视频片段生成关键帧(与第一个片段参数不同)
const segment_infos2_list = [];
for(let i=0;i<segment_infos2.length;i++){
const start = segment_infos2[i].start;
const end = segment_infos2[i].end;
// 3.1 垂直方向关键帧(1秒间隔)
const countY = (end - start) / 1000000;
for(let j=0;j<countY;j++){
// 交替值:217px 和 117px
let value = j%2==0 ? 217 : 117;
segment_infos2_list.push({
"offset": j*1000000,
"property": "KFTypePositionY",
"segment_id": segment_infos2[i].id,
"value": value/1080
});
}
// 3.2 水平方向关键帧(0.8秒间隔)
const countX = (end - start) / 800000;
for(let j=0;j<countX;j++){
// 交替值:1049px 和 900px
let value = j%2==0 ? 1049 : 900;
segment_infos2_list.push({
"offset": j*800000,
"property": "KFTypePositionX",
"segment_id": segment_infos2[i].id,
"value": value/1920
});
}
}
// 4. 输出结果
const ret = {
"keyframes1": JSON.stringify(segment_infos1_list),
"keyframes2": JSON.stringify(segment_infos2_list)
};
return ret;
}

浙公网安备 33010602011771号