如何通过VBA调用VLC并获取当前播放时长?
用VBA控制VLC并获取当前播放时长的可行方案
我刚好做过类似的需求,给你两个靠谱的方案,亲测有效:
方案一:VLC HTTP Web接口(推荐,最稳定)
VLC自带了HTTP远程控制接口,通过它可以轻松获取播放状态、当前时长等信息,完全不需要依赖Lua脚本。
1. 用命令行启动带Web接口的VLC
在VBA里通过Shell命令启动VLC时,加上启用Web接口的参数,就能直接开启远程控制能力:
Dim vlcPath As String Dim vlcArgs As String Dim shellCmd As String ' 替换成你的VLC安装路径 vlcPath = "C:\Program Files\VideoLAN\VLC\vlc.exe" ' 参数说明: ' --extraintf=http:启用HTTP远程接口 ' --http-password=myvlcpwd:设置接口访问密码(避免未授权访问) ' --play-and-exit:播放完成后自动退出VLC(可根据需求去掉) vlcArgs = "--extraintf=http --http-password=myvlcpwd --play-and-exit ""C:\your_video_file.mp4""" shellCmd = """" & vlcPath & """ " & vlcArgs ' 启动VLC Shell shellCmd, vbNormalFocus
2. VBA中通过HTTP请求获取当前播放时间
使用MSXML2.XMLHTTP发送请求到VLC的状态接口,解析返回的XML就能拿到当前播放秒数:
Function GetVLCPlaybackTime() As Double Dim xmlHttp As Object Dim statusXml As Object Dim timeNode As Object Set xmlHttp = CreateObject("MSXML2.XMLHTTP") ' 发送GET请求,替换密码为你刚才设置的内容 xmlHttp.Open "GET", "http://localhost:8080/requests/status.xml", False, "", "myvlcpwd" xmlHttp.send If xmlHttp.Status = 200 Then Set statusXml = CreateObject("MSXML2.DOMDocument") statusXml.LoadXML xmlHttp.responseText ' 从XML中提取当前播放时间(秒) Set timeNode = statusXml.SelectSingleNode("//time") If Not timeNode Is Nothing Then GetVLCPlaybackTime = CDbl(timeNode.Text) Else GetVLCPlaybackTime = -1 ' 表示当前未在播放 End If Else GetVLCPlaybackTime = -2 ' 请求失败,可能VLC未启动或接口未开启 End If ' 释放对象 Set xmlHttp = Nothing Set statusXml = Nothing Set timeNode = Nothing End Function
你可以用Application.OnTime设置定时器,定时调用这个函数来实时获取播放时长。
方案二:修正Lua脚本的加载方式(如果你偏好Lua)
你之前说Lua脚本没法通过命令行加载,其实是参数用错了。VLC支持通过--lua-intf参数直接加载Lua脚本,步骤如下:
1. 编写Lua脚本(定时写入播放时间到文件)
创建一个vlc_time_logger.lua文件,内容如下:
function log_current_time() -- 获取当前播放状态和时间(秒) local playback_time = vlc.playlist.status() == "playing" and vlc.var.get(vlc.object.input(), "time") or -1 -- 写入到指定文件 local file = io.open("C:\\vlc_playback_time.txt", "w") if file then file:write(tostring(playback_time)) file:close() end -- 每秒执行一次 vlc.timer.add(1000, log_current_time) end -- 启动定时任务 log_current_time()
2. 命令行加载Lua脚本启动VLC
在VBA的Shell命令里加上--lua-intf参数:
Dim vlcPath As String Dim vlcArgs As String Dim shellCmd As String vlcPath = "C:\Program Files\VideoLAN\VLC\vlc.exe" ' --lua-intf=vlc_time_logger.lua:加载指定的Lua脚本 vlcArgs = "--lua-intf=vlc_time_logger.lua ""C:\your_video_file.mp4""" shellCmd = """" & vlcPath & """ " & vlcArgs Shell shellCmd, vbNormalFocus
3. VBA读取文件获取时间
写一个简单的函数读取文件内容:
Function GetVLCPlaybackTimeFromFile() As Double Dim fileNum As Integer Dim timeStr As String fileNum = FreeFile() On Error Resume Next Open "C:\vlc_playback_time.txt" For Input As #fileNum If Err.Number = 0 Then Line Input #fileNum, timeStr GetVLCPlaybackTimeFromFile = CDbl(timeStr) Else GetVLCPlaybackTimeFromFile = -1 ' 文件读取失败或未播放 End If Close #fileNum End Function
不过这个方法要注意文件读写的锁问题,不如HTTP接口稳定。
额外注意事项
- 如果8080端口被占用,可以用
--http-port=xxxx参数指定其他端口(比如--http-port=8081) - 第一次使用Web接口时,也可以手动在VLC设置里开启:工具->偏好->界面->主界面->勾选“Web界面”,不过命令行参数
--extraintf=http会强制开启,无需手动设置
内容的提问来源于stack exchange,提问作者user3701730
相关产品推荐
相关产品推荐

