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下一步
- JavaScript - JavaScript 脚本开发
- JSON IPC - JSON IPC 接口
- 嵌入其他程序 - libmpv 嵌入