fps="25.000" frame_duration=1/tonumber(fps)
当我运行带有详细输出的vlc进行调试时,我得到(编辑为多行分割:):
$vlc --verbose 2 ... [0xa213874] lua generic warning: Error loading script ~/.local/share/vlc/lua/extensions/test.lua: .../.local/share/vlc/lua/extensions/test.lua:2: attempt to call global 'tonumber' (a nil value) ...
现在,据我所知,tonon as function是Lua5.1本身(Lua 5.1 Reference Manual: tonumber)的一部分 – 在我的系统上:
$locate --regex 'lua.*so.*' | head -4 /usr/lib/libipelua.so.7.0.10 /usr/lib/liblua5.1.so /usr/lib/liblua5.1.so.0 /usr/lib/liblua5.1.so.0.0.0
……显然我确实安装了Lua 5.1.
那么,为什么我在这里使用tonumber会出错?我如何正确地在VLC lua扩展中使用这个(和其他)标准函数?
对于VLC Lua扩展,文档很少,至少可以说,但我确实在github vlc存储库中找到了一个示例: https://github.com/videolan/vlc/blob/master/share/lua/extensions/VLSub.lua从该示例来看,似乎您需要为您的插件提供一些基本事件功能,以便VLC在某些事件发生时调用.我注意到一些明显的回调处理程序:
> descriptor,这应该返回一个包含描述你的插件的字段的表.
>激活,当您从视图菜单栏激活它时,这似乎被调用.
>取消激活,从视图菜单栏停用插件时调用.
再加上一些其他函数,比如close和input_change,你可以猜出它们的用途.
根据我在Win7下对VLC 2.0.8进行的简短测试,看来VLC使用空的沙箱环境加载lua扩展.这可能是你因为吨数而得到零的原因而且我打赌当你尝试在这个全局范围内执行计算时,其他任何标准的lua函数都不可访问.
但是,如果我将该代码移动到其中一个事件处理函数中,则可以再次访问所有这些标准函数.例如:
function descriptor() return { title = "Test Ext"; version = "0.1"; author = ""; shortdesc = "Testing Lua Extension"; capabilities = {}; description = "VLC Hello Test Addon"; } end function activate() print "test activating" local fps = tonumber "25.000" local frame_duration = 1 / fps print(frame_duration) return true end -- ...
这将打印出您在控制台调试日志中所期望的内容.现在文档(它没有什么)没有提到任何这些,但是这里可能发生的是VLC在调用任何这些事件处理程序时将标准lua函数和vlc api表注入沙盒环境.但是在扩展加载阶段,它是在一个空的沙箱环境中完成的,这解释了为什么当你尝试在大多数范围内使用它时,所有这些lua函数调用最终都是nil.
我建议从github克隆VLC源代码树,然后在嵌入lua的C源代码上执行grep,看看VLC在幕后真正做了什么.大多数相关代码可能会在这里:https://github.com/videolan/vlc/tree/master/modules/lua