Can anyone help me with a recent scripting issue I encountered with the new Vegas Pro 21 Build 314?
I get this error message.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at ScriptPortal.Vegas.Media..ctor(Project project, PlugInNode generator, String presetName)
at ImportSRTasTextEvents.EntryPoint.AddTextEvent(Vegas vegas, Track myNewTrack, Timecode myEvStart, Timecode myEvLength, String myText)
at ImportSRTasTextEvents.EntryPoint.FromVegas(Vegas vegas)
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at ScriptPortal.Vegas.ScriptHost.ScriptManager.Run(Assembly asm, String className, String methodName)
at ScriptPortal.Vegas.ScriptHost.RunScript(Boolean fCompileOnly)
This is the script where the error message appears. Is a script that was made to import .srt files as quantized or non-quantized text events into the Vegas timeline. This script works fine in all previous versions of Vegas Pro, including version 21 Build 300. I don't know what changed in Vegas 21 Build 314 that causes this problem in the script. Any help to resolve this issue is welcome.
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using ScriptPortal.Vegas;
namespace ImportSRTasTextEvents
{
public class SrtInfo
{
private Timecode startTime;
private Timecode endTime;
private List<string> subs;
public Timecode getStartTime()
{
return startTime;
}
public Timecode getEndTime()
{
return endTime;
}
public Timecode getEndMinusStartTime()
{
return (endTime - startTime);
}
public string getText()
{
string s = "";
int i;
for (i = 0; i < subs.Count; ++i)
{
s += subs[i];
if (i != subs.Count - 1)
s += "\r\n";
}
return s;
}
public SrtInfo(List<string> input)
{
string[] timeStrings = input[1].Split(((string)" ").ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
startTime = new Timecode(timeStrings[0]);
endTime = new Timecode(timeStrings[2]);
subs = new List<string>();
for (int subtitles = 2; subtitles < input.Count; ++subtitles)
{
subs.Add(input[subtitles]);
}
}
}
public class EntryPoint
{
Vegas myVegas;
RulerFormat OrgRulerFormat;
public void FromVegas(Vegas vegas)
{
myVegas = vegas;
OrgRulerFormat = myVegas.Project.Ruler.Format;
myVegas.Project.Ruler.Format = RulerFormat.Time;
myVegas.UpdateUI();
vegas.UnloadScriptDomainOnScriptExit = true;
Project proj = vegas.Project;
List<SrtInfo> subs = new List<SrtInfo>();
string s = "";
int currentLineIndex = 0;
//load all the lines from the *.srt to a linked list
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.CheckFileExists = true;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
// read in the file
List<string> inputStrings = new List<string>();
using (StreamReader sr = new StreamReader(fileDialog.FileName, Encoding.UTF8))
{
try
{
bool isNotEmptySubtitle = false;
while ((s = sr.ReadLine()) != null)
{
currentLineIndex++;
if (s.Length != 0)
{
inputStrings.Add(s);
isNotEmptySubtitle = true;
}
else if (inputStrings.Count > 1)
{
subs.Add(new SrtInfo(inputStrings));
inputStrings.Clear();
isNotEmptySubtitle = false;
}
}
if (isNotEmptySubtitle && inputStrings.Count > 1)
{
subs.Add(new SrtInfo(inputStrings));
}
}
catch (Exception e)
{
CustomMessageBox.Show(String.Format("Error reading the file. Maybe an invalid *.srt file. Error occurred at line: {0}\r\nError message: {1}\r\nDetailed error message for debugging: {2}", currentLineIndex, e.Message, e.ToString()), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
CustomMessageBox.Show(String.Format("There has been an error while importing the subtitles. The subtitles and their timings may not be loaded correctly. Look it up, what could be the problem in your *.srt file around line {0}.\r\nFor example too many empty lines or the timecode format is wrong.", currentLineIndex), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// Ask user if they want to quantize text events
DialogResult quantizeResult = MessageBox.Show("Do You Want Quantize Text Events to Frames?", "Quantize Text Events", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
//a new Track with TrackEvents
myVegas.Project.Ruler.Format = OrgRulerFormat;
VideoTrack track = new VideoTrack();
proj.Tracks.Add(track);
foreach (SrtInfo x in subs)
{
try
{
if (x.getStartTime().ToMilliseconds() == x.getEndTime().ToMilliseconds())
{
throw new Exception(String.Format("Error! Some subtitles have the same timecodes for the times they should appear and disappear. Check the subtitle at {0} -> {1}, because it may not have been loaded at the correct timecode!\r\nAlso, it may have loaded as a Marker instead of a Region.", x.getStartTime().ToString(), x.getEndTime().ToString()));
}
}
catch (Exception e)
{
CustomMessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (quantizeResult == DialogResult.Yes)
{
AddTextEventQuantized(myVegas, track, x.getStartTime(), x.getEndMinusStartTime(), x.getText());
}
else
{
AddTextEvent(myVegas, track, x.getStartTime(), x.getEndMinusStartTime(), x.getText());
}
}
// Aqui é onde você pode adicionar a mensagem de conclusão do processo
//CustomMessageBox.Show("Subtitles Imported Successfully!", "Message!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
void AddTextEvent(Vegas vegas, Track myNewTrack, Timecode myEvStart, Timecode myEvLength, string myText)
{
// Set Titles & Text for VEGAS Pro 17 or Higher
string genUID = "{Svfx:com.vegascreativesoftware:titlesandtext}"; //VEGAS Titles & Text
// Set Titles & Text for VEGAS Pro 14-16
if (myVegas.Version.Contains("14") || myVegas.Version.Contains("15") || myVegas.Version.Contains("16"))
{ genUID = "{Svfx:com.sonycreativesoftware:titlesandtext}"; } //Sony Titles & Text
// find the text generator plug-in
//MessageBox.Show(vegas.Generators.GetChildByName("VEGAS Titles & Text").ToString());
PlugInNode plugIn = null;
plugIn = myVegas.Generators.GetChildByUniqueID(genUID);
Media media = new Media(plugIn);
MediaStream stream = media.Streams.GetItemByMediaType(MediaType.Video, 0);
//VideoEvent newEvent = new VideoEvent(myVegas.Transport.CursorPosition, Timecode.FromSeconds(15)); //15 seconds long !!!
VideoEvent newEvent = new VideoEvent((myVegas.Transport.CursorPosition + myEvStart), myEvLength);
myNewTrack.Events.Add(newEvent);
Take take = new Take(stream);
newEvent.Takes.Add(take);
newEvent.ActiveTake.Media.Length = myEvLength;
//get the actual OFX effect (gEffect: generated effect)
Effect gEffect = newEvent.ActiveTake.Media.Generator;
//add preset to generated event
gEffect.Preset = "STT - Default Subtitle";
OFXEffect fxo = gEffect.OFXEffect;
//get current preset info and parse
OFXStringParameter tparm = (OFXStringParameter)fxo.FindParameterByName("Text");
var f = tparm.Value;
//get font
string fontName;
var idx0 = f.IndexOf("\\fcharset0");
var fontSTR = f.Substring(idx0 + 10);
var idx1 = fontSTR.IndexOf(';');
fontName = f.Substring(idx0 + 10, idx1).Trim();
//MessageBox.Show(fontName);
//get font size
int fontSize;
idx0 = f.IndexOf("\\fs");
var sizSTR = f.Substring(idx0 + 3);
idx1 = sizSTR.IndexOf(" ");
fontSize = (int.Parse(f.Substring(idx0 + 3, idx1)) / 2);
//MessageBox.Show(fontSize.ToString());
//get bold and italic
bool bold = f.Contains("\\b\\");
bool italic = f.Contains("\\i\\");
//MessageBox.Show("Bold " + bold.ToString(), "Italic " + italic.ToString());
//set fontstyle
FontStyle fs = new FontStyle();
if (bold && italic) fs = FontStyle.Bold | FontStyle.Italic;
if (bold && !italic) fs = FontStyle.Bold;
if (!bold && italic) fs = FontStyle.Italic;
if (!bold && !italic) fs = FontStyle.Regular;
//create new ricktextbox
RichTextBox rtfText = new RichTextBox();
rtfText.Text = myText;
rtfText.SelectAll();
rtfText.SelectionFont = new Font(fontName, fontSize, fs);
//set horizonal alignment
rtfText.SelectionAlignment = HorizontalAlignment.Left;
if (f.Contains("\\qc\\")) rtfText.SelectionAlignment = HorizontalAlignment.Center;
if (f.Contains("\\qr\\")) rtfText.SelectionAlignment = HorizontalAlignment.Right;
//set tparm value
tparm.Value = rtfText.Rtf;
//Apply all changes
fxo.AllParametersChanged();
}
void AddTextEventQuantized(Vegas vegas, Track myNewTrack, Timecode myEvStart, Timecode myEvLength, string myText)
{
// Ensure quantization to video frame
Timecode quantizedEvStart = QuantizeToFrame(myEvStart, myVegas.Project.Video.FrameRate);
Timecode quantizedEvEnd = QuantizeToFrame(myEvStart + myEvLength, myVegas.Project.Video.FrameRate) - quantizedEvStart;
AddTextEvent(vegas, myNewTrack, quantizedEvStart, quantizedEvEnd, myText);
}
Timecode QuantizeToFrame(Timecode time, double frameRate)
{
double frameDuration = 1.0 / frameRate;
double timeInSeconds = time.ToMilliseconds() / 1000.0;
double quantizedTimeInSeconds = Math.Round(timeInSeconds / frameDuration) * frameDuration;
return Timecode.FromMilliseconds(quantizedTimeInSeconds * 1000);
}
}
public class CustomMessageBox : Form
{
public CustomMessageBox(string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
{
// Configurações da janela
Text = caption;
Size = new System.Drawing.Size(200, 150);
FormBorderStyle = FormBorderStyle.FixedDialog;
StartPosition = FormStartPosition.CenterScreen;
BackColor = System.Drawing.Color.Black; // Fundo preto
ForeColor = System.Drawing.Color.White; // Fonte branca
ControlBox = true; // Manter o botão de fechar
MinimizeBox = false; // Desabilitar o botão de minimizar
MaximizeBox = false; // Desabilitar o botão de maximizar
// Label para exibir a mensagem
Label label = new Label();
label.Text = message;
label.AutoSize = true;
label.TextAlign = ContentAlignment.MiddleCenter; // Centralizar texto horizontalmente
label.Location = new System.Drawing.Point((ClientSize.Width - label.PreferredWidth) / 2, (ClientSize.Height - label.PreferredHeight - 50) / 2); // Centralizar horizontalmente e verticalmente
// Botão OK
Button button = new Button();
button.Text = "OK";
button.DialogResult = DialogResult.OK;
button.Size = new Size(75, 23); // Tamanho do botão
button.Location = new System.Drawing.Point((ClientSize.Width - button.Width) / 2, label.Bottom + 30); // Posicionar abaixo do label e centralizar horizontalmente
button.BackColor = System.Drawing.Color.White; // Corrigindo o fundo para branco
button.ForeColor = System.Drawing.Color.Black; // Texto preto
// Adiciona controles à janela
Controls.Add(label);
Controls.Add(button);
}
// Método estático para exibir a caixa de mensagem
public static DialogResult Show(string message, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
{
CustomMessageBox messageBox = new CustomMessageBox(message, caption, buttons, icon);
return messageBox.ShowDialog();
}
}
}