剪映自动打关键帧

  • Post author:
  • Post category:其他


牙叔教程 简单易懂

这是给单张图片打关键帧的教程,

给图片打关键帧有四个步骤

  1. 鼠标点选图片
  2. 打起始帧
  3. 跳转到图片末尾
  4. 打结束帧

打帧是一件很费手的事情, 所以我写了个自动化的代码,

专门用来打关键帧, 使用的软件是 AutoHotkey

关键帧参数的详细解释


剪映 自动打关键帧 AutoHotkey

目前的使用效果

鼠标点击图片, 播放头放图片第一帧,

点击按钮, 即可打关键帧

只适用于打简单的关键帧,

如果想要图片中的人物的脸一直漏出来,

那么就需要接入人脸识别, 识别图片中的人脸区域

关键帧打多了, 觉得没必要上人脸识别


我们看看四个步骤, 哪些可以自动化

第一步 鼠标点选图片

这个做不了自动化, 我也是手动点的,

不是说AutoHotkey点不了鼠标,

而是不能判断应该点击哪里

第二步 打起始帧

这个只有两个动作

  • 点击
  • 输入框输入数字

这必然是可以自动化的

第三步 跳转到图片末尾

在第二步做完的时候, 播放头在图片的第一帧,

我们记下此时的图片特征,

我自己选择的特征是, 以图片中心为参考系, 取9个点的颜色,

以此为图片特征

然后, 按快捷键 ↓ , 播放后会移动,

那么图片变不变呢? 这就要靠图片特征来判断了,

如果按了 ↓ , 图片没有变化, 那么我们就继续按 ↓ ,

这就要加一个循环判断操作

这必然是可以自动化的, 看我咋写的

跳到结束帧

跳到结束帧() {
  图片特征current := 获取当前图片特征()
  Send "{Down}"
  ; Sleep delayBetweenKeys
  Sleep 200
  foundIt := False
  loop 10 {
    图片特征afterTouchDownKey := 获取当前图片特征()
    if (图片特征current == 图片特征afterTouchDownKey) {
      OutputDebug "图片特征current == 图片特征afterTouchDownKey"
      图片特征current := 获取当前图片特征()
      Send "{Down}"
      Sleep 200
    }else{
      OutputDebug "图片特征current != 图片特征afterTouchDownKey"
      foundIt := True
      break
    }
  }
  if (!foundIt) {
    OutputDebug "没有找到结束帧"
    SoundBeep 666
    Sleep 500
    SoundBeep 666
    Sleep 200
    Exit ;
    return
  }
  Send "{Left}"
  Sleep delayBetweenKeys
}

获取图片特征的代码

获取当前图片特征() {
  图片特征点 := config.剪映.图片特征点
  center := 图片特征点.center
  distance := 图片特征点.distance

  ; 生成包含九个点坐标的数组
  points := []
  for _, yOffset in [-1, 0, 1] {
    y := center.y + distance * yOffset
    for _, xOffset in [-1, 0, 1] {
      x := center.x + distance * xOffset
      points.Push({ x: x, y: y })
    }
  }

  ; 获取九个点的颜色
  colors := []
  for index, point in points {
    color := PixelGetColor(point.x, point.y)
    colors.Push(color)
  }
  ; 构建字符串格式的返回值
  result := ""
  for index, point in points {
    result .= point.x "," point.y "," colors[index] "|"
  }
  result := SubStr(result, 1, StrLen(result) - 1)  ; 去除最后一个分隔符 "|"

  return result

}

第四步 打结束帧

这个和打开始帧是一样的, 就不说了


目前我测试, 自己是在用的,

只是那些出现半个脑袋的

需要手动重新打帧,

综合来讲, 我自己比较满意


总结 要使用的AutoHotkey命令

点击命令 用于点击关键帧, 还有输入框

MouseClick "left", x, y, 1

输入数据, 用于输入关键帧数值

Send "134"

延时 用于动作之间的等待时间

Sleep 200

回车键, 输入框输入后要点击回车键

Send "{Enter}"

方向键 用于跳转到图片的尾帧

Send "{Down}"
Send "{Left}"

获取图片特征 也就是对比固定点的颜色

color := PixelGetColor(point.x, point.y)

循环

; 生成包含九个点坐标的数组
points := []
for _, yOffset in [-1, 0, 1] {
  y := center.y + distance * yOffset
  for _, xOffset in [-1, 0, 1] {
    x := center.x + distance * xOffset
    points.Push({ x: x, y: y })
  }
}

基本代码就是有以上几条命令组成,

实际上我写了四个文件

分别是

  • 配置文件, 主要是各个按钮的坐标
  • UI界面, 也就是这几个按钮

  • main文件, 主流程
  • service 服务函数
  • utils 工具函数

这一个小小的打关键帧功能, 大概 500 行代码

微信公众号 牙叔教程



版权声明:本文为snailuncle2原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。