Dark-chyper
Messages postés6Date d'inscriptionsamedi 3 janvier 2009StatutMembreDernière intervention20 décembre 2013
-
18 déc. 2013 à 18:07
Whismeril
Messages postés18599Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 septembre 2023
-
20 déc. 2013 à 18:45
Bonjour,
je suis en train de finaliser un script c# pour le logiciel de montage vidéo vegas pro.
Le but de ce script est de rassembler l'ensemble des fichiers d'un projet, qui peuvent être sur différentes sources, en un seul et même endroit comme suit :
dossier_du_projet>dossier_medias>mes_medias
>fichier du projet
Les étapes du scripts sont :
_définition de l'emplacement de sauvegarde (avec moul vérifications)
_supressions des médias non utilisé dans le projet
_copies de tous les médias dans le dossier des médias
_remplacement des médias copiés (avec le nouveau chemin d'acces)
Le script fonctionne très bien sauf pour la réimportation des séquences d'images ( le cas assez complexe).
voici le code :
using System; using System.Collections.Generic; using System.Net; using System.Net.Mail; using System.IO; using System.Diagnostics; using System.Drawing; using System.Security; using System.Security.Permissions; using System.Text; using System.Windows.Forms; using Sony.Vegas;
public class EntryPoint { static Vegas myVegas;
//declaration des variables boite de dialogue String dirToCopy = "D:\\test"; // the directory to copy files bool waste = false; // delete unuse files from the bin ? bool okToGo = false;
double frameRate = 25;
TextBox copyDirBox = new TextBox(); Button browseButton = new Button(); Button okButton = new Button(); Button cancelButton = new Button(); CheckBox eraseCheck = new CheckBox();
//variables pour le move String CurrentProjectName = "";
static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection(); public List<FicheMedia> mediaPool = new List<FicheMedia>();
public class FicheMedia { public readonly bool isSequence = false; public readonly String oldPath = null; public readonly String newPath = null; public readonly int nbrFrame = 0; public readonly String first = null; public readonly String extension = null; public readonly String epure = null;
public FicheMedia(bool a, String b, String c, int d,String e, String f,String g) { this.isSequence = a; this.oldPath = b; this.newPath = c; this.nbrFrame = d; this.first = e; this.extension = f; this.epure = g; } }
// script start public void FromVegas(Vegas vegas) { myVegas = vegas; int numberOfMedia = myVegas.Project.MediaPool.Count; int numberOfErase = 0;
//dialog box do { if (DialogResult.OK != DoDialog()) { return; } } while (!okToGo);
} else { MessageBox.Show("No media to move, script break!"); } } //dialog to specify folder and options DialogResult DoDialog() { Form form = new Form(); form.AutoScaleMode = AutoScaleMode.Font; form.AutoScaleDimensions = new SizeF(6F, 6F); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterParent; form.MaximizeBox = false; form.MinimizeBox = false; form.HelpButton = false; form.ShowInTaskbar = false; form.Text = "Rassembler les fichiers"; form.AutoSize = true; form.AutoSizeMode = AutoSizeMode.GrowAndShrink;
//Select folder GroupBox groupBox1 = new GroupBox(); groupBox1.Text = "Select a folder to save files in bin"; groupBox1.Location = new System.Drawing.Point(13, 12); groupBox1.Size = new System.Drawing.Size(450, 46); groupBox1.TabIndex = 0; groupBox1.TabStop = false;
//activate the browse button browseButton.Click += HandleBrowseoutputDir;
DialogResult result = form.ShowDialog(myVegas.MainWindow); result = VerifDialog(result, form); dirToCopy = copyDirBox.Text; if (!dirToCopy.Trim().EndsWith(@"\")) { dirToCopy += "\\"; } return result;
} //action du bouton browse void HandleBrowseoutputDir(Object sender, EventArgs args) { string newDir = null; myVegas.FileUtilities.SelectDirectoryDlg(myVegas.MainWindow.Handle, "Output Folder", copyDirBox.Text, true, out newDir); if (!String.IsNullOrEmpty(newDir)) { copyDirBox.Text = newDir; } }
DialogResult VerifDialog(DialogResult result, Form form) { do { if (DialogResult.OK == result) { if (!String.IsNullOrEmpty(copyDirBox.Text)) { FileIOPermission f = new FileIOPermission(FileIOPermissionAccess.Read | FileIOPermissionAccess.Write, copyDirBox.Text); try { f.Demand(); // try to get the read & write permissions of the folder } catch (SecurityException s) { Console.WriteLine(s.Message); MessageBox.Show(s.Message + "\nChoose another folder, please !"); result = form.ShowDialog(myVegas.MainWindow); result = VerifDialog(result, form); } //if script is here, we can read and write the folder so continue if (!Directory.Exists(copyDirBox.Text)) { try { System.IO.Directory.CreateDirectory(copyDirBox.Text);// try to create the folder } catch (UnauthorizedAccessException e) { log.Add(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); } }
if (eraseCheck.Checked) { waste = true; } okToGo = true;
} else // if copyDirBox.Text is Null or Empty { MessageBox.Show("Select a folder to save files, please!"); result = form.ShowDialog(myVegas.MainWindow); result = VerifDialog(result, form); } } } while (!okToGo); return result; }
int EraseWithProgress(int numberOfErase, int numberOfMedia) { String[] tablePath = new String[numberOfMedia]; int count = 0; foreach (Media media in myVegas.Project.MediaPool) { if (media.UseCount == 0) { tablePath[count] = media.FilePath; count++; } } foreach (String filename in tablePath) { if (!string.IsNullOrEmpty(filename)) { try { myVegas.Project.MediaPool.Remove(filename); numberOfErase += 1; } catch (UnauthorizedAccessException e) { log.Add(e.Message); MessageBox.Show(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); MessageBox.Show(e.Message); } } } return numberOfErase; }
void MoveMedia(int numberOfMedia, int numberOfErase) { String fullNewPath = dirToCopy + "Medias\\"; if (!Directory.Exists(fullNewPath)) { System.IO.Directory.CreateDirectory(fullNewPath); } String affichage = ""; int nombre = 0; foreach (Media media in myVegas.Project.MediaPool) { affichage += nombre + ". "+ media.KeyString; if (media.IsImageSequence()) { affichage += " TRUE !"; } affichage += "\n\n"; nombre++; } affichage += "-------------------------------------------\n\n";
foreach (Media media in myVegas.Project.MediaPool) { if (media.IsImageSequence()) { String[] sequence = GetInfoSequence(media); // sequence[0] = first | full name of the first frame // 1 = pathName | the directory path where the original image sequence is located // 2 = nbrZero | number of numbers in the increment of the image sequence // 3 = nbreFrame | number of frame // 4 = epure | the name of the sequence without numbers and extension // 5 = numberStart | number of the first frame (cg 0001) // 6 = extension | the extension of files // 7 = tab[tab.Length - 2 ] | the name of the directory where original image sequence is located // ######################################################################################################## //MessageBox.Show(sequence[0]+"\n\n"+sequence[1]+"\n\n"+sequence[2]+"\n\n"+sequence[3]+"\n\n"+sequence[4]+"\n\n"+sequence[5]+"\n\n"+sequence[6]+"\n\n"+sequence[7]); System.IO.Directory.CreateDirectory(fullNewPath + sequence[7]); int j = Convert.ToInt32(sequence[5]); do { try { System.IO.File.Copy(sequence[1] + sequence[4] + j.ToString().PadLeft(Convert.ToInt32(sequence[2]), '0') + "." + sequence[6], fullNewPath + sequence[7] + "\\" + sequence[4] + j.ToString().PadLeft(Convert.ToInt32(sequence[2]), '0') + "." + sequence[6], true); } catch (UnauthorizedAccessException e) { log.Add(e.Message); MessageBox.Show(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); MessageBox.Show(e.Message); } j++; } while (j != Convert.ToInt32(sequence[3]));
FicheMedia fiche = new FicheMedia(true, sequence[1], fullNewPath + sequence[7] + "\\", Convert.ToInt32(sequence[3]),sequence[0],sequence[6],sequence[4]); mediaPool.Add(fiche);//saving String[] int the list mediaPool } else //if this is not an image sequence { String[] tab = media.FilePath.Split('\\'); String fileName = tab[tab.Length - 1]; String oldMedia = media.FilePath.ToString(); System.IO.File.Copy(media.FilePath.ToString(), fullNewPath + fileName, true); FicheMedia fiche = new FicheMedia(false, oldMedia, fullNewPath + fileName, 0,null,null,null); mediaPool.Add(fiche); } } foreach (FicheMedia fiche in mediaPool) { MessageBox.Show(affichage + "==> " + fiche.oldPath + fiche.first + "\n\n" + fiche.newPath+" "+fiche.nbrFrame+" "+fiche.isSequence); Media currentMedia = myVegas.Project.MediaPool.Find(fiche.oldPath+fiche.first); if (!fiche.isSequence) { try { currentMedia.ReplaceWith(myVegas.Project.MediaPool.AddMedia(fiche.newPath)); } catch (UnauthorizedAccessException e) { log.Add(e.Message); MessageBox.Show(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); MessageBox.Show(e.Message); } } else { string searchPattern = fiche.epure+"*." + fiche.extension; System.IO.FileInfo[] files = null; System.IO.DirectoryInfo theRoot = new System.IO.DirectoryInfo(fiche.newPath);//on se place dans le dossier du media a verifier try { files = theRoot.GetFiles(searchPattern, SearchOption.TopDirectoryOnly);//on obtient les fichiers du dossiers correspondant au pattern } catch (UnauthorizedAccessException e) { log.Add(e.Message); MessageBox.Show(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); MessageBox.Show(e.Message); } try { currentMedia.ReplaceWith(myVegas.Project.MediaPool.AddImageSequence(fiche.newPath+fiche.first, fiche.nbrFrame, frameRate)); myVegas.Project.MediaPool.RemoveUnusedMedia(); } catch (UnauthorizedAccessException e) { log.Add(e.Message); } catch (System.IO.DirectoryNotFoundException e) { Console.WriteLine(e.Message); }
String first = firstName[0]; // name of the first frame String[] path = media.FilePath.Split('\\'); String pathName = ""; // path to the first frame
int a = 0; do { pathName += path[a] + "\\"; a++; } while (a != path.Length - 1);
int nbrZero = Convert.ToInt32(thesplit[2].Split(']')[0]); // the number of numbers to the sequence : name_###.ext => 3 int nbreFrame = Convert.ToInt32(thesplit[1].Split(']')[0]); // number of frame of the sequence String[] destruct = first.Split('.'); String extension = destruct[destruct.Length - 1]; String epure = ""; if (destruct.Length >= 3)//in case of severals '.' in the name { for(int i = 0; i == destruct.Length; i++) { epure += destruct[i]; } } else { epure = destruct[0]; }//whithout any '.' than the '.' of the extension int numberStart = Convert.ToInt32(epure.Substring(epure.Length - nbrZero, nbrZero));//the substring delete the begining of the name (epure) to get only the number epure = epure.Substring(0, epure.Length - nbrZero);
Dark-chyper
Messages postés6Date d'inscriptionsamedi 3 janvier 2009StatutMembreDernière intervention20 décembre 2013 20 déc. 2013 à 10:44
Effectivement, ca fait un gros pavé à lire, je vais essayer de réduire cela.
Mon Problème se situe ici :
currentMedia.ReplaceWith(myVegas.Project.MediaPool.AddImageSequence(fiche.newPath+fiche.first, fiche.nbrFrame, frameRate));
// AddImageSequence importe dans le chutier la séquence d'image
// comme un seul et même média;
// AddImageSequence(string path, int imageCount, double fps)
// ReplaceWith remplace les occurences du média dans la
// Timeline par un autre media
// dans mon cas currentMedia sera remplacé par ce qui arrive du AddImageSequence()
currentMedia se difinit comme suit :
Media currentMedia = myVegas.Project.MediaPool.Find(fiche.oldPath+fiche.first);
fiche se définit comme suit :
FicheMedia fiche = new FicheMedia(bool isSequence, String oldPath, String newPath, int nbrFrame,String first,String extension,String epure);
// isSequence => pour savoir si on a une sequence d'images;
// oldPath => contient le chemin d'acces de l'emplacement d'origine du fichier;
// newPath => contient le chemin d'acces du fichier copié;
// nbrFrame => le nombre d'image dans la séquence d'image;
// first => le nom de la 1ere image de la sequence;
// extension => l'extension des fichiers de la sequence;
// epure => le nom de la 1ere image sans la sequence de chiffre et sans l'extension;
lors du traitement pour enregistrer les informations relatives à la séquence d'image, il restait un espace à la fin de la chaine de caractère "first".
Maintenaint le soucis se porte sur :
currentMedia.ReplaceWith();
Le fichier que j'essaye de remplacer existe et a été importé, mais le script me renvoie :
System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un objet.
à EntryPoint.MoveMedia(Int32 numberOfMedia, Int32 numberOfErase)
à EntryPoint.FromVegas(Vegas vegas)
--- Fin de la trace de la pile d'exception interne ---
à System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
à Sony.Vegas.ScriptHost.ScriptManager.Run(Assembly asm, String className, String methodName)
à Sony.Vegas.ScriptHost.RunScript(Boolean fCompileOnly)
Dark-chyper
Messages postés6Date d'inscriptionsamedi 3 janvier 2009StatutMembreDernière intervention20 décembre 2013 20 déc. 2013 à 16:55
Problème résolu !
Pour définir l'instance de l'objet "Média" d'une séquence d'images, le chemin d'accès doit faire référence à la 1ere et à la dernière image de la séquence d'image sinon le "Media" n'est pas trouvé dans le chutier.
Media oldMedia = myVegas.Project.MediaPool.Find(fiche.filePath);
try
{
Media currentMedia = myVegas.Project.MediaPool.AddImageSequence(fiche.newPath + fiche.name, fiche.nbrFrame, frameRate);
oldMedia.ReplaceWith(currentMedia);
}
//filePath faisant alors référence à quelque chose comme :
// "D:\mon_chemin_d_acces\maSequenceDImages000.png - maSequenceDImages010.png"
Whismeril
Messages postés18599Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 septembre 2023629 19 déc. 2013 à 14:58
Bonjour,
ne pas perdre de vue que les "répondeurs" sont bénévoles.
Il faudrait que tu cibles un peu le soucis, on ne va pas forcément (en tout ca pas moi) se donner le temps de lire, interpréter, comprendre ton programme entier.
Synthétise en décrivant le contenue et le but de chaque variable dans la partie ou tu situes le problème.