Skip to content

Lua 脚本

本节介绍 mpv 的 Lua 脚本开发。

Lua 基础

脚本结构

lua
-- Lua 脚本基本结构
local mp = require 'mp'

-- 脚本逻辑
mp.add_key_binding('ctrl+s', 'screenshot', function()
    mp.command('screenshot')
end)

常用模块

lua
-- mp 模块
local mp = require 'mp'

-- utils 模块
local utils = require 'mp.utils'

-- msg 模块
local msg = require 'mp.msg'

快捷键绑定

添加快捷键

lua
-- 添加快捷键
mp.add_key_binding('ctrl+s', 'screenshot', function()
    mp.command('screenshot')
end)

-- 带参数的快捷键
mp.add_key_binding('ctrl+o', 'show-info', function()
    local title = mp.get_property('media-title')
    mp.osd_message('Title: ' .. title)
end)

鼠标绑定

lua
-- 鼠标绑定
mp.add_key_binding('MBTN_LEFT', 'toggle-pause', function()
    mp.command('cycle pause')
end)

属性操作

获取属性

lua
-- 获取属性
local title = mp.get_property('media-title')
local volume = mp.get_property_number('volume')
local paused = mp.get_property_bool('pause')

设置属性

lua
-- 设置属性
mp.set_property('volume', 80)
mp.set_property_number('volume', 80)
mp.set_property_bool('pause', true)

监听属性变化

lua
-- 监听属性变化
mp.observe_property('volume', 'number', function(name, value)
    mp.msg.info('Volume changed: ' .. value)
end)

命令执行

执行命令

lua
-- 执行命令
mp.command('seek 10')
mp.command('cycle pause')
mp.command('set volume 80')

命令参数

lua
-- 带参数的命令
mp.commandv('seek', 10)
mp.commandv('set', 'volume', 80)
mp.commandv('screenshot-to-file', 'frame.png')

事件处理

事件监听

lua
-- 文件加载事件
mp.register_event('file-loaded', function()
    mp.msg.info('File loaded')
end)

-- 播放结束事件
mp.register_event('end-file', function()
    mp.msg.info('Playback ended')
end)

事件类型

lua
-- 常用事件
mp.register_event('file-loaded', callback)
mp.register_event('end-file', callback)
mp.register_event('shutdown', callback)

OSD 显示

显示消息

lua
-- 显示 OSD 消息
mp.osd_message('Hello World', 2)

-- 显示属性
local title = mp.get_property('media-title')
mp.osd_message('Title: ' .. title, 3)

自定义 OSD

lua
-- 自定义 OSD
mp.add_key_binding('ctrl+o', 'show-info', function()
    local title = mp.get_property('media-title')
    local time = mp.get_property('time-pos')
    mp.osd_message(string.format('Title: %s\nTime: %s', title, time), 3)
end)

文件操作

读取文件

lua
-- 读取文件
local file = io.open('data.txt', 'r')
if file then
    local content = file:read('*all')
    file:close()
end

写入文件

lua
-- 写入文件
local file = io.open('data.txt', 'w')
if file then
    file:write('Hello World')
    file:close()
end

定时器

定时器设置

lua
-- 定时器
mp.add_periodic_timer(1, function()
    mp.msg.info('Timer tick')
end)

-- 单次定时器
mp.add_timeout(5, function()
    mp.msg.info('Timeout')
end)

调试

调试信息

lua
-- 调试信息
mp.msg.info('Info message')
mp.msg.warn('Warning message')
mp.msg.error('Error message')

-- OSD 调试
mp.osd_message('Debug: ' .. value)

脚本测试

bash
# 测试 Lua 脚本
mpv --script=file.lua video.mp4

下一步