“试图在Lua中嵌入(在VLC中)调用全局’tonumber'(零值)

我在Ubuntu 11.04上使用VLC媒体播放器1.1.9.我正在尝试为VLC试验lua扩展;所以我在〜/ .local / share / vlc / lua / extensions /中添加文件test.lua,它只有这两行:
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

相关文章

1.进入lua官网http://www.lua.org/ 2.点击download 3.点击get a binary 4.点击[Lua - joedf's ...
    Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型...
    并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制。大致上...
    Lua5.0的语法非常简洁,这从参考手册中的语法定义的规模(转换成标准BNF形式大概有100个左右的产...
LUA脚本文档中文翻译(基础)   介绍   Lua读作“鹿啊”,是一种据创作者说的类Pascal脚本语言。巴西...
1. 函数的使用 以下程序演示了如何在Lua中使用函数, 及局部变量 例e02.lua -- functions function pyth...