Hiero 花式上镜头号——进阶篇
- Hiero
- Nuke Studio
- 视效剪辑
Hiero 花式上镜头号——进阶篇
Token
是什么
你在加入某些微信群的时候,群公告会说,请将自己的昵称改成 姓名-城市-职业
诸如此类的要求,你不假思索就知道自己该改成什么样的群昵称。
比如有些活动的报名,让你回复姓名+手机号+人数
。
这里的姓名
城市
职业
手机号
人数
在Hiero
里叫Token
。咱这里也不强行翻译了。
Hiero
里使用的token
都要用大括号扩起来,比如{shot}
{clip}
,跟普通字符做区分。
群昵称改成Hiero
的Token
风格就是{name}-{city}-{job}
。
Token
有哪些
这些Token
不是你想写成就是啥的,是Hiero
给你提供的有限的几个,不能瞎写。
在Rename Shots
这个功能里,可用的Token
有:
{shot}
: 镜头的名字{clip}
: 镜头素材的名字{track}
: 镜头所在track
的名字{sequence}
:镜头所在的sequence
的名字{event}
: 镜头的剪辑序号{fps}
: 镜头所在sequence
的fps
{filename}
: 镜头素材的文件名
当你点击Rename
时,Hiero
对选中的镜头挨个进行操作,并将该镜头的信息带入到token
中解析,将解析结果作为镜头的新名字。
类比到微信群昵称{name}-{city}-{job}
:
- 当小明进群的时候,他的昵称就是
小明-北京-合成师
- 小花进群的时候,她的昵称就是
小花-上海-视效剪辑
- 懂?
前文我们介绍了Rename Shots...
有6 种重命名模式:
- Simple Rename(支持
Token
) - Find and Replace(支持
Token
) - Sequential Rename(支持
Token
) - Match Sequence
- Clip Name
- Change Case
我们拿 Simple Rename 来具体举例,它可以凭一己之力,可以取代 6 种模式的 3 种。
Token
直接使用 如果你写{clip}
, 那么所有的镜头会被重命名为该镜头对应的素材名字。
补充说明
等同于Clip Name
模式下的效果
(后面我就不再截图了,都是填写在New Name
那里。)
如果你写{shot}
,意思是把镜头重命名为镜头原来的名字,啥事也没干。
如果你写{filename}
,则镜头号会变成face_0010_plt_bga_v0003.1001.jpg
(序列文件会显示第一帧)
除了{clip}
之外,我们很少会只写一个Token
,经常在次基础上做拼接
Token
拼接Token
可以和Token
拼接,也可以和普通字符拼接。
举例
Token | Result |
---|---|
{event}{shot} | 1face_0010_plt_bga |
{shot}+{clip} | face_0010_plt_bga+face_0010_plt_bga_v0003 |
{track}_{shot} | pl_face_0010_plt_bga |
test_{shot} | test_face_0010_plt_bga |
{shot}_hahaha | face_0010_plt_bga_hahaha |
{event}_test_{shot} | 1_test_face_0010_plt_bga |
注意
大括号外面的是普通字符,写的是啥就是啥,不做修改
Python
加持Token
使用在这个神奇的大括号里,可以运行一行Python
表达式!
Hiero
会首先把Token
替换成代表的值,然后参与Python
表达式的运算,表达式最后的值,就是最后镜头的新名字。
挨挨挨憋走!憋急着走!(尔康手
Muggle 的你不想进入魔法世界吗?
是的,你想!
下面让我们一起愉快的学一点Python
知识吧!(〜^㉨^)〜
额外说明
为讲解方便,下面我们都是用{shot}
来举例,换成其他Token
都是可以的,根据你实际情况来选择。
索引——第x 位,出列!
索引(Index),就是给一队人(字符串),按顺序,每人发个编号,代表这个人(字符)。如下图。
魔法世界规则
魔法世界是从第 0 位开始的。
如果我们的镜头名字叫Hello
,那么
{shot[0]}
就是H
{shot[3]}
就是l
也可以倒着数:
{shot[-1]}
就是o
{shot[-4]}
就是e
如果想要He
呢? {shot[0]}{shot[1]}
如果想要ello
呢? 我的天,要写四遍啊?!我是拒绝的,好在还有取一个范围的办法。
切片——从第x 个到第y 个,出列!
{shot[x:y]}
就是从第 x 个开始算,数到第 y 个停止,但是第 y 个不算在内。x, y 都是数字哦~
那么如果想要ello
呢?可以这么写{shot[1:5]}
- 不能写
{shot[1:4]}
,也不能写成{shot[1:-1]}
因为第 y(4或-1) 位不算在内。 - 但是不建议写成
{shot[1:5]}
,这是魔法师的惯例,超过了 index 的范围(5),就像直呼伏地魔的名字一样,忌讳!(但实际上也不会有问题)而且,从某个位置开始一直到结尾,难道你还要数一下总共有多少个吗?
那怎么搞?
魔法世界规则
当我们的索引位置,是开头,或者是结尾的时候,可以省略不写哈哈哈哈
也就是说,拿到ello
的常规做法是{shot[1:]}
如果想拿 He
,当然可以 {shot[0]}{shot[1]}
,但这是初级魔法师的做法,{shot[:2]}
才是优秀魔法师的做法。
E15_SZDS_V1_0120
里最后四位0120
是我想要的,{shot[-4:]}
给你。
重要提示
在Rename Shots...
里不能输入:
,因为这里的输入框被Hiero
加了限制(截止Nuke Studio 11.2v2是这样)。
但在其他地方,比如说Export...
功能那里是可以的。
我们需要换一种写法。别问为什么,照着抄吧。
{shot[1:4]}
要写成{shot.__getitem__(slice(1,4))}
{shot[:4]}
要写成{shot.__getitem__(slice(4))}
{shot[2:]}
要写成{shot.__getitem__(slice(2, len(shot)))}
如果你试了没反应或者报错了,记得数一数括号有没有少...o(>_<)o ~~
调整大小写——百变大小写
lower()
全变小写。等同于Change case
模式下的lowercase
效果upper()
全变大写。等同于Change case
模式下的UPPERCASE
效果title()
变成英文标题的格式。等同于Change case
模式下的Title Case
效果capitalize()
变成仅首字母大写。等同于Change case
模式下的Capital case
效果swapcase()
翻转大小写,也就是大写的变小写,小写的变大写
魔法世界规则
小括号不能省哦~!
举例:
Token | Result |
---|---|
{shot.lower()} | Ep01_pL_0010 -> ep01_pl_0010 |
{shot.upper()} | Ep01_pL_0010 -> EP01_PL_0010 |
{shot.title()} | ep01_pl_0010 -> Ep01_Pl_0010 |
{shot.capitalize()} | ep01_pl_0010 -> Ep01_pl_0010 |
{shot.swapcase()} | Ep01_pL_0010 -> eP01_Pl_0010 |
查找替换
replace(a, b)
将字符串里面的 a 字符替换成 b 字符。
额外说明
等同于Find and Replace
模式
比如镜头名字叫 E15_SZDS_V1_0120
想把其中的_
替换成-
,则可{shot.replace('_', '-')}
比如要把镜头包含 pl
的全部替换成td
,则可 {shot.replace('pl', 'td')}
魔法世界规则
注意要加引号呀!!把要查找和替换的内容包起来!
补位零——我可是四位的镜头号
zfill(width)
不够 width(是个数字) 这么长的,在左边补够0
,本身就比 width 还长,就不用补了。
比如 {shot.zfill(4)}
- 2 -> 0002
- 20->0020
- 222 -> 0222
- 2310 -> 2310
- 45234 -> 45234
- ha -> 00ha
- hahaha -> hahaha
width 你可以设定为 3 等等任意数字。是不是跟入门篇的Pattern ####
那里很像?
真真是可惜啊,Token
拿不到用户选择的镜头们的序号(跟 event 序号不一样),否则Sequential Rename
模式也都可以被Simple Rename
干掉!
分割
split(str)
使用str
去分割。
比如E15_SZDS_V1_0120
我想要的是 V1
,当然你可以{shot[9:11]}
拿到,但是如果其他镜头名字叫E3_SZDS_V1_0120
呢?{shot[9:11]}
得到的是_V
,偏了。(冒号那里要转换成__getitem__(slice(9,11))
)
这是我们观察到,这个镜头号由下划线连接而成,则可以使用
{shot.split('_')}
分割成了 E15
SZDS
V1
0120
这四个部分。
如果只到此为止,你会发现,镜头名字改成了['E15', 'SZDS', 'V1', '0120']
。
我们还需要进一步,拿到 V1
,还记得索引吗??告诉我V1
在里面是第几个?第 2 个(从 0 开始别忘了)。
改进一下 {shot.split('_')[2]}
就拿到 V1
了
混合使用
上述介绍的所有用法我们可以各种组合,拿E15_SZDS_V1_0120
作为 shot 。
对使用{shot.split('_')[2].lower()}
,在得到了V1
后又使用了lower()
,结果就是v1
也可以{shot.lower().split('_')[2]}
先 lower
再 split
。
{shot.split('_')[-1].zfill(6)}
-> 000120
{shot[:4].lower()}_{shot.split('_')[-1].zfill(6)}
-> e15_000120
(冒号那里要转换成__getitem__(slice(4))
)
当然我们大可不必非得一次搞定,可以多进行几次。
魔法世界规则
Python
的字符串还有一些魔法,但是在这里不是很常用,你也可以通过这里去多了解一下。
总结
上文说的有 3中可被取代的模式为:
- Find and Replace 可以通过 Simple Rename 的
{shot.replace(a, b)}
取代 - Clip Name 可以通过 Simple Rename
{clip}
取代 - Change Case 可以通过 Simple Rename 的如下表达式取代
{shot.lower()}
{shot.upper()}
{shot.title()}
{shot.capitalize()}
当我们拿到镜头后,观察一下。
如果镜头名字跟如下信息有关联吗,如果有,可以通过Simple Rename
+Token
方式,进行一次,或多次操作,得到基本的镜头名字,然后再配合Find and Replace
或者Change case
进行二次调整。
如果镜头名字完全没有线索,但是好在镜头号有连续现象,可以通过Sequential Rename
一段一段进行批量上号。
进一步思考
如果镜头名字跟上述信息无关,顺序还是乱七八糟没有规律:
复杂的实际工作
我的新镜头名字是要从
Shotgun
或ftrack
里确定的呢?是要从剪辑师的剪辑工程里拿的呢?
eld
里呢?xml
里呢?excel/csv
里呢?
可不可以我提供好新名字的列表,给我按照顺序,挨个重命名选中的镜头?
不管新名字列表的来源是Shotgun
导出的csv
也好,edl/xml
也好,甚至是自己在excel
里手动输入的也好,全部处理成,一个镜头名字一行的纯文本,复制镜头名字到剪切板,然后有个工具,咔嚓一下,就把剪切板里的镜头名字,按顺序加到选中的镜头上。完工。
对,这个工具就是下一篇要更新的。
等一下!
小精灵鬼儿举手提问
我能发明自己的 Token
吗?
当然可以!