[扣子工作流一] 通过编程为米核剪映小助手添加关键帧

segment_infos1和segment_infos2是调用Add_images之后返回的segment_info片断。通过为每一个片段添加关键帧实现动画效果

async function main({ params }: Args): Promise {
// 1. 参数解析
const {segment_infos1, segment_infos2} = params
// params包含两个视频片段的信息,每个片段包含:
// - start: 片段开始时间(微秒)
// - end: 片段结束时间(微秒)
// - id: 片段唯一标识符

// 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;

}

posted @ 2026-01-30 09:55  lincats  阅读(3)  评论(0)    收藏  举报