[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:
(1442 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:
(1425 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:
(1382 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]

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
14.02.2022

Zürich, Online
Montag, 14. Feb. 2022, 07.30 - 18.00 Uhr

Word Press / Digitalisierung / Selbständigkeit

Digitalisierung und KMU's in der Schweiz Leistungsfähig im Zeitalter der Digitalisierung Machine Learning Künstliche Intelligenz CRM Change Management Kommunikation im Betrieb Kommunikation digitale Medien Digitale Vertriebsmodelle

Ja

Organisator: B. Isik

Kontaktinformation: B. Isik / Daniela Lovric, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/website-mit-wix-erstellen/

Veranstaltungen
01.03.2022 - 03.03.2022

Online
Dienstag, 01. März 2022, 10.00 Uhr - Donnerstag, 03. März 2022, 11.30 Uhr

Workshop-Reihe

Sie wollen barrierefreie PDF-Dokumente mit möglichst wenig Aufwand erstellen? Mit ein wenig Grundlagenwissen können Sie dies aus InDesign mit axaio MadeToTag erreichen – ohne manuelle Nacharbeit im PDF! In diesem 3-teiligen, interaktiven Workshop, den wir vom 1. – 3. März 2022 organisieren, lernen die Teilnehmenden, wie sie zielführend beim Erstellen von barrierefreien PDF-Dokumenten aus Adobe InDesign vorgehen. Dafür wird zu Beginn vermittelt, was ein barrierefreies PDF ist, und welche Anforderungen an solche Dokumente bestehen. Mit diesem Wissen werden, anhand von Best-Practice-Beispielen, Strategien zum effizienten Erstellen von PDF/UA-konformen Dokumenten und Formularen mit Adobe InDesign und axaio MadeToTag gezeigt. Außerdem werden Lösungen für klassische Probleme vermittelt. Die Teilnehmenden erhalten im Vorfeld eine Liste der notwendigen Software, wie auch vorbereitete Workshop-Daten, an denen alle im Workshop unter Anleitung arbeiten. Während des Workshops haben die Teilnehmenden die Möglichkeit, Fragen zu stellen.

Die Webinar-Serie besteht aus drei Teilen, an drei verschiedenen Terminen, die aufeinander aufbauen: 1.-3. März 2022, jeweils von 10.00-11.30 Uhr, mit anschliessender 20-minütiger Diskussionsrunde.
Teilnahmegebühr: 89,- EUR (zzgl. MwSt).

Ja

Organisator: axaio software

Kontaktinformation: Karina Zander, E-Mailk.zander AT axaio DOT com

https://www.axaio.com/doku.php/de:news:interaktive-webinar-serie

Barrierefreie PDF-Dokumente erstellen mit Adobe InDesign & axaio MadeToTag