[GastForen Programmierung/Entwicklung JavaScript Automatisierung mit Premiere / Auslesen der Länge des Videos.

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Automatisierung mit Premiere / Auslesen der Länge des Videos.

msassanelli
Beiträge gesamt: 12

15. Nov 2021, 14:26
Beitrag # 1 von 3
Bewertung:
(4845 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hey,

ich arbeite aktuell an einer Premiere Automatisierung und hoffe hier evtl. Hilfe zu bekommen.

Ich arbeite mit einer .CSV um Videos zu importieren, die dann im Ordner "Clips" platziert werden und daraufhin durch platzieren im Ordner "Subclips" zu einer Sequenz zusammen geschnitten werden. Daraufhin wird die erzeugt Sequenz an den Media Encoder weitergeleitet und das nächste Video/die nächste Zeile der .CSV wird bearbeitet.

Mein Problem aktuell ist, dass ich die Länge der einzelnen Videos benötige. Der Premiere Scripting Guide liefert hier zu bereits eine Funktion die bei mir nur teilsweise funktioniert.

Die Funktion ist folgende:

Code
var activeSeq = app.project.activeSequence; 
var durationIntro = activeSeq.videoTracks[0].clips[intro].duration.seconds;
var durationThema = activeSeq.videoTracks[0].clips[thema].duration.seconds;



Warum auch immer funktioniert es nur manchmal und wenn dann auch nur für die 1. Zeile der CSV, alle folgenden Zeilen behalten den ausgelesenen Wert der 1.Zeile.


Ich wäre natüürlich auch offen für eine Premiere freie Lösung, wodurch die Länge der Videos im einzelnen durch einem reinem JS Script ausgelesen wird.

Jedoch haben meine bisherigen Versuche zu nichts geführt.


Beispiel bzgl. Länge der Videos:

1.Video 20s
2.Video 30s
3.Video: 10s
4. Video: 15s

Die CSV ist wie folgt aufgebaut:
Dateiname_introvideo1;Dateiname_themavideo1;Dateipfad zu introvideo1;Dateipfad zu themavideo1;


Hier ist meine CSV
Code
Chen_intro_1;Thema 1;/Users/mac_nonprint/Desktop/PR-Automatisierung/Videos/Chen_intro_1.mp4;/Users/mac_nonprint/Desktop/PR-Automatisierung/Videos/Thema 1.mp4; 
Sassanelli_intro_1;Thema 2;/Users/mac_nonprint/Desktop/PR-Automatisierung/Videos/Sassanelli_intro_2.mp4;/Users/mac_nonprint/Desktop/PR-Automatisierung/Videos/Thema 2.mp4;
Wosilat_intro_1;Thema 3;/Users/mac_nonprint/Desktop/PR-Automatisierung/Videos/Wosilat_intro_1.mp4;/Users/mac_nonprint/Desktop/PR-Automatisierung/Videos/Thema 3.mp4;



Hier ist meine Gesamte JS:

Code
var csvFile = "/Users/mac_nonprint/Desktop/PR-Automatisierung/CSV/haefele_video_liste1.csv"; // PROMPT FOR CSV FILE 

var importCount = 0;
var subCounter = 0;
var clipCounter = 0;
var bufferTime = 0; // HOW MUCH TIME (IN SECONDS) BETWEEN CLIPS WHEN PLACED IN TIMELINE

var infoArray;


// Following opens the text file and stores it in var CSVFILE. Then splits it by every new line, and COMA into a multi-tiered array, INFOARRAY.
if(csvFile){
var file = File(csvFile) //OPEN, READ, AND CLOSE THE CSV FILE
file.open("r");
var fullText = file.read();
file.close();
infoArray = fullText.split("\n"); // SPLIT THE CSV FILE AT EVERY NEW LINE
}

if(infoArray[infoArray.length -1] == ""){ //SOMETIMES WHEN SPLITTING UP THE ARRAY, THE PROCESS CREATES AN EXTRA, EMPTY LINE. tHIS WILL JUST TEST AND REMOVE THAT IF IT HAPPENS
infoArray.splice(infoArray.length-1, 1)
}


// IMPORTARY TO LOAD FILES. THIS IS WHERE YOU ADJUST FILEPATHS IF YOU NEED TO
var importAry1 = [];

// LOOP THROUGH INFOARRAY

if (infoArray){

for (var i = 0; i < infoArray.length; i++ ) { // START WITH i AS 1 BECAUSE THE FIRST LINE OF OUR CSV IS HEADERS

infoArray[i] = infoArray[i].split(";");

// Sequenz
var sequenzName = (importCount + 1 + "-") + infoArray[i][0] + "_" + infoArray[i][1];
var sequenzPreset = "/Users/mac_nonprint/Documents/Adobe/Premiere\ Pro/22.0/Profile-mac_nonprint/Settings/Benutzerdefiniert/Test_Import_Settings.sqpreset";
app.project.newSequence(sequenzName, sequenzPreset); // CREATE A NEW SEQUENCE
app.project.rootItem.createBin(sequenzName + " - Clips"); // CREATE BIN FOR ORGANIZATION
var importBin = findBinIndex(app.project.rootItem,sequenzName + " - Clips"); // STORE THE INDEX PATH TO THAT BIN


// Import Intro & Thema File into importBin
importAry1[0] = infoArray[i][2];
app.project.importFiles(importAry1,1,importBin,0);
importAry1[0] = infoArray[i][3];
app.project.importFiles(importAry1,1,importBin,0);
importCount++;


var intro = 0;
var thema = 1;

for (var a = 0; a < importBin.children.numItems; a++ ){ // LOOP THROUGH THE IMPORT BIN
if( importBin.children[intro].name.indexOf(" - ")==-1){
importBin.children[intro].name = "1" + " - " + importBin.children[intro].name; // RENAME WITH A THE NUMBER IT WAS IMPORTED, THIS HOLDS THE ORDER OF THE CSV
infoArray[i][infoArray[i].length] = importBin.children[intro].intro; // STORE THE ITEMS NODEID IN THE CSV ARRAY
}
if( importBin.children[thema].name.indexOf(" - ")==-1){
importBin.children[thema].name = "2" + " - " + importBin.children[thema].name;
infoArray[i][infoArray[i].length] = importBin.children[thema].thema;
}
}

app.project.rootItem.createBin(sequenzName + " - Subclips"); // CREATE BIN FOR ORGANIZATION
var moveTo = findBinIndex(app.project.rootItem,sequenzName + " - Subclips");

for( a = 0; a < app.project.sequences.numSequences; a++ ){ // LOOP THROUGH ALL SEQS
if(app.project.sequences[a].name==sequenzName){ // FIND OUR CREATED SEQUENCE
app.project.activeSequence = app.project.sequences[a]; // SET THE SEQUENCE TO BE OUR ACTIVE SEQ
}
}




var anzahlClips = importBin.children.length;

// LOOP THROUGH OUR IMPORTED CLIPS TO CREATE THE EDITED SUBCLIPS.
for( var r = 0; r < 1; r++ ){

var activeSeq = app.project.activeSequence;
var durationIntro = activeSeq.videoTracks[0].clips[intro].duration.seconds;
var durationThema = activeSeq.videoTracks[0].clips[thema].duration.seconds;

// var durationIntro = parseInt(activeSeq.videoTracks[0].clips[intro].duration.seconds);
// var durationThema = parseInt(activeSeq.videoTracks[0].clips[thema].duration.seconds);

if(importBin.children[intro]) {
var currentItem = importBin.children[intro];
if(currentItem.intro == infoArray[i][ infoArray[i].length-1 ]) {

// var durationIntro = parseInt(infoArray[i][4]);
// var durationIntro = parseInt(activeSeq.videoTracks[0].clips[intro].duration.seconds);

var in1 = 0;
var out1 = durationIntro;

// GATHER TIMECODE INFORMATION INTO A FLAT SECONDS NUMBER
var inPoint = in1;
var outPoint = out1;

// CREATE THE SUBCLIPS ( NAME , IN , OUT , BOUNDARIES (BINARY) , TAKE VIDEO , TAKE AUDIO)
var newSub = currentItem.createSubClip(currentItem.name, inPoint , outPoint , 0 , 1 , 1 );
newSub.moveBin(moveTo); // MOVE INTO THE SUBCLIPS BIN
placeClip(activeSeq, newSub , bufferTime);
// alert('Intro platziert!');
}
r++; }

if(importBin.children[thema]) {
var currentItem = importBin.children[thema];
if(currentItem.thema == infoArray[i][ infoArray[i].length-1 ]) {

// var durationThema = parseInt(infoArray[i][5]);
// var durationThema = parseInt(activeSeq.videoTracks[0].clips[thema].duration.seconds);

var in2 = 0;
var out2 = durationThema;

// GATHER TIMECODE INFORMATION INTO A FLAT SECONDS NUMBER
var inPoint = in2;
var outPoint = out2;

// CREATE THE SUBCLIPS ( NAME , IN , OUT , BOUNDARIES (BINARY) , TAKE VIDEO , TAKE AUDIO)
var newSub = currentItem.createSubClip(currentItem.name, inPoint , outPoint , 0 , 1 , 1 );
newSub.moveBin(moveTo); // MOVE INTO THE SUBCLIPS BIN
placeClip(activeSeq, newSub , bufferTime);
// alert('Thema platziert!');
}
}
}

// Sequenz Übergabe an Media Encoder
var project = app.project;
var sequence = project.activeSequence;

// app.encoder.launchEncoder();
$.writeln(sequence.name);

var rootPath = "/Users/mac_nonprint/";
var Dateiname = rootPath + "Desktop/PR-Automatisierung/render/" + sequenzName + ".mp4";
var exportPreset = rootPath + "Documents/Adobe/Adobe\ Media\ Encoder/22.0/Presets/Test\ Vorgabe.epr";

app.encoder.encodeSequence(sequence, Dateiname, exportPreset, 0, true);
// app.encoder.startBatch();

if ((durationIntro < 1) && (durationThema < 1)) {
var durationIntro = '';
var durationThema = '';
}

/* project.rootItem.children[0].deleteBin()
project.rootItem.children[0].deleteBin()
project.rootItem.children[0].deleteBin()
project.rootItem.children[0].deleteBin()
project.rootItem.children[0].deleteBin()
project.rootItem.children[0].deleteBin()
project.rootItem.children[1].deleteBin()
project.deleteSequence(sequence); */
}

// alert(numItems);
}

// FUNCTION LIST
function findBinIndex(currentItem, nameToFind){
if(nameToFind){
for (var j = 0; j < currentItem.children.numItems; j++){
var currentChild = currentItem.children[j];

if (currentChild.type == ProjectItemType.BIN && currentChild.name.toUpperCase() == nameToFind.toUpperCase() ){
globalBind = currentChild;
return currentChild;
}

if (currentChild.type == ProjectItemType.BIN){
findBinIndex(currentChild, nameToFind);
}
}

} else {
alert("No bin was targeted");
}
}
function timecodeToSeconds(arrayObject){
var timeCodeArray = [];
timeCodeArray = arrayObject.split(":");
var timeCode = (Number(timeCodeArray[0])*60) + Number((timeCodeArray[1]));
return timeCode;
}
function placeClip(activeSeq , subClip , buffer){
subClip.setScaleToFrameSize();// SET SCALE TO FRAME SIZE

if(activeSeq.videoTracks[0].clips.numItems == 0){ // IF THERE ARE NOT CLIPS IN THE SEQUENCE, PLACE FRIST CLIP AT TIME ZERO
activeSeq.videoTracks[0].insertClip(subClip,0)
//clipCounter++;
} else { // IF THERE ARE CLIPS IN THE SEQUENCE, PLACE AT THE TIMECODE OF END OF THE LAS CLIP + THE BUFFER TIME
var numClips = activeSeq.videoTracks[0].clips.numItems;
var insertTime = activeSeq.videoTracks[0].clips[numClips - 1].end.seconds + buffer;
activeSeq.videoTracks[0].insertClip(subClip,insertTime);
//clipCounter++;
}
}

X

Automatisierung mit Premiere / Auslesen der Länge des Videos.

msassanelli
Beiträge gesamt: 12

15. Nov 2021, 14:58
Beitrag # 2 von 3
Beitrag ID: #581729
Bewertung:
(4828 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe zwar hier was gefunden aber irgendwie bekomme ich es nicht zum laufen.

https://www.npmjs.com/package/get-video-duration

Node.js hat hier ein Paket für das auslesen. Bei mir wird jedenfalls immer require ist nicht defined angezeigt.


als Antwort auf: [#581728]

Automatisierung mit Premiere / Auslesen der Länge des Videos.

msassanelli
Beiträge gesamt: 12

15. Nov 2021, 16:27
Beitrag # 3 von 3
Beitrag ID: #581732
Bewertung:
(4785 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Okay ich bin selbst auf die Antwort gekommen.

Die Lösung war folgende Zeile:
Hier mit konnte ich den OutPoint des ProjectItem direkt auslesen.
Code
var durationIntro = parseInt(importBin.children[intro].getOutPoint(1).seconds); 
var durationThema = parseInt(importBin.children[thema].getOutPoint(1).seconds);



als Antwort auf: [#581729]