LVS: Unterschied zwischen den Versionen
Youka (Diskussion | Beiträge) K (→LVS) |
Youka (Diskussion | Beiträge) K (→LVS) |
||
Zeile 2: | Zeile 2: | ||
[[Datei:LVS.png|100px]] | [[Datei:LVS.png|100px]] | ||
− | LVS (''"Lua Video Sync"'') ist ein 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). | + | LVS (''"Lua Video Sync"'') 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). |
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. | 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. |
Version vom 29. September 2013, 13:19 Uhr
Inhaltsverzeichnis
LVS
LVS ("Lua Video Sync") ist ein Filter-Plugin für die populären Windows Frameserver Avisynth, VirtualDub und DirectShow. Durch Angabe eines Skriptes (Lua Code enthaltend) als Parameter zum durch das Plugin registrierten Filter lassen sich Videobearbeitungen vornehmen (unter Avisynth auch Audio).
Die Macht der Lua Programmiersprache in Version 5.2, erweitert u.a. durch eine einfache, mächtige 2D Grafikbibliothek, ermöglicht eindrucksvolle grafische Bearbeitung von streamenden Video Frames in hoher Geschwindigkeit und mit vielen Mitteln.
Geschichte
Die Entwicklung von LVS begann im Jahre 2013 durch den Fansubber "Youka".
Inspiriert von Overlua wurde LVS als Nachfolger jenes unausgereiften Projektes beschlossen und sollte dessen großes Potenzial, programmatisch und direkt zu rendern und manipulieren, in einem frischen Gewand ausschöpfen. Als Alternative zu AFX zum typesetten komplexerer Erscheinungen und als mächtigeres Karaoke-FX Werkzeug fand es seinen Nutzen bei Fansubbern.
Definition
LVS sollte in folgenden Schritten verstanden werden, da es all diese vereint.
Frameserver plugin
LVS ist kein eigenständiges Programm, sondern eine Erweiterung für Frameserver, um eine Bearbeitung zwischen der Dekodierung eines Videos und dessen Ausgabe einzufügen. Abspielprogramme und 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.
Im Folgenden wird der Gebrauch von LVS mit den nutzbaren Frameservern gezeigt.
Avisynth
TODO
VirtualDub
TODO
DirectShow
TODO
Grafikprogrammierung
TODO
Erweiterungen
TODO
Beispiele
Folgende Beispiele sind mögliche Skripte zur Videobearbeitung mit LVS.
Minimal
Farben aller Frames werden invertiert.
function GetFrame(frame, frame_i) frame:invert() end
Zeichnen
Zeichnet eine gelbe Aussenlinie eines Halbkreises.
function GetFrame(frame, frame_i) local ctx = frame:get_context() ctx:path_move_to(100, 100) ctx:path_line_to(200, 100) ctx:path_add_arc(150, 100, 50, 0, -180) ctx:set_line_width(5) ctx:set_line_join("BEVEL") ctx:set_source(g2du.yellow) ctx:stroke() end
Text
"Hello world\nfrom LVS!" mit einem rot-zu-grün Farbverlauf.
-- Text position local pos = { x = 100, y = 100 } -- Text and his style local text_properties = { "Hello world\nfrom LVS!", -- Text "Arial", -- Font 50, -- Size true, -- Bold? true, -- Italic? true, -- Underline? true -- Strikeout? } -- Text dimensions local text_extents = {g2d.text_extents(table.unpack(text_properties))} -- Process current frame function GetFrame(frame, frame_i) -- Create drawing context for frame local ctx = frame:get_context() -- Define path as color destination ctx:path_add_text(pos.x, pos.y, table.unpack(text_properties)) -- Set linear gradient as color ctx:set_source( g2d.create_lgradient(pos.x, pos.y, pos.x + text_extents[1], pos.y + text_extents[2]) :add_color(0, 1,0,0) :add_color(1, 0,1,0) ) -- Fill path with color ctx:fill() end
Karaoke
-- Parse ASS file and fill global tables ass.load("my_ktime.ass") -- Roumaji & Kanji local function roumaji_kanji(ctx, ms, line) -- Iterate through sylables for _, syl in ipairs(line.styleref.alignment < 7 and line.chars or line.syls) do -- Use characters in case of kanjis -- Set color dependent on sylable activity ctx:set_source(ms >= syl.start_time and ms < syl.end_time and g2du.red or g2du.yellow) -- Draw sylable text ctx:path_add_text(syl.x, syl.y, syl.text, ass.unpack_font(line.styleref)) ctx:fill() ctx:path_clear() end end -- Subtitle local function subtitle(ctx, line) -- Draw line text ctx:path_add_text(line.x, line.y, line.text, ass.unpack_font(line.styleref)) ctx:set_source(g2du.yellow) ctx:fill() ctx:path_clear() end -- Process frames function GetFrame(frame, frame_i) -- Create drawing context for frame local ctx = frame:get_context() -- Get frame time local ms = frame_i / VIDEO_FPS * 1000 -- Look for frame-related ASS lines for _, line in ipairs(lines) do if ms >= line.start_time and ms < line.end_time then -- Draw ASS line if line.styleref.alignment > 3 then roumaji_kanji(ctx, ms, line) else subtitle(ctx, line) end end end end