このエントリーをはてなブックマークに追加

オープンソースソフト VLC Media Playerの機能拡張 VLCのエクステンションの作り方を説明します。

バグが多数あるので注意。


VLCのExtension(拡張)を作る

Lua言語は検索で別途調べて、公式マニュアルを見ながら作ります

ツールプラグインとエクセステンションを開いて、エクステンションの再読み込み

ツールメッセージの ログ出力レベル 警告に変更は必須


出来上がった拡張は、VLC メディアプレイヤー Extensionの使い方を参考にインストールします。

オススメ

ダイアログの作り方には癖があります

-- "Simple Move Position" -- VLC Extension --

function descriptor()
	return {title = "Simple Move Position";
	capabilities = { "input-listener" }
	}
end

function activate()
	index=1
	max=20
	input=vlc.object.input();
	d=vlc.input.item():duration()/max;
	
	local d = vlc.dialog( "Simple Move Position" )
	d:add_button("next",do_next,1,1,1,1)
	d:show()
	
end

function deactivate()
end

function close()
	vlc.deactivate()
end

function do_next()
	vlc.var.set(input,"time",d*index)
	index=index+1
	if index==max then
		vlc.deactivate()
	end
end

capabilities = { "input-listener" }がないと、inputの値を取れません。

-- "half_position.lua" -- VLC Extension --
function descriptor()
	return {title = "Half Position";
	capabilities = { "input-listener" }
	}
end

function activate()
	 vlc.msg.info(vlc.input.item():duration())
	 vlc.var.set(vlc.object.input(),"time",vlc.input.item():duration()/2)
	 vlc.deactivate()
end

function deactivate()
end

このsleepの仕方ですと、レスポンスがないとダイアログが出てVLCが落ちます。

sleep()は数秒ならvlcも待ってくれます

-- "simple_move_position_alpha.lua" -- VLC Extension --
-- some how it crash vlc --
function descriptor()
	return {title = "Zapping";
	capabilities = { "input-listener" }
	}
end

function activate()
	local d=vlc.input.item():duration()/10;
	for i = 1, 9 do
		vlc.var.set(vlc.object.input(),"time",d*i)
		sleep(3);
	end
	 vlc.deactivate()
end

function deactivate()
end

function sleep(n)  -- seconds
  local t0 = os.time()
  while os.time() - t0 <= n do end
end

バグのため動作しません。

callbackで現在位置を取得します。

-- "simple_move_position_beta.lua" -- VLC Extension --

function descriptor()
	return {title = "simple_move_position_beta";
	capabilities = { "input-listener" }
	}
end

function activate()
	index=1
	local input=vlc.object.input();
	d=vlc.input.item():duration()/10;
	
	next=index*d+3
	vlc.var.add_callback(input, "intf-event", input_event_handler, "Hello world!")
end

function deactivate()
vlc.var.del_callback(input, "intf-event", input_event_handler, "Hello world!")
end

function input_event_handler(var, old, new, data)
local input = vlc.object.input()
if input then
	local t = vlc.var.get(input, "time")
	if t>next then
		index=index+1

		jump=d*index;

		next=index*d+3
		vlc.var.set(input,"time",10)

		if index>=10 then
			vlc.deactivate()
		end
	end
end
end

メモ VLC 独自のモジュール

Configuration

Dialog - ダイアログを表示

local d = vlc.dialog("10 Position" )
d:add_button("prev",do_prev,1,1,1,1)
label=d:add_label(index.."/"..max,2,1,1,1)

作成したwidgetは後で使える。

label:set_text((index+1).."/"..max)

Extension

HTTPd

vlc.Input - 現在の入力 情報のみ?

再生時間を取得する場合

d=vlc.input.item():duration()

Messages - メッセージを表示

Misc - もろもろ

Net - TCPとか

Objects - inputとか

他のパッケージとは無関係?

現在の入力を取得

input=vlc.object.input();

OSD - On Screen Display

vlc.Playlist - プレイリスト

再生・停止・次とかできる(再生・停止はもう少し動作確認したい)

vlc.playlist.prev()
vlc.playlist.next()
vlc.playlist.play()
vlc.playlist.pause()	

SD - Service Discovery

Stream

Strings

Variable - これで値を操作します

現在の再生位置変更する場合

vlc.var.set(input,"time",d*index)

Video

VLM

Volume - ボリューム

Win - Windows

XML

コールバック

必須以外も空でもいいから、つけたほうがいい。ないとエラー・ログが残る

function descriptor() - 拡張情報を返す 必須

function activate() - 拡張の起動 必須

function deactivate() - 拡張の終了 必須

function input_changed() - 入力の変更(ビデオ変わったり、終わったり)

function meta_changed() - input changedのついでに呼ばれる