リンクをクリップボードにコピー
コピー完了
長尺の動画(10分以上)に対して、ロトベジェがかかったマスクを作成するプログラムを作成しています。
スクリプト(After Effects.jsx)は正常に動いていると思われるのですが、長尺の動画(10分以上)にロトベジェがかかっていないマスクが表示されてしまいます。
添付画像(image.jpg)は、ロトベジェのオプションがついた二つのマスク(Target 1, Target 2)を表示させた時の画像になります。
Target1のマスクにはロトベジェが反映されたマスクが表示されますが、Target2のマスクにはロトベジェが反映されていないように見えます。
発生原因や対処方法等ををご存知の方がいらっしゃいましたら、ご教示の程よろしくお願いいたします。
var data = [{"target_id":1,"sequence":[
{"frame":1,"contours":[[301,200],[267,231],[260,279],[281,324],[321,351],[347,319],[351,271],[338,224]]},
{"frame":2,"contours":[[302,201],[267,234],[261,281],[283,326],[323,351],[348,319],[351,272],[339,226]]},
{"frame":3,"contours":[[305,200],[270,233],[263,281],[284,325],[323,351],[350,320],[354,273],[341,226]]},
{"frame":4,"contours":[[306,200],[271,233],[264,280],[284,323],[323,350],[350,320],[354,273],[342,226]]},
{"frame":5,"contours":[[308,200],[274,232],[268,279],[288,323],[327,350],[353,318],[358,271],[345,224]]},
]},
{"target_id":2,"sequence":[
{"frame":14015,"contours":[[275,179],[234,216],[226,275],[253,328],[299,359],[331,322],[335,263],[322,204]]},
{"frame":14016,"contours":[[275,179],[234,216],[226,275],[253,328],[299,359],[331,322],[335,263],[322,204]]},
{"frame":14017,"contours":[[276,179],[235,216],[227,274],[254,328],[298,359],[331,322],[336,264],[323,206]]},
{"frame":14018,"contours":[[276,180],[235,218],[228,276],[257,328],[301,359],[332,321],[336,263],[323,205]]},
{"frame":14019,"contours":[[277,180],[236,218],[229,275],[257,328],[301,358],[331,321],[336,263],[323,206]]},
]},
]
var layerName = "sample";
var start_frame = 9015;
var compItem = app.project.item(1);
var layer = compItem.layers.byName(layerName);
var frameDuration = compItem.frameDuration;
for (var i=0; i < data.length; i++) {
var result = data[i];
layer.Masks.addProperty("Mask");
var newMask = layer.Masks(layer.mask.numProperties);
newMask.name = "Target: " + result.target_id;
for (var j = 0; j < result.sequence.length; j++) {
var frame_data = result.sequence[j];
var frame = frame_data.frame + start_frame;
var ae_shape=[];
var intangents = [];
var outtangents = [];
for(var f=0; f< frame_data.contours.length; f++){
var x=frame_data.contours[f][0];
var y=frame_data.contours[f][1];
ae_shape.push([x,y]);
intangents.push([1,0]);
outtangents.push([-1,0]);
}
var myshape = newMask.property(1).valueAtTime(frame * frameDuration, true);
myshape.vertices=ae_shape;
myshape.inTangents = intangents;
myshape.outTangents = outtangents;
myshape.closed = true;
keyIndex1 = newMask.property(1).addKey(frame * frameDuration);
newMask.property(1).setValueAtTime(frame * frameDuration, myshape);
newMask.rotoBezier = true;
}
}
【再現する手順】
手順1: 下記のコマンド等で10分程度の動画ファイルを作成してご確認ください。
※添付できるファイルサイズに上限があり、事象が発生する動画をそのまま添付することができないためベースとなる動画を添付しています。
FOR /l %%i in (1,1,72) DO (ECHO file sample_movie.mp4 >> "Files.txt")
ffmpeg -f concat -safe 0 -i "Files.txt" -c copy Out.mp4
手順2:After EffectsにOut.mp4の動画を読み込み、レイヤー名が"sample"の調整レイヤーを作成してください。
手順3:After Effects.jsx.txtから.txtの拡張子を取り除いてください。
手順4:After Effectsのファイル > スクリプトからAfter Effects.jsxを読み込ませてください。
【環境情報】
OS:Windows10
メモリー:8GB~29GB
After Effectバージョン:22.0.0 , 22.0.1 , 22.3.0.0
何か追加しますか?