これが結構曲者で、例えば動画にチャプターを打つ場合、チャプターポイントは各パートの先頭フレームに来るように打つものであるが、ブックマークが打たれている場所が各パートの終端だと、そのまま"Bookmarks to Chapter.py"を使うわけにいかない。
各パートの終端フレームの次のフレームは当然、次のパートの先頭フレームになるわけだが、この1フレームのずれを修正するために、いちいちブックマークを消して、1フレーム移動して、もう一度ブックマークを打ち直すのはめんどくさい、なんとかならんもんかいな?
と思ったので、これもマクロで何とかしてみようというのが今回のお話。
-----------------------------------------------------------------------------
既存のブックマークすべてを1フレーム右(未来方向)にずらすだけなら簡単である。
#Shift Bookmarks right+1.py
before=avsp.GetBookmarkList()
if len(before):
after = [i + 1 for i in before]
after.sort()
avsp.SetBookmark(before) #ブックマークは二重に打つと消える。
avsp.SetBookmark(after)
しかし、これをそのまま使うと、もし最終フレームにブックマークが打たれていた場合、そのブックマークは範囲外に飛び出して消えてしまう。それに、すでにブックマークを1フレームずらし終えたのに、何らかの操作ミスでもう一回ずらしてしまったらどうしよう? マクロを使った場合、undoは効かないよ?
はたまた、例えばブックマークを打ち終え、チャプターを出力する段になったところでトリムのし残しを発見してしまった場合は? その部分が全部で10個打ったブックマークの2番目と3番目の間に30フレームあったりしたら、1番目と2番目は打ち直すとしても、3番目以降のためにこれを30回実行するの?
ずらすフレーム数を任意に指定できるようにしたとして、全部で10000フレームしかないクリップに対して、桁を間違えて100000なんて指定してしまったら?
などと不測の事態についていろいろ考えていたら、最後にはこうなっていた。
#Shift Bookmarks.py
def newBM(present, shift, last):
if 0 <= present + shift <= last:
return present + shift
elif present + shift > last:
return newBM(present, shift - last - 1, last)
else:
return newBM(present, shift + last + 1, last)
input = avsp.GetTextEntry('Input an integer value',default='1')
shift = int(input)
before = avsp.GetBookmarkList()
if shift and len(before):
framecount = avsp.GetVideoFramecount()
after = [newBM(old, shift, framecount - 1) for old in before]
after.sort()
avsp.SetBookmark(before)
avsp.SetBookmark(after)
うーむ、再帰なんて初めて使ったよ。-------------------------------------------------------------------------
使い方:
ブックマークが打たれた状態でマクロを実行するとダイアログが現れるので、数値を入力する。デフォルトは1。
正ならば右(未来方向)、負ならば左(過去方向)にすべてのブックマークが指定した数値分だけ移動する。
最終フレーム + 1 = 0番フレーム(0番フレーム - 1 = 最終フレーム)として循環処理される。
数値以外の文字列を入力した場合はエラーとなり何もしない。小数点以下は切り捨て。
操作を取り消したい場合はもう一度マクロを実行し、事前の指定値の反数を入力すること。
0 件のコメント:
コメントを投稿