脚本获取当前预览时间的方法"/>
AE脚本获取当前预览时间的方法
该方法仅对部分情境进行了测试,实际应用可能存在很多缺陷,希望有大神给出更加好的方法。
代码如下:
var s = app.project.numItems;
s = app.project.item(s).time;
s = timeToCurrentFormat(s, 30);alert(s, 'alert dialog');
表达式讲解
1. 第一行app.project.numItems
得到的是当前项目面板中的素材总数量(包括文件、文件夹)(背景知识见AE脚本 app.project.item(index) 讲解)
2. 获得了素材总数量,假设该值为34,那么第二行的app.project.item(s).time
就表示第34个素材(item)的当前时间值
为什么要取最后一个item的时间值呢?因为不同的item其时间值是不一样的。我的最后一个素材是视频文件,所以得到的时间值正好是当前预览时间值。比如我的时间线调在0:00:30:02
这个位置,那么此时我获得的时间值就是30.1134467801134
:
3. 显然上面这个时间值是不方便的,我们还要对它进行一次转制,转换表达式是一个全局通用的表达式,所以我们可以直接写timeToCurrentFormat(s, 30)
第二个参数是帧率,表示“30fps”,这个值是我随便取的,所以可能与实际情况不符,改进方法详见文末。
4. 最后一行alert(s, 'alert dialog');
就很简单了,只是弹出一个对话窗口,窗口标题为“alert dialog”,窗口内容为转码后的时间值(即本文中的0:00:30:02
)
该方法存在的缺陷
- 如果最后一个item不是视频,会导致时间值出错
- 该方法效率和稳定性都比较低
- 帧速率是自己随手取的,可能会与实际视频帧率不一致
- 理论上应该有更简单稳定的方法来实现,希望有大神能够指点一下
一些改进
通过判断条件来准确地获得含有视频的合成项
之前我们是用最后一个item来取时间值的,所以肯定有非常大的问题,为了保证我们获得的是一个视频item,可以利用一个判断条件:
var s = app.project.numItems; // 获得项目面板的文件(及文件夹)总数// 通过遍历来得到视频item
// 为了节省时间,我选择从倒数第一个往前数
for (i = s; i > 0; i--){if (app.project.item(i).hasVideo && app.project.item(i).typeName == '合成') {// 这个判断条件为:1. 该item必须含有视频;2. item的类型必须是“合成”而非“素材”或“文件夹”s = app.project.item(i).time;break;} else if (i == 1) {// 如果遍历不到的话,就会报视频缺失的错误alert("there is no video compItem found!", 'warning');}
}
利用表达式获取当前视频的帧率
之前我们是随便取了一个值作为帧率,当该取值与实际视频帧率不符时,会导致时间码的末尾数字不相同。比如源素材的预览时间是0:00:30:02
,而我们得到的会是0:00:30:03
。
下面我们来获取当前视频的帧率并交给变量x
持有。完整代码如下:
var s = app.project.numItems;
for (i = s; i > 0; i--){if (app.project.item(i).hasVideo && app.project.item(i).typeName == '合成') {s = app.project.item(i).time; // 获取该合成视频的当前时间(其格式为“30.1134467801134”)var x = app.project.item(i).frameRate; // 获取当前视频的帧速率s = timeToCurrentFormat(s, x); // 对时间进行转制并应用该帧速率break;} else if (i == 1) {alert("there is no video found!", 'warning');}
}alert(s, 'dialog');
参考
After Effects CS6 Scripting Guide - p15, 32, 36, 120
更多推荐
AE脚本获取当前预览时间的方法
发布评论