剪映自动打关键帧

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

牙叔教程 简单易懂

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

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

  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 行代码


微信公众号 牙叔教程


相关文章
|
2月前
|
编解码
ffmpeg 裁剪视频命令 时间 修改分辨率
ffmpeg 裁剪视频命令 时间 修改分辨率
159 0
|
2月前
|
前端开发 JavaScript
前端必看的8个HTML+CSS技巧 (六) 裁剪图像的动画
前端必看的8个HTML+CSS技巧 (六) 裁剪图像的动画
剪映一秒批量打关键帧
剪映打关键帧, 一百张图片, 只需要一秒钟
1032 0
|
13天前
|
前端开发
css动画 —— 自定义不规则的动画路径 offset-path (含不规则的动画路径参数获取方法)
css动画 —— 自定义不规则的动画路径 offset-path (含不规则的动画路径参数获取方法)
9 1
|
11月前
Qt图片定时滚动播放器+透明过渡动画
解决:[QWidget::paintEngine: Should no longer be called QPainter::begin: Paint device returned engine == 0, type: 1] 需要在哪个控件上绘制,就要在哪个控件类中重写 paintEvent() ,所以本项目 需要使用自定义的MyQLabel继承QLabel
95 0
|
10月前
|
JavaScript 前端开发
video设置播放时间点及常用属性和方法
video设置播放时间点及常用属性和方法
|
JavaScript 前端开发 容器
手写图片拖拽、鼠标点位缩放
如题,无关技术背景,什么vue、react自己想用就用,这就是js加一点点css实现,意思就是可以任意迁。
165 0
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
【Three.js入门】处理动画、尺寸自适应、双击进入/退出全屏(Clock跟踪时间,Gsap动画库,自适应画面,进入/退出全屏)
114 0
绘制帧率与实际显示时帧率不同步,怎么测得显示帧率?
绘制帧率与实际显示时帧率不同步,怎么测得显示帧率?
142 0
【音频处理】Melodyne 网络缩放功能 ( 音符分离线 | 片段分离线 | 窗口滚动条 | 网格缩放 | 修改图像显示位置 | 显示五线谱 )
【音频处理】Melodyne 网络缩放功能 ( 音符分离线 | 片段分离线 | 窗口滚动条 | 网格缩放 | 修改图像显示位置 | 显示五线谱 )
362 0
【音频处理】Melodyne 网络缩放功能 ( 音符分离线 | 片段分离线 | 窗口滚动条 | 网格缩放 | 修改图像显示位置 | 显示五线谱 )