Dear all! For scripting exercise I wrote a script that finds all consecutive frames in selected comp that have the same color, pushes its frame numbers in array called "match", and then extracts only first and last frame of each group of consecutive frames in array called "markers". ( Example: array "match" = 3,4,5,6,12,13,14,15,16,25,26,27,28; array "markers" = 3,6,12,16,25,28 ) In the end, the script adds markers on each frame from markers array. I used sampleImage expression which I add to text layer via script, use expression output (through text source) and continue working with values saved in array. For every frame I use 5 points scatered around frame to check for RGB values and if they all match, script pushes frame number to array. Script works fine, but I'm wondering if there is more elegant way to solve this problem. Are the arrays the way to go? Also, it would be nice if I could rewrite some code to make script faster. I notice that script execution is slower the more sampling points I add (more text layers with samplePoint expression applied). Or maybe the process of comparsion takes longer with more points. Anyway, if you have advice on better solution (faster script execution) I'd be grateful. Thanks! Here is the code: var actItem = app.project.activeItem; var frames = actItem.duration*25; var point = new Array(); var samples = new Array(); samples = [ [500, 250],[500, 750],[1500, 250],[1500, 750],[960, 540] ]; actItem.time=1/25; var match = new Array(); var currTime; var txtPoints = new Array(); var markers = new Array; // ADD TXT LAYERS AND ADD 'SAMPLE IMAGE' EXPRESSION TO THEM for(i=1; i <=5; i++){ txtPoints[i-1] = app.project.activeItem.layers.addText("point"+i); txtPoints[i-1].position.setValue([samples[i-1][0],samples[i-1][1],0]); var exp = 'targetLayer = thisComp.layer(thisLayer.index+'+i+');'+ '\n samplePoint = ['+ samples[i-1].toString() +']' + ';' + '\n sampleRadius = [1,1];' + '\n sampledColor_8bpc = 255 * targetLayer.sampleImage(samplePoint, sampleRadius);' + '\n R = Math.round(sampledColor_8bpc[0]);' + '\n G = Math.round(sampledColor_8bpc[1]);' + '\n B = Math.round(sampledColor_8bpc[2]);' + '\n A = Math.round(sampledColor_8bpc[3]);' + '\n outputString = R+ "," +G+ "," +B;' txtPoints[i-1].text.sourceText.expression = exp; } // CHECK IF POINT VALUES MATCH FOR EVERY COMP FRAME and add to array MATCH for (var j=1; j < frames; j++) { actItem.time=j/25; if (txtPoints[0].text.sourceText.value.toString() == txtPoints[1].text.sourceText.value.toString() && txtPoints[1].text.sourceText.value.toString() == txtPoints[2].text.sourceText.value.toString() && txtPoints[2].text.sourceText.value.toString() == txtPoints[3].text.sourceText.value.toString() && txtPoints[3].text.sourceText.value.toString() == txtPoints[4].text.sourceText.value.toString()){ currTime = actItem.time/0.04; match.push(Number(currTime)); $.writeln("Graphics frame: " + actItem.time/0.04); } else { $.writeln("Video frame: " + actItem.time/0.04); } } // CREATE ARRAY MARKERS WITH IN/OUT FRAMES inOutFrames(match, markers); // REMOVE TXT LAYERS for (var l=0; l<5; l++){ var currItem = txtPoints ; currItem.remove(); } // ADD MARKERS for(i=0; i < markers.length; i++){ var myMarker = new MarkerValue("GRAFIKA"); actItem.layer(1).property("Marker").setValueAtTime(markers*0.04, myMarker); } // CREATE ARRAY MARKERS WITH IN/OUT FRAMES - FUNCT function inOutFrames(oldArr, newArr){ var length = Number(oldArr.length); newArr.push(oldArr[0]); for(i=0; i < length; i++){ if (oldArr[i+1] - oldArr > 1){ newArr.push(oldArr); newArr.push(oldArr[i+1]); } } newArr.push(oldArr[length-1]); }
... View more