gpt4 book ai didi

lua - Lua 中的 "attempt to call global ' 到编号 ' (a nil value)",嵌入(在 VLC 中)

转载 作者:行者123 更新时间:2023-12-03 21:02:52 25 4
gpt4 key购买 nike

我在 Ubuntu 11.04 上使用 VLC 媒体播放器 1.1.9。我正在尝试使用 lua VLC 的扩展;所以我添加了文件test.lua~/.local/share/vlc/lua/extensions/ ,它只有这两行:

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)
...

现在,据我所知, tonumber as 函数是 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 ,这应该返回一个表,其中包含描述您的插件的字段。
  • activate ,当您从 view 激活它时似乎会调用它菜单栏。
  • deactivate ,当您从 view 停用插件时调用菜单栏。

  • 加上一些其他功能,如 closeinput_change你可以猜到它们的用途。

    从我在 Win7 下对 VLC 2.0.8 进行的简短测试来看,VLC 似乎使用空沙箱环境加载 lua 扩展。这可能是您获得 nil 的原因对于 tonumber我敢打赌,当您尝试在此全局范围内执行计算时,其他标准 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 正在注入(inject)标准 lua 函数和 vlc当任何这些事件处理程序被调用时,将 api 表放入沙盒环境。但是在扩展加载阶段,它是在一个空的沙箱环境中完成的,这就解释了为什么所有这些 lua 函数调用最终都是 nil。当您尝试在最外面的范围内使用它时。

    我建议从 github 克隆 VLC 源代码树,然后对嵌入 lua 的 C 源代码执行 grep,以查看 VLC 在幕后的实际操作。大多数相关代码可能会在这里: https://github.com/videolan/vlc/tree/master/modules/lua

    关于lua - Lua 中的 "attempt to call global ' 到编号 ' (a nil value)",嵌入(在 VLC 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122687/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com