オープンソースソフト 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のついでに呼ばれる