Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Scripting
ein paar Beispiele sind aus „doggy's“ SCRIPTING FOR DUMMIES aus den vMix Forum.
Scripting ist innerhalb von vMix mit dem eingebauten Editor möglich oder als externer Befehl via Browser. Die Zusammenstellung der Beispiele ist unvollständig. Im Anhang hat es eine Auflistung der zurzeit bekannten API-Befehle.
vMix Scripting unterstützt VB.NET beim Schreiben deines Skripts.
Alle Variablen sind Lokal, es gibt leider keine Public Variablen. Man kann irgendwelche nicht sichtbaren Textfelder als Pubic Variablen zweckentfremden.
Bei Input kann entweder der Filename des Titels(Gross-Kleinschreibung beachten) oder die InputNummer verwendet werden.
Die Beschreibung auf der vMix Seite ist etwas dürftig, trotzdem lohnt sich immer ein Blick dorthin.
vMix API Website
Hier die aktuell gültige Liste der Befehle in der Übersicht.
Shortcut Übersicht
4 verschiedene Arten, ein script zu schreiben
es gibt 4 verscheidene Arten ein script zu schreiben. Schlussendlich machen die Varianten alle das selbe. Im normalfall reicht in vMix Editor die einfachste Variante. (WEB)
–VB.net kann aber mit variablen umgehen, WEB kann das nicht.
–API enspricht VB net
–WEB ohne variablen, kurz und einfach, reicht für die meisten internen scripte.
–HTTP sendet den API Befehl via Browser oder
VB.net
Input.Find("Title 0- The Classic Blue.gtzip").Text("Headline.Text")= "Some Text"
API
API.Function("SetText",Input:="1",SelectedName:="Headline.Text",Value:="Same Text")
WEB
Function=SetText&Input=1&SelectedIndex=0&Value=Some Other Text
HTTP
http://127.0.0.1:8088/api/?Function=SetText&Input=Title 0- The Classic Blue.gtzip&SelectedName=Headline.Text&Value=Some Text
Hello World Beispiel
Dieses Beispiel verwendet den mitgelieferten Titel NewsHD und schreibt Hello World in das Feld Headline
Input.Find("NewsHD.xaml").Text("Headline") = "Hello World!"
oder anders ausgedrückt:
dim i = Input.Find("NewsHD.xaml")\\ i.Text("Headline") = "Hello World!"
Audio
Audio Bus der Quelle 1 Einschalten (grüner Lausprecher)
Function=AudioON&Input=1
Audio Bus der Quelle 1 auf Audio Ausgang D routen
Function=AudioBusON&Input=1&Value=D
Audio Bus der Quelle 2 auf Audio Ausgang Master routen
Function=AudioBusON&Input=2&Value=M
Audio Bus der Quelle 1 vom Master wegrouten
Function=AudioBusOFF&Input=1&Value=Master
Audio Bus der Quelle 3 vom D wegrouten
Function=AudioBusOFF&Input=1&Value=D
Audio follow Video vom Eingang 1 abschalten
Function=AudioAutoOff&Input=1
Video
Eingang 4 Video auf OUTPUT routen
Function=Activeinput&Input=4
oder
Function=Cutdirect&Input=2&Value=2
Eingang 3 Video auf Preview routen
Function=Previewinput&Input=4
Eingang 1 Video auf OUTPUT2 routen
Function=SetOutput2&Input=1&Value=1
Eingang mit einem bestimmten Namen auf die Linie routen
Input.Find("YourInput").Function("Cut")
Titel / Text
Ändert Text in einem bestimmten Feld
Input.Find("Title 0- The Classic Blue.gtzip").Text("Headline.Text")= "Text geändert"
oder
API.Function("SetText",Input:="Title 0- The Classic Blue.gtzip",SelectedName:=" Headline.Text ",Value:="Text geändert ")
Ändert Schrift Farbe eines bestimmten Textfeldes, es gehen argb Werte oder sonst als Farbe (red, blue, black, transparent etc.)
API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg21.Text",Value:="transparent")
Titel / Text via browser
Als IP Adresse benutzt man folgendes:
-127.0.0.1 wenn der Browser auf demselben Computer läuft, wie vMix.
-vMixIP wenn der Browser auf einem anderen Computer im selben Netzwerk läuft.
Aendert ein (Logo, Foto etc.)
http://127.0.0.1:8088/API/?Function=SetImage&Input=Titel.gtzip"&SelectedName=LOGO.Source&Value=C:\VMIX\ch.png
Setzt ein Bild (Logo, Foto etc.) auf unsichtbar (sichtbar SetImageVisibleOn)
http://127.0.0.1:8088/API/?Function=SetImage&Input=Titel.gtzip&Image=LOGO.Source&Value=C:\VMIX\ch.png
Inputs
Alle diese Funktionen erzeugen einen neuen Eingang
Lädt ein Titel aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
http://127.0.0.1:8088/API/?Function=AddInput&Value=Xaml|C:\VMIX\Name.gtzip
Lädt ein Video aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
http://127.0.0.1:8088/API/?Function=AddInput&Value=Video|c:\path\to\video.avi
Lädt ein Bild aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
http://127.0.0.1:8088/API/?Function=AddInput&Value=Image|c:\path\to\image.jpg
Lädt einen Bilder Ordner aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
http://127.0.0.1:8088/API/?Function=AddInput&Value=Photos|c:\path\to\folder
Lädt eine Video Playlist aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
http://127.0.0.1:8088/API/?Function=AddInput&Value=VideoList|c:\path\to\playlist.m3u
Lädt ein Audiofile aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
http://127.0.0.1:8088/API/?Function=AddInput&Value=AudioFile|c:\path\to\audio.wav
Lädt eine Powerpoint Präsentation aus einem bestimmten Verzeichnis in einen neuen Eingang in vMix
(ich glaube es funktionieren nur Folien ohne Videos oder Audios)
http://127.0.0.1:8088/API/?Function=AddInput&Value=PowerPoint|c:\path\to\powerpoint.pptx
Diverses
Wartet 1 Sekunde
sleep(1000)
ein script aus einem anderen script aufrufen, in diesem Fall das vMix Script allaudiobusDoff
Diese Funktion nutzt VB.NET als Programmiersprache, VB Net ist ein Teil der Scripting Funktionen.
Function=ScriptStart&Value=allaudiobusDoff
Schaltet bei allen Eingängen den AudioBus D aus
Dim doc As New XmlDocument() doc.LoadXml(API.Xml) Dim root As XmlNode = doc.DocumentElement Dim i as Integer Dim xel As XmlElement Dim node As XmlNode = root.SelectSingleNode ("/vmix/active") ‘look for node Dim inputNumber as Integer = node.InnerXml 'shows active input ‘wieviele Eingänge sind aktiv Dim vmixinputs as Integer 'inputs in total For Each xel In Doc.SelectNodes("vmix") vmixinputs = (xel.SelectNodes("inputs/input").Count) Next xel for i = 1 to vmixinputs API.Function("AudioBusOff", i, "D") Next
Scripting via Browser
Ändert Text in einem bestimmten Feld via Browser
http://127.0.0.1:8088/api/?Function=SetText&Input=Title 0- The Classic Blue.gtzip&SelectedName=Headline.Text&Value=Text geändert
Ändert Textfarbe in einem bestimmten Feld via Browser
http://127.0.0.1:8088/api/?Function=SetTextColour&Input=Title 0- The Classic Blue.gtzip&SelectedName=Headline.Text&Value=red
komplexeres Beispiel
in welchem zuerst die aktive Input Nummer festgestellt wird, dann aufgrund der Inputnummer eine Aktion erfolgt. Es läuft als Loop, also solange jemand das Script startet und nicht wieder anhält.
do while true Dim doc As New XmlDocument() doc.LoadXml(API.Xml) Dim root As XmlNode = doc.DocumentElement Dim node As XmlNode = root.SelectSingleNode("/vmix/active") Dim inputNumber as Integer = node.InnerXml If inputNumber = 2 Then Input.Find("whoisonair.gtzip").Text("Text11.Text") = "caller1 onair OUT1" API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg11.Text",Value:="red") Input.Find("whoisonair.gtzip").Text("Text21.Text") = " " Input.Find("whoisonair.gtzip").Text("Text31.Text") = " " Input.Find("whoisonair.gtzip").Text("Text41.Text") = " " Input.Find("whoisonair.gtzip").Text("Text51.Text") = " " Input.Find("whoisonair.gtzip").Text("Text61.Text") = " " Input.Find("whoisonair.gtzip").Text("Text71.Text") = " " Input.Find("whoisonair.gtzip").Text("Text71.Text") = " " API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg21.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg31.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg41.Text",Value:="transparent") End If If inputNumber = 3 Then Input.Find("whoisonair.gtzip").Text("Text21.Text") = "caller2 onair OUT1" API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg21.Text",Value:="red") Input.Find("whoisonair.gtzip").Text("Text11.Text") = " " Input.Find("whoisonair.gtzip").Text("Text31.Text") = " " Input.Find("whoisonair.gtzip").Text("Text41.Text") = " " API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg11.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg31.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg41.Text",Value:="transparent") End If If inputNumber = 4 Then Input.Find("whoisonair.gtzip").Text("Text31.Text") = "caller3 onair OUT1" API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg31.Text",Value:="red") Input.Find("whoisonair.gtzip").Text("Text11.Text") = " " Input.Find("whoisonair.gtzip").Text("Text21.Text") = " " Input.Find("whoisonair.gtzip").Text("Text41.Text") = " " API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg11.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg21.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg41.Text",Value:="transparent") End If If inputNumber = 5 Then Input.Find("whoisonair.gtzip").Text("Text41.Text") = "caller4 onair OUT1" API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg41.Text",Value:="red") Input.Find("whoisonair.gtzip").Text("Text11.Text") = " " Input.Find("whoisonair.gtzip").Text("Text21.Text") = " " Input.Find("whoisonair.gtzip").Text("Text31.Text") = " " API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg11.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg21.Text",Value:="transparent") API.Function("SetTextColour",Input:="whoisonair.gtzip",SelectedName:="hg31.Text",Value:="transparent") End If sleep (200) loop
Gibt den Names eines vMix Callers vom Input 1
do while true dim xml as string = API.XML() dim x as new system.xml.xmldocument x.loadxml(xml) dim word as string = (x.SelectSingleNode("//input[@number=1]").InnerText) console.writeline(word) 'or API to send to title sleep(500) loop
Holt Audio Titelname aus einem Input
This script reads the current title of a playlist and writes it formatted into a field of a title input
In diesem Beispiel verwende ich den in vMix enthaltenen Titel „ Title 33- On the shelf- Peach.gtzip “ und schreibe den Text in das Feld „Headline.Text“. Mein List-Input ist Input2. Bitte passe diese (Titel, Feld und List-Input-Nummer) für Ihr Projekt an.
I use a list of MP3 audiofiles. These are named as follows: Anni Piper - Two's Company - 01 - Blues Before Sunrise.mp3 Anni Piper - Two's Company - 02 - Live To Play.mp3 Anni Piper - Two's Company - 03 - Man's Woman.mp3
The goal is to extract a usable name from this string.
The finished script looks like this:
'script playing now do dim xml as string = API.XML() dim x as new system.xml.xmldocument x.loadxml(xml) dim word as string = x.SelectSingleNode("//input[@number=[h]'2'[/h]]/@title").Value word = word.remove(word.Length - 4) dim wordArr as String() = word.Split("-") Dim result0 as String = wordArr(0) Dim result1 as String = wordArr(1) Dim result2 as String = wordArr(2) Dim result3 as String = wordArr(3) Dim result4 as String = wordArr(4) dim fullname as string = result1 + " " + result2 + " " + result4 API.Function("SetText",Input:="Title 33- On the shelf- Peach.gtzip",SelectedName:="Headline.Text",Value:=result1) sleep(1000) API.Function("SetText",Input:="Title 33- On the shelf- Peach.gtzip",SelectedName:="Headline.Text",Value:=result2) sleep(1000) API.Function("SetText",Input:="Title 33- On the shelf- Peach.gtzip",SelectedName:="Headline.Text",Value:=result4) sleep(1000) API.Function("SetText",Input:="Title 33- On the shelf- Peach.gtzip",SelectedName:="Headline.Text",Value:=fullname) sleep(1000) loop
String formatieren
vMix macht manchmal aus einer Zahl, welche von einer Datenquelle stammt, etwas „anderes“.
aus 100.00 wird 100
aus 100.10 wird 100.1
etc.
Falls aber immer die Anzeige 100.00 gewünscht ist, kann das via ein loopendes Script korrigiert werden. In diesem Beispiel ist es der Titel mytitle und das Feld Headline.Text.
do dim j as integer dim i As string = "" dim mystring as string = "" i = Input.Find("mytitle").Text("Headline.Text") j = CInt(i) myString = String.Format("{0:00}", j) API.Function("SetText",Input:="mytitle",SelectedName:="Description.Text",Value:=myString ) loop
Multiviewer einschalten und belegen
Schaltet auf den ersten 4 Inputs den ersten Multiviewer Layer ein und belegt diese mit Inputs 10-14
Function=SetMultiViewOverlay&Input=1&Value=1,11 Function=MultiViewOverlayON&Input=1&Value=1&Index=11 Function=SetMultiViewOverlay&Input=2&Value=1,12 Function=MultiViewOverlayON&Input=2&Value=1&Index=12 Function=SetMultiViewOverlay&Input=3&Value=1,13 Function=MultiViewOverlayON&Input=3&Value=1&Index=13 Function=SetMultiViewOverlay&Input=4&Value=1,14 Function=MultiViewOverlayON&Input=4&Value=1&Index=14
Funktion zu einem bestimmten Tageszeitpunkt auslösen
Einen Titel zu einer bestimmten Zeit zusetzen
'löst eine Funktion zu einem bestimmten Tageszeitpunkt aus (16:00) 'in diesem Beistpiel wird der Eingang 1 ("1") auf den Overlay1 gelegt 'hier die Zeit vorgeben dim triggertime as string = "16:00" Do While True If triggertime = DateTime.Now.ToString("HH:mm") Then 'bei 12H Anzeige (AP/PM) hh:mm verwenden ' Hier kommt die Funktion, welch zu einem bestimmten Zeitpunkt ausgelöst werden soll API.Function("OverlayInput1In",Input:="1") '"ersetze "1" mit der von dir gewünschten Input Nummer Exit do End If sleep(1000) Loop
Streaming zu einem bestimmten Zeitpunkt starten
'löst eine Funktion zu einem bestimmten Tageszeitpunkt aus (16:00) 'in diesem Beistpiel wird Streaming 1 gestartet 'Stream1: Value:="0" 'Stream2: Value:="1" 'Stream3: Value:="2" 'hier die Zeit vorgeben dim triggertime as string = "16:00" Do While True If triggertime = DateTime.Now.ToString("HH:mm") Then ' Hier kommt die Funktion, welch zu einem bestimmten Zeitpunkt ausgelöst werden soll, Start Streaming 1 API.Function("StartStreaming",Value:="0") Exit do End If sleep(1000) Loop
Wechsle Page in Titel alle 5 Sekunden
Der Code ist für einen Titel, welcher 6 pages hat, welche nach 5 Sekunden automatisch gewechselt werden.
dim x as integer Dim Index as integer =0 Do while Index <=100 for x = 1 to 6 sleep(5000) api.Function("SelectIndex",Input:="Test.gtxml",Value:=x) next x index +=1 loop