<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.animeownage.de/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
		<id>https://wiki.animeownage.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Youka</id>
		<title>WiFX - The Karaoke Wiki for ASSCalc, NyuFX, Lua, AFX, Tenfex &amp; Templater - Benutzerbeiträge [de]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.animeownage.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Youka"/>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/w/Spezial:Beitr%C3%A4ge/Youka"/>
		<updated>2026-04-30T11:32:33Z</updated>
		<subtitle>Benutzerbeiträge</subtitle>
		<generator>MediaWiki 1.24alpha</generator>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5605</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5605"/>
				<updated>2013-10-15T01:37:21Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&lt;br /&gt;
: Das Bild, um welches sich die gesamte Bearbeitung dreht. Es kann leer oder aus einer [[wikipedia:Portable_Network_Graphics|PNG]] Datei erstellt, sowie als Videoframe empfangen werden. Ebenso dient es als Farbquelle und zur Analyse von Rendering-Verhalten.&lt;br /&gt;
* '''Context'''&lt;br /&gt;
: Der Bildkontext, nötig für die meisten Manipulationen am Bild. Farbquelle und Form kann auf diesen gesetzt und schließlich auf das Bild gemalt werden.&lt;br /&gt;
* '''Source'''&lt;br /&gt;
: Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt. Solide Farbe, Farbverläufe und Texturen sind ihre Arten und können zudem transformiert werden.&lt;br /&gt;
* '''Matrix'''&lt;br /&gt;
: Die Matrix, anwendbar für Transformationen an Farbquelle und Form. Rotation, Skalierung, Verschiebung, Scherung und weitere affine Transformationen lassen sich durch jene ausdrücken und kombinieren.&lt;br /&gt;
&lt;br /&gt;
Die Bearbeitung eines Frames könnte nun wie folgt geschehen:&lt;br /&gt;
# Ein Kontext für das Bild/den Frame wird erstellt&lt;br /&gt;
# Eine Matrix zur Skalierung wird erstellt&lt;br /&gt;
# Die Matrix wird dem Kontext zugeordnet&lt;br /&gt;
# Ein linearer Farbverlauf wird erstellt&lt;br /&gt;
# Der Farbverlauf wird dem Kontext zugeordnet&lt;br /&gt;
# Ein Text wird als Form auf dem Kontext definiert&lt;br /&gt;
# Der Kontext füllt den Text mit dem Farbverlauf auf dem Frame.&lt;br /&gt;
Diese Beschreibung kann weit variieren, z.B. kann die Matrix eine Verschiebung in den Koordinaten-Ursprung, dann eine Rotation und schließlich die Verschiebung zurück ausdrücken, der Farbverlauf kann eine Textur anhand einer Bilddatei, die Form mit Linien und Kurven gestaltet sein und statt das Innere der Form am Ende zu füllen, kann dies mit dessen Aussenlinie geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wer noch nichts mit Audiobearbeitung zu tun hatte und daher manch genannte Begriffe nicht kennt, kann [http://www.beschallungs-tipps.de/html/digital_audio.html hier] und [http://www.pagus.de/seminar/skript/audio2.html hier] etwas lernen.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Das Plugin berücksichtigt den Ordner '''LVS''', welcher sich im selben Verzeichnis wie jenes befinden muss, als Bibliotheken-Sammlung. Alle Lua Dateien innerhalb dieses Ordners werden vor jeder Ausführung von LVS geladen, somit lassen sich dort eigene Funktionen und Variablen ablegen, um sie stets ohne weiteren Aufwand nutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Anfangs sind bereits 2 Erweiterungen verfügbar: '''g2du''', eine Erweiterung und Ergänzung der g2d Bibliothek, und '''ass''', Funktionen zum Umgang mit [[wikipedia:SubStation_Alpha#Advanced_SubStation_Alpha|ASS]] Inhalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5604</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5604"/>
				<updated>2013-10-14T08:47:52Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Erweiterungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&lt;br /&gt;
: Das Bild, um welches sich die gesamte Bearbeitung dreht. Es kann leer oder aus einer [[wikipedia:Portable_Network_Graphics|PNG]] Datei erstellt, sowie als Videoframe empfangen werden. Ebenso dient es als Farbquelle und zur Analyse von Rendering-Verhalten.&lt;br /&gt;
* '''Context'''&lt;br /&gt;
: Der Bildkontext, nötig für die meisten Manipulationen am Bild. Farbquelle und Form kann auf diesen gesetzt und schließlich auf das Bild gemalt werden.&lt;br /&gt;
* '''Source'''&lt;br /&gt;
: Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt. Solide Farbe, Farbverläufe und Texturen sind ihre Arten und können zudem transformiert werden.&lt;br /&gt;
* '''Matrix'''&lt;br /&gt;
: Die Matrix, anwendbar für Transformationen an Farbquelle und Form. Rotation, Skalierung, Verschiebung, Scherung und weitere affine Transformationen lassen sich durch jene ausdrücken und kombinieren.&lt;br /&gt;
&lt;br /&gt;
Die Bearbeitung eines Frames könnte nun wie folgt geschehen:&lt;br /&gt;
# Ein Kontext für das Bild/den Frame wird erstellt&lt;br /&gt;
# Eine Matrix zur Skalierung wird erstellt&lt;br /&gt;
# Die Matrix wird dem Kontext zugeordnet&lt;br /&gt;
# Ein Text wird als Form auf dem Kontext definiert&lt;br /&gt;
# Ein linearer Farbverlauf wird erstellt&lt;br /&gt;
# Der Farbverlauf wird dem Kontext zugeordnet&lt;br /&gt;
# Der Kontext füllt den Text mit dem Farbverlauf auf dem Frame.&lt;br /&gt;
Diese Beschreibung kann weit variieren, z.B. kann die Matrix eine Verschiebung in den Koordinaten-Ursprung, dann eine Rotation und schließlich die Verschiebung zurück ausdrücken, der Farbverlauf kann eine Textur anhand einer Bilddatei, die Form mit Linien und Kurven gestaltet sein und statt das Innere der Form am Ende zu füllen, kann dies mit dessen Aussenlinie geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wer noch nichts mit Audiobearbeitung zu tun hatte und daher manch genannte Begriffe nicht kennt, kann [http://www.beschallungs-tipps.de/html/digital_audio.html hier] und [http://www.pagus.de/seminar/skript/audio2.html hier] etwas lernen.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Das Plugin berücksichtigt den Ordner '''LVS''', welcher sich im selben Verzeichnis wie jenes befinden muss, als Bibliotheken-Sammlung. Alle Lua Dateien innerhalb dieses Ordners werden vor jeder Ausführung von LVS geladen, somit lassen sich dort eigene Funktionen und Variablen ablegen, um sie stets ohne weiteren Aufwand nutzen zu können.&lt;br /&gt;
&lt;br /&gt;
Anfangs sind bereits 2 Erweiterungen verfügbar: '''g2du''', eine Erweiterung und Ergänzung der g2d Bibliothek, und '''ass''', Funktionen zum Umgang mit [[wikipedia:SubStation_Alpha#Advanced_SubStation_Alpha|ASS]] Inhalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5603</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5603"/>
				<updated>2013-10-14T08:40:40Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Erweiterungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&lt;br /&gt;
: Das Bild, um welches sich die gesamte Bearbeitung dreht. Es kann leer oder aus einer [[wikipedia:Portable_Network_Graphics|PNG]] Datei erstellt, sowie als Videoframe empfangen werden. Ebenso dient es als Farbquelle und zur Analyse von Rendering-Verhalten.&lt;br /&gt;
* '''Context'''&lt;br /&gt;
: Der Bildkontext, nötig für die meisten Manipulationen am Bild. Farbquelle und Form kann auf diesen gesetzt und schließlich auf das Bild gemalt werden.&lt;br /&gt;
* '''Source'''&lt;br /&gt;
: Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt. Solide Farbe, Farbverläufe und Texturen sind ihre Arten und können zudem transformiert werden.&lt;br /&gt;
* '''Matrix'''&lt;br /&gt;
: Die Matrix, anwendbar für Transformationen an Farbquelle und Form. Rotation, Skalierung, Verschiebung, Scherung und weitere affine Transformationen lassen sich durch jene ausdrücken und kombinieren.&lt;br /&gt;
&lt;br /&gt;
Die Bearbeitung eines Frames könnte nun wie folgt geschehen:&lt;br /&gt;
# Ein Kontext für das Bild/den Frame wird erstellt&lt;br /&gt;
# Eine Matrix zur Skalierung wird erstellt&lt;br /&gt;
# Die Matrix wird dem Kontext zugeordnet&lt;br /&gt;
# Ein Text wird als Form auf dem Kontext definiert&lt;br /&gt;
# Ein linearer Farbverlauf wird erstellt&lt;br /&gt;
# Der Farbverlauf wird dem Kontext zugeordnet&lt;br /&gt;
# Der Kontext füllt den Text mit dem Farbverlauf auf dem Frame.&lt;br /&gt;
Diese Beschreibung kann weit variieren, z.B. kann die Matrix eine Verschiebung in den Koordinaten-Ursprung, dann eine Rotation und schließlich die Verschiebung zurück ausdrücken, der Farbverlauf kann eine Textur anhand einer Bilddatei, die Form mit Linien und Kurven gestaltet sein und statt das Innere der Form am Ende zu füllen, kann dies mit dessen Aussenlinie geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wer noch nichts mit Audiobearbeitung zu tun hatte und daher manch genannte Begriffe nicht kennt, kann [http://www.beschallungs-tipps.de/html/digital_audio.html hier] und [http://www.pagus.de/seminar/skript/audio2.html hier] etwas lernen.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
Das Plugin berücksichtigt den Ordner '''LVS''', welcher sich im selben Verzeichnis wie jenes befinden muss, als Bibliotheken-Sammlung. Alle Lua Dateien innerhalb dieses Ordners werden vor jeder Ausführung von LVS geladen, somit lassen sich dort eigene Funktion und Variablen ablegen, um sie stets ohne weiteren Aufwand nutzen zu können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5602</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5602"/>
				<updated>2013-10-13T21:43:39Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&lt;br /&gt;
: Das Bild, um welches sich die gesamte Bearbeitung dreht. Es kann leer oder aus einer [[wikipedia:Portable_Network_Graphics|PNG]] Datei erstellt, sowie als Videoframe empfangen werden. Ebenso dient es als Farbquelle und zur Analyse von Rendering-Verhalten.&lt;br /&gt;
* '''Context'''&lt;br /&gt;
: Der Bildkontext, nötig für die meisten Manipulationen am Bild. Farbquelle und Form kann auf diesen gesetzt und schließlich auf das Bild gemalt werden.&lt;br /&gt;
* '''Source'''&lt;br /&gt;
: Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt. Solide Farbe, Farbverläufe und Texturen sind ihre Arten und können zudem transformiert werden.&lt;br /&gt;
* '''Matrix'''&lt;br /&gt;
: Die Matrix, anwendbar für Transformationen an Farbquelle und Form. Rotation, Skalierung, Verschiebung, Scherung und weitere affine Transformationen lassen sich durch jene ausdrücken und kombinieren.&lt;br /&gt;
&lt;br /&gt;
Die Bearbeitung eines Frames könnte nun wie folgt geschehen:&lt;br /&gt;
# Ein Kontext für das Bild/den Frame wird erstellt&lt;br /&gt;
# Eine Matrix zur Skalierung wird erstellt&lt;br /&gt;
# Die Matrix wird dem Kontext zugeordnet&lt;br /&gt;
# Ein Text wird als Form auf dem Kontext definiert&lt;br /&gt;
# Ein linearer Farbverlauf wird erstellt&lt;br /&gt;
# Der Farbverlauf wird dem Kontext zugeordnet&lt;br /&gt;
# Der Kontext füllt den Text mit dem Farbverlauf auf dem Frame.&lt;br /&gt;
Diese Beschreibung kann weit variieren, z.B. kann die Matrix eine Verschiebung in den Koordinaten-Ursprung, dann eine Rotation und schließlich die Verschiebung zurück ausdrücken, der Farbverlauf kann eine Textur anhand einer Bilddatei, die Form mit Linien und Kurven gestaltet sein und statt das Innere der Form am Ende zu füllen, kann dies mit dessen Aussenlinie geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wer noch nichts mit Audiobearbeitung zu tun hatte und daher manch genannte Begriffe nicht kennt, kann [http://www.beschallungs-tipps.de/html/digital_audio.html hier] und [http://www.pagus.de/seminar/skript/audio2.html hier] etwas lernen.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5601</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5601"/>
				<updated>2013-10-13T21:37:16Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&amp;lt;br&amp;gt;Das Bild, um welches sich die gesamte Bearbeitung dreht. Es kann leer oder aus einer [[wikipedia:Portable_Network_Graphics|PNG]] Datei erstellt, sowie als Videoframe empfangen werden. Ebenso dient es als Farbquelle und zur Analyse von Rendering-Verhalten.&lt;br /&gt;
* '''Context'''&amp;lt;br&amp;gt;Der Bildkontext, nötig für die meisten Manipulationen am Bild. Farbquelle und Form kann auf diesen gesetzt und schließlich auf das Bild gemalt werden.&lt;br /&gt;
* '''Source'''&amp;lt;br&amp;gt;Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt. Solide Farbe, Farbverläufe und Texturen sind ihre Arten und können zudem transformiert werden.&lt;br /&gt;
* '''Matrix'''&amp;lt;br&amp;gt;Die Matrix, anwendbar für Transformationen an Farbquelle und Form. Rotation, Skalierung, Verschiebung, Scherung und weitere affine Transformationen lassen sich durch jene ausdrücken und kombinieren.&lt;br /&gt;
&lt;br /&gt;
Die Bearbeitung eines Frames könnte nun wie folgt geschehen:&lt;br /&gt;
# Ein Kontext für das Bild/den Frame wird erstellt&lt;br /&gt;
# Eine Matrix zur Skalierung wird erstellt&lt;br /&gt;
# Die Matrix wird dem Kontext zugeordnet&lt;br /&gt;
# Ein Text wird als Form auf dem Kontext definiert&lt;br /&gt;
# Ein linearer Farbverlauf wird erstellt&lt;br /&gt;
# Der Farbverlauf wird dem Kontext zugeordnet&lt;br /&gt;
# Der Kontext füllt den Text mit dem Farbverlauf auf dem Frame.&lt;br /&gt;
Diese Beschreibung kann weit variieren, z.B. kann die Matrix eine Verschiebung in den Koordinaten-Ursprung, dann eine Rotation und schließlich die Verschiebung zurück ausdrücken, der Farbverlauf kann eine Textur anhand einer Bilddatei, die Form mit Linien und Kurven gestaltet sein und statt das Innere der Form am Ende zu füllen, kann dies mit dessen Aussenlinie geschehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wer noch nichts mit Audiobearbeitung zu tun hatte und daher manch genannte Begriffe nicht kennt, kann [http://www.beschallungs-tipps.de/html/digital_audio.html hier] und [http://www.pagus.de/seminar/skript/audio2.html hier] etwas lernen.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5600</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5600"/>
				<updated>2013-10-13T20:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&amp;lt;br&amp;gt;Das Bild, um welches sich die gesamte Bearbeitung dreht. Es kann leer oder aus einer [[wikipedia:Portable_Network_Graphics|PNG]] Datei erstellt, sowie als Videoframe empfangen werden. Ebenso dient es als Farbquelle und zur Analyse von Rendering-Verhalten.&lt;br /&gt;
* '''Context'''&amp;lt;br&amp;gt;Der Bildkontext, nötig für die meisten Manipulationen am Bild. Farbquelle und Form kann auf diesen gesetzt und schließlich auf das Bild gemalt werden.&lt;br /&gt;
* '''Source'''&amp;lt;br&amp;gt;Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt. Solide Farbe, Farbverläufe und Texturen sind ihre Arten und können zudem transformiert werden.&lt;br /&gt;
* '''Matrix'''&amp;lt;br&amp;gt;Die Matrix, anwendbar für Transformationen an Farbquelle und Form. Rotation, Skalierung, Verschiebung, Scherung und weitere affine Transformationen lassen sich durch jene ausdrücken und kombinieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
Wer noch nichts mit Audiobearbeitung zu tun hatte und daher manch genannte Begriffe nicht kennt, kann [http://www.beschallungs-tipps.de/html/digital_audio.html hier] und [http://www.pagus.de/seminar/skript/audio2.html hier] etwas lernen.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5599</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5599"/>
				<updated>2013-10-13T19:51:53Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&amp;lt;br&amp;gt;Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context'''&amp;lt;br&amp;gt;Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source'''&amp;lt;br&amp;gt;Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix'''&amp;lt;br&amp;gt;Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5598</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5598"/>
				<updated>2013-10-13T19:16:39Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image'''&amp;lt;br&amp;gt;Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context'''&amp;lt;br&amp;gt;Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source'''&amp;lt;br&amp;gt;Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix'''&amp;lt;br&amp;gt;Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5586</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5586"/>
				<updated>2013-10-05T12:37:24Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Kanal-Tausch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kanal-Tausch===&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5585</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5585"/>
				<updated>2013-10-05T12:31:31Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Minimal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Frame-Farben werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kanal-Tausch==&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5584</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5584"/>
				<updated>2013-10-05T12:30:27Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden können. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kanal-Tausch==&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5583</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5583"/>
				<updated>2013-10-05T12:27:32Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Avisynth */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''': Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''': Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''': String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kanal-Tausch==&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5582</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5582"/>
				<updated>2013-10-05T12:25:36Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Kanal-Tausch==&lt;br /&gt;
Tauscht bei Stereo den linken mit dem rechten Kanal.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	if AUDIO_CHANNELS == 2 then&lt;br /&gt;
		for i = 1, samples_n, 2 do&lt;br /&gt;
			local temp = samples[i]&lt;br /&gt;
			samples[i] = samples[i+1]&lt;br /&gt;
			samples[i+1] = temp&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5581</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5581"/>
				<updated>2013-10-05T12:06:31Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5580</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5580"/>
				<updated>2013-10-05T12:04:45Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Rauschen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5576</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5576"/>
				<updated>2013-10-02T18:56:25Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audioprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5575</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5575"/>
				<updated>2013-10-02T09:56:55Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Eine Liste der Grafikobjekte:&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Image''': Das Bild, um welches sich die gesamte Bearbeitung dreht.&lt;br /&gt;
* '''Context''': Der Bildkontext, nötig für die meisten Manipulationen am Bild.&lt;br /&gt;
* '''Source''': Die Farbquelle, welche die Einfärbung der zu malenden Form beschreibt.&lt;br /&gt;
* '''Matrix''': Die Matrix, anwendbar für Transformationen an Farbquelle und Form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5574</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5574"/>
				<updated>2013-10-02T09:47:18Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audioprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
Eine Liste der Grafikobjekte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5573</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5573"/>
				<updated>2013-10-02T09:18:22Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
Eine Liste der Grafikobjekte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5572</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5572"/>
				<updated>2013-10-02T09:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5571</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5571"/>
				<updated>2013-10-02T09:06:16Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audioprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 24px; padding-top: 8px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 24px; padding-top: 8px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Einzelne Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' 2D Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5570</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5570"/>
				<updated>2013-10-02T09:02:46Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audioprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; font-size: 8px; line-height: 5px; text-align: center;&amp;quot;&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 20px;&amp;quot;|S1&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 20px;&amp;quot;|S1&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 20px;&amp;quot;|S2&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 20px;&amp;quot;|S2&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: yellow; width: 20px;&amp;quot;|S3&lt;br /&gt;
C1&lt;br /&gt;
|style=&amp;quot;border: solid 3px; background-color: #FFC000; width: 20px;&amp;quot;|S3&lt;br /&gt;
C2&lt;br /&gt;
|style=&amp;quot;border: solid 3px; border-right-width: 0px; background-color: yellow; width: 20px;&amp;quot;|...&lt;br /&gt;
|}&lt;br /&gt;
;S = Sample Index&lt;br /&gt;
;C = Channel&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Einzelne Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' 2D Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5569</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5569"/>
				<updated>2013-10-02T08:25:34Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Samples Interlacing.png]]&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Einzelne Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' 2D Grafikbibliothek ist. Neben dem Bildobjekt gibt es andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um all diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5568</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5568"/>
				<updated>2013-10-02T08:24:06Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Samples Interlacing.png]]&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Einzelne Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' 2D Grafikbibliothek ist. Neben dem Bildobjekt gibt es auch andere Grafikobjekte, welche zur Bearbeitung gebraucht werden. Um diese zu verwenden, werden über Member-Funktionen ihre Attribute verändert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5567</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5567"/>
				<updated>2013-10-02T08:18:03Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Grafikprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Samples Interlacing.png]]&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
Einzelne Frames werden als Bildobjekt empfangen, welches Teil der nutzbaren '''g2d''' 2D Grafikbibliothek ist. Um dieses zu verändern, müssen Member-Funktionen aufgerufen werden. Neben dem Bildobjekt gibt es auch andere Grafikobjekte, welche zur Bearbeitung verwendet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5566</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5566"/>
				<updated>2013-10-02T07:58:04Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audioprogrammierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
Samples werden im Format Float32, also einer Amplitudenangabe von -1.0 bis +1.0, und als channel interlaced, also in Kanäle-Blöcken, empfangen.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Samples Interlacing.png]]&lt;br /&gt;
&lt;br /&gt;
Unter Zuhilfenahme der Metainformationen, wie die Anzahl an Kanälen und der Sample Rate, lässt sich mit ihnen arbeiten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5563</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5563"/>
				<updated>2013-10-02T07:25:40Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Audioprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5562</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5562"/>
				<updated>2013-10-01T19:26:14Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Audio als Text */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio zu Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5561</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5561"/>
				<updated>2013-10-01T19:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Audio als Text===&lt;br /&gt;
Schreibt Audiodaten als Text in eine Datei.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local file = io.open(&amp;quot;audio.txt&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
file:write(string.format(&amp;quot;Channels: %d\nSample rate: %d\nSamples: %d\n\n&amp;quot;, AUDIO_CHANNELS, AUDIO_SAMPLE_RATE, AUDIO_SAMPLES))&lt;br /&gt;
&lt;br /&gt;
function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	file:write(table.concat(samples, &amp;quot;\n&amp;quot;))&lt;br /&gt;
	file:write(&amp;quot;\n&amp;quot;)&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5560</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5560"/>
				<updated>2013-10-01T19:09:35Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
===Rauschen===&lt;br /&gt;
Erstellt ein Rauschen.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, start_sample_i)&lt;br /&gt;
	for i = 1, samples_n do&lt;br /&gt;
		samples[i] = math.random(-1000,1000) / 1000&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Hello===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5559</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5559"/>
				<updated>2013-10-01T18:58:32Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Skript-Basis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet der Funktionsname '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples (kanalübergreifend).&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5558</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5558"/>
				<updated>2013-10-01T16:17:00Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet die Funktion '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples, kanalübergreifend.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind Skripte zur Ausführung mit LVS.&lt;br /&gt;
==Audio==&lt;br /&gt;
Folgende Skripte dienen der Audiobearbeitung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
Folgende Skripte dienen der Videobearbeitung.&lt;br /&gt;
===Minimal===&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zeichnen===&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Text===&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Karaoke===&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5557</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5557"/>
				<updated>2013-10-01T15:58:49Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Skript-Basis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet die Funktion '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples, kanalübergreifend.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metainformationen eines Streams sind als globale Variablen verfügbar. Diese umfassen '''VIDEO_WIDTH''', '''VIDEO_HEIGHT''', '''VIDEO_HAS_ALPHA''', '''VIDEO_FPS''', '''VIDEO_FRAMES''', '''AUDIO_CHANNELS''', '''AUDIO_SAMPLE_RATE''', '''AUDIO_SAMPLES''' und '''USERDATA''' (letzteres ist das ''data'' Argument in Avisynth und ist in beiden Stream-Typen verfügbar).&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5556</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5556"/>
				<updated>2013-10-01T15:48:46Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Skript-Basis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
Basis eines jeden LVS Skripts ist die Filter Funktion, durch welche Frames bzw. Samples geschickt werden.&lt;br /&gt;
&lt;br /&gt;
Im Falle der Videobearbeitung muss diese '''GetFrame''' heißen. Der erste Aufrufparameter ist ein Frame als Bildobjekt, der zweite der Frame Index.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Bei Audiobearbeitung lautet die Funktion '''GetSamples'''. Der erste Aufrufparameter ist ein Table, die Samples enthaltend, der zweite die Table-Größe des letzteren und der dritte der Sample Index des ersten erhaltenen Samples, kanalübergreifend.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetSamples(samples, samples_n, sample_i)&lt;br /&gt;
	-- Füll mich&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5555</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5555"/>
				<updated>2013-10-01T15:34:04Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5554</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5554"/>
				<updated>2013-10-01T15:33:34Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* DirectShow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
Am Beispiel von [[wikipedia:Media_Player_Classic#Media_Player_Classic_-_Home_Cinema|MPC-HC]] kann über Menü ''View -&amp;gt; Options... -&amp;gt; External Filter'' LVS hinzugefügt, anschließend durch Setzen der Priorität auf 'Prefer' in die Filter-Kette gezwungen und nach Neustart des Programms über Menü ''Play -&amp;gt; Filters -&amp;gt; LVS'' konfiguriert werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - DirectShow.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=Datei:LVS_-_DirectShow.png&amp;diff=5553</id>
		<title>Datei:LVS - DirectShow.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=Datei:LVS_-_DirectShow.png&amp;diff=5553"/>
				<updated>2013-10-01T15:31:27Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: DirectShow Filterung mit LVS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DirectShow Filterung mit LVS&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5552</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5552"/>
				<updated>2013-10-01T15:17:35Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* DirectShow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
Filter müssen erst als COM Objekt in der Windows-Registry registriert werden, um sie nutzbar für DirectShow gebrauchende Programme zu machen. Dies ist möglich mit dem Kommandozeilen-Programm [[wikipedia:Regsvr32|regsvr32]]. Anschließend hängt es vom Anwenderprogramm ab, wie der Filter geladen wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5551</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5551"/>
				<updated>2013-10-01T14:45:52Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* VirtualDub */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Video-Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog dessen Skript-Parameter eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5550</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5550"/>
				<updated>2013-10-01T14:39:06Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog das Skript eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:LVS - VirtualDub.png|800px]]&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=Datei:LVS_-_VirtualDub.png&amp;diff=5549</id>
		<title>Datei:LVS - VirtualDub.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=Datei:LVS_-_VirtualDub.png&amp;diff=5549"/>
				<updated>2013-10-01T14:36:30Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: VirtualDub Filterung mit LVS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;VirtualDub Filterung mit LVS&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5548</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5548"/>
				<updated>2013-10-01T14:27:07Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
VirtualDubs Filterung ist über das Menü &amp;quot;Video&amp;quot;, Menüeintrag &amp;quot;Filters...&amp;quot;, erreichbar. Über den Button &amp;quot;Add...&amp;quot; lässt sich LVS aus einer Liste von Filtern hinzufügen und anschließend über einen Dialog das Skript eingeben. Sollte LVS noch nicht in genannter Liste verfügbar sein, kann über den Button &amp;quot;Load...&amp;quot; das Plugin geladen werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5547</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5547"/>
				<updated>2013-10-01T13:58:18Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skript-Basis==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5546</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5546"/>
				<updated>2013-10-01T13:55:45Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: Avisynth Nutzung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt (dies schließt den Umgang mit den Frameservern selbst nicht ein).&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
Avisynth wird über eine Skriptsprache gesteuert, dementsprechend wird auch LVS eingefügt.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;LoadPlugin(&amp;quot;E:\LVS\plugin\LVS.dll&amp;quot;)	#Lädt Plugin 'LVS'/registriert Funktion 'LVS'&lt;br /&gt;
&lt;br /&gt;
BlankClip()				#Erstellt einen leeren Clip&lt;br /&gt;
LVS(&amp;quot;hello.lua&amp;quot;)			#Führt Videobearbeitungsskript mit LVS aus&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Die Definition der Funktion sieht wie folgt aus:&lt;br /&gt;
&lt;br /&gt;
: '''clip = LVS(clip''''', string &amp;quot;video&amp;quot;, string &amp;quot;audio&amp;quot;, string &amp;quot;data&amp;quot;''')'''&lt;br /&gt;
&amp;lt;small&amp;gt;&lt;br /&gt;
:: '''clip''' (1): Ausgabe-Video&lt;br /&gt;
:: '''clip''' (2): Eingabe-Video&lt;br /&gt;
:: '''string &amp;quot;video&amp;quot;''' (2): Skript zur Videobearbeitung&lt;br /&gt;
:: '''string &amp;quot;audio&amp;quot;''' (2): Skript zur Audiobearbeitung&lt;br /&gt;
:: '''string &amp;quot;data&amp;quot;''' (2): String zur Übergabe in Skript-Umgebung&lt;br /&gt;
&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5545</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5545"/>
				<updated>2013-10-01T09:52:35Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Text */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5544</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5544"/>
				<updated>2013-09-30T19:17:23Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Geschichte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug zu den bisherigen fand es ersten Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Text position&lt;br /&gt;
local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
-- Text and his style&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
-- Text dimensions&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
-- Process current frame&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Define path as color destination&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	-- Set linear gradient as color&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	-- Fill path with color&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5543</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5543"/>
				<updated>2013-09-29T12:22:50Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug fand es seinen Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Text position&lt;br /&gt;
local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
-- Text and his style&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
-- Text dimensions&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
-- Process current frame&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Define path as color destination&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	-- Set linear gradient as color&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	-- Fill path with color&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5542</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5542"/>
				<updated>2013-09-29T12:21:44Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Geschichte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug fand es seinen Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Text position&lt;br /&gt;
local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
-- Text and his style&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
-- Text dimensions&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
-- Process current frame&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Define path as color destination&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	-- Set linear gradient as color&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	-- Fill path with color&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de/index.php Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5541</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5541"/>
				<updated>2013-09-29T12:21:01Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Geschichte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 von dem Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug fand es seinen Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Text position&lt;br /&gt;
local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
-- Text and his style&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
-- Text dimensions&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
-- Process current frame&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Define path as color destination&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	-- Set linear gradient as color&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	-- Fill path with color&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de/index.php Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	<entry>
		<id>https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5540</id>
		<title>LVS</title>
		<link rel="alternate" type="text/html" href="https://wiki.animeownage.de/index.php?title=LVS&amp;diff=5540"/>
				<updated>2013-09-29T12:19:40Z</updated>
		
		<summary type="html">&lt;p&gt;Youka: /* Frameserver plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=LVS=&lt;br /&gt;
[[Datei:LVS.png|100px]]&lt;br /&gt;
&lt;br /&gt;
LVS (''&amp;quot;Lua Video Sync&amp;quot;'') ist ein [[wikipedia:Video_filter|Filter]]-[[wikipedia:Plug-in_(computing)|Plugin]] für die populären Windows [[wikipedia:Frameserver|Frameserver]] [[wikipedia:Avisynth|Avisynth]], [[wikipedia:VirtualDub|VirtualDub]] und [[wikipedia:DirectShow|DirectShow]]. Durch Angabe eines Skriptes ([[wikipedia:Lua (programming language)|Lua]] Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).&lt;br /&gt;
&lt;br /&gt;
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige [[wikipedia:2D computer graphics|2D Grafik]]bibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber &amp;quot;Youka&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Inspiriert von [http://forums.animesuki.com/showthread.php?t=52757 Overlua] wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu [[wikipedia:Rendering (computer graphics)|rendern]] und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu [[wikipedia:Adobe_After_Effects|AFX]] zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug fand es seinen Nutzen bei Fansubbern.&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.&lt;br /&gt;
&lt;br /&gt;
==Frameserver plugin==&lt;br /&gt;
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der [[wikipedia:Decoder|Dekodierung]] eines Videos und dessen Ausgabe einzufügen. [[wikipedia:Video player (software)|Abspielprogramme]] und [[wikipedia:Encoder#Media|Kodierer]], welche Frameserver nutzen, können somit Filter auf das Eingangsmaterial anwenden, womit ein anderes Ausgangsmaterial entsteht. Nach Hinzufügen von LVS als Filter muss diesem ein Parameter angegeben werden: das Skript, das die Bearbeitung beschreibt.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.&lt;br /&gt;
&lt;br /&gt;
===Avisynth===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===VirtualDub===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DirectShow===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Grafikprogrammierung==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Erweiterungen==&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;color: red;&amp;quot;&amp;gt;TODO&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.&lt;br /&gt;
==Minimal==&lt;br /&gt;
Farben aller Frames werden invertiert.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	frame:invert()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zeichnen==&lt;br /&gt;
Zeichnet eine gelbe Aussenlinie eines Halbkreises.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;function GetFrame(frame, frame_i)&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	ctx:path_move_to(100, 100)&lt;br /&gt;
	ctx:path_line_to(200, 100)&lt;br /&gt;
	ctx:path_add_arc(150, 100, 50, 0, -180)&lt;br /&gt;
	ctx:set_line_width(5)&lt;br /&gt;
	ctx:set_line_join(&amp;quot;BEVEL&amp;quot;)&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:stroke()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
&amp;quot;Hello world\nfrom LVS!&amp;quot; mit einem rot-zu-grün Farbverlauf.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Text position&lt;br /&gt;
local pos = {&lt;br /&gt;
	x = 100,&lt;br /&gt;
	y = 100&lt;br /&gt;
}&lt;br /&gt;
-- Text and his style&lt;br /&gt;
local text_properties = {&lt;br /&gt;
	&amp;quot;Hello world\nfrom LVS!&amp;quot;,	-- Text&lt;br /&gt;
	&amp;quot;Arial&amp;quot;,	-- Font&lt;br /&gt;
	50,	-- Size&lt;br /&gt;
	true,	-- Bold?&lt;br /&gt;
	true,	-- Italic?&lt;br /&gt;
	true,	-- Underline?&lt;br /&gt;
	true	-- Strikeout?&lt;br /&gt;
}&lt;br /&gt;
-- Text dimensions&lt;br /&gt;
local text_extents = {g2d.text_extents(table.unpack(text_properties))}&lt;br /&gt;
&lt;br /&gt;
-- Process current frame&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Define path as color destination&lt;br /&gt;
	ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties))&lt;br /&gt;
	-- Set linear gradient as color&lt;br /&gt;
	ctx:set_source(&lt;br /&gt;
		g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2])&lt;br /&gt;
		:add_color(0, 1,0,0)&lt;br /&gt;
		:add_color(1, 0,1,0)&lt;br /&gt;
	)&lt;br /&gt;
	-- Fill path with color&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Karaoke==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;-- Parse ASS file and fill global tables&lt;br /&gt;
ass.load(&amp;quot;my_ktime.ass&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Roumaji &amp;amp; Kanji&lt;br /&gt;
local function roumaji_kanji(ctx, ms, line)&lt;br /&gt;
	-- Iterate through sylables&lt;br /&gt;
	for _, syl in ipairs(line.styleref.alignment &amp;lt; 7 and line.chars or line.syls) do	-- Use characters in case of kanjis&lt;br /&gt;
		-- Set color dependent on sylable activity&lt;br /&gt;
		ctx:set_source(ms &amp;gt;= syl.start_time and ms &amp;lt; syl.end_time and g2du.red or g2du.yellow)&lt;br /&gt;
		-- Draw sylable text&lt;br /&gt;
		ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref))&lt;br /&gt;
		ctx:fill()&lt;br /&gt;
		ctx:path_clear()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Subtitle&lt;br /&gt;
local function subtitle(ctx, line)&lt;br /&gt;
	-- Draw line text&lt;br /&gt;
	ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref))&lt;br /&gt;
	ctx:set_source(g2du.yellow)&lt;br /&gt;
	ctx:fill()&lt;br /&gt;
	ctx:path_clear()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Process frames&lt;br /&gt;
function GetFrame(frame, frame_i)&lt;br /&gt;
	-- Create drawing context for frame&lt;br /&gt;
	local ctx = frame:get_context()&lt;br /&gt;
	-- Get frame time&lt;br /&gt;
	local ms = frame_i / VIDEO_FPS * 1000&lt;br /&gt;
	-- Look for frame-related ASS lines&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		if ms &amp;gt;= line.start_time and ms &amp;lt; line.end_time then&lt;br /&gt;
			-- Draw ASS line&lt;br /&gt;
			if line.styleref.alignment &amp;gt; 3 then&lt;br /&gt;
				roumaji_kanji(ctx, ms, line)&lt;br /&gt;
			else&lt;br /&gt;
				subtitle(ctx, line)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Videos=&lt;br /&gt;
[http://www.mediafire.com/download/i3reijc799edi6v/%5BLVS%5D+Samples.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Karaoke Beispiele&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
[http://www.mediafire.com/download/jfj41pn9xvtbd3w/%5BLVS%5D+Oreimo+S2+-+ED13.mp4 &amp;lt;tt style=&amp;quot;font-weight:bold; font-size:18px; color:blue;&amp;quot;&amp;gt;Oreimo S2 ED13&amp;lt;/tt&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://sourceforge.net/projects/lua-video-sync/ Projektseite auf Sourceforge]&lt;br /&gt;
*[http://forum.youka.de/index.php Forum]&lt;br /&gt;
[[Category:LVS|{{PAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Youka</name></author>	</entry>

	</feed>