LVS

Aus WiFX - The Karaoke Wiki for ASSCalc, NyuFX, Lua, AFX, Tenfex & Templater
Wechseln zu: Navigation, Suche

LVS

LVS.png

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

TODO

Frameserver plugin

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!" mit einem rot-zu-grün Farbverlauf.

-- Text position
local pos = {
	x = 100,
	y = 100
}
-- Text and his style
local text_properties = {
	"Hello world!",	-- 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
	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

Videos

Samples

Oreimo S2 ED13

Links