在文件中跳转到特定的时间?

我正在试图制作一个 VLC 脚本,检查是否打开了“随机”按钮,如果是,则在跳转到随机文件时,以随机时间而非time=0开始。

到目前为止,它看起来应该是一个播放列表脚本,我可以从播放列表对象中获得持续时间,但是在此文档页面中没有显示如何从 Lua 脚本内跳转到特定时间。

如何在 Lua 中进行操作?

原文链接 https://stackoverflow.com/questions/6012921

点赞
stackoverflow用户211160
stackoverflow用户211160

实际上,文档确实说你可以这样做…虽然没有直接说明。以下是关于播放列表解析器接口的说明:

VLC Lua 播放列表模块应该定义两个函数:
   * probe():如果我们想要在此脚本中处理播放列表,则返回 true
   * parse():读取传入的数据并返回播放列表项
        播放列表项的格式与期望的 playlist.add() 函数相同(请参见常规 lua/README.txt)

如果你继续阅读有关 playlist.add() 的描述,它会说这些项有一个你可以提供的字段的大列表。有很多选择(如 .name.title.artist 等),但唯一必需的似乎是 .path… 它是“该项的完整路径/URL”。

虽然未明确提及查找位置,但你可以选择提供的参数之一是 .options,它被称为“VLC 选项列表”。它以 fullscreen 为例。如果 --fullscreen 的对应物有效,那么其他命令行选项,如 --start-time--stop-time,也能有效吗?

在我的系统上,它们是有效的,这是脚本!

-- randomseek.lua
--
-- 对于你的系统类型,这个文件的编译版本(.luac)应该被放置在正确的 VLC 播放列表解析器目录中。参见:
--
--   http://wiki.videolan.org/Documentation:Play_HowTo/Building_Lua_Playlist_Scripts
--
-- 文件格式非常简单,只是交替的文件名和时间长度,例如,如果你有一个名为“example.randomseek”的文件,
-- 它可能包含以下内容:
--
--     foo.mp4
--     3:04
--     bar.mov
--     10:20
--
-- 它只是会查找文件中的任意位置,并随机播放剩余时间的任意量。

function probe()
    -- 由于其他 VLC lua 插件似乎没有,因此种植随机数
    math.randomseed(os.time())

    -- 告诉 VLC 我们将处理以 ".randomseek" 结尾的任何内容 
    return string.match(vlc.path, ".randomseek$")
end

function parse()
    -- VLC 希望我们返回一个条目列表,每个条目本身是一个属性列表
    playlist = {}

    -- 我假设输入文件格式良好,但显然,如果你写真正的东西,你应该进行错误检查
    while true do
       playlist_item = {}

       line = vlc.readline()
       if line == nil then
           break --错误处理放在这里
       end

       playlist_item.path = line

       line = vlc.readline()
       if line == nil then
           break --错误处理放在这里
       end

       for _min, _sec in string.gmatch( line, "(%d*):(%d*)" )
           do
               duration = 60 * _min + _sec
           end

       -- 带有整数参数的 math.random 返回一个介于传递的数字之间的整数,包括其自身,VLC 使用基于零的时间
       start_time = math.random(duration) - 1
       stop_time = math.random(start_time, duration - 1)

       -- 给观众一个提示,说明剪辑需要多长时间
       playlist_item.duration = stop_time - start_time

       -- 播放列表项有另一个列表,其中包含选项
       playlist_item.options = {}
       table.insert(playlist_item.options, "start-time="..tostring(start_time))
       table.insert(playlist_item.options, "stop-time="..tostring(stop_time))
       table.insert(playlist_item.options, "fullscreen")

       -- 将项添加到播放列表中
       table.insert( playlist, playlist_item )
    end

    return playlist
end
2011-09-14 04:54:15
stackoverflow用户2510178
stackoverflow用户2510178

只需要使用这个:

vlc.var.set(input, "time", time)
2013-06-21 19:23:31
stackoverflow用户327301
stackoverflow用户327301

common.lua 中有一个 seek 方法。

使用示例:

require 'common'
common.seek(123) -- 定位到 02m03s
common.seek("50%") -- 定位到视频中间
2015-06-16 15:06:20