オープンソースソフト VLC Media Playerの機能拡張 VLCのエクステンションの作り方を説明します。
バグが多数あるので注意。
VLCのExtension(拡張)を作る
Lua言語は検索で別途調べて、公式マニュアルを見ながら作ります
ツールのプラグインとエクセステンションを開いて、エクステンションの再読み込み
ツールのメッセージの ログ出力レベル 警告に変更は必須
出来上がった拡張は、VLC メディアプレイヤー Extensionの使い方を参考にインストールします。
オススメ
動画のサマリー移動、クリックするたび全体の1/20 移動します simple_move_position.lua
ダイアログの作り方には癖があります
-- "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
動画の再生時間、半分の所へ移動します。 half_position.lua
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で待ちながら、再生位置を移動 simple_move_position_alpha.lua
この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
再生位置をチェックして再生位置を移動 simple_move_position_beta.lua
バグのため動作しません。
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のついでに呼ばれる