剪映自动打关键帧

简介: 点击按钮, 即可自动打关键帧

牙叔教程 简单易懂

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

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

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

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

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


关键帧参数的详细解释

https://mp.weixin.qq.com/s/7GnS3HnXCiPO4owgGZLSsA

目前的使用效果

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

点击按钮, 即可打关键帧

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

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

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

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



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

第一步 鼠标点选图片

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

不是说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 行代码


微信公众号 牙叔教程


相关文章
|
编解码 图形学
剪映一秒批量打关键帧
剪映打关键帧, 一百张图片, 只需要一秒钟
1137 0
|
1月前
ThreeJs手动控制动画播放与暂停
这篇文章介绍了如何在Three.js中手动控制动画的播放与暂停,包括设置动画混合器、监听按键事件以调整动画状态和速度的方法。
44 0
ThreeJs手动控制动画播放与暂停
|
3月前
Framer 使用滚动变体创建动画
Framer 使用滚动变体创建动画
36 0
|
C++
Qt图片定时滚动播放器+透明过渡动画
解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1] 需要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() ,所以本项目 需要使用自定义的MyQLabel继承QLabel
144 0
|
编解码 API 图形学
|
JavaScript 前端开发
video设置播放时间点及常用属性和方法
video设置播放时间点及常用属性和方法
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
151 0
绘制帧率与实际显示时帧率不同步,怎么测得显示帧率?
绘制帧率与实际显示时帧率不同步,怎么测得显示帧率?
164 0
SwiftUI—如何修改动画的播放速度和延迟时间
SwiftUI—如何修改动画的播放速度和延迟时间
316 0
SwiftUI—如何修改动画的播放速度和延迟时间