Skip to content

JavaScript ​

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

JavaScript 基础 ​

脚本结构 ​

javascript
// JavaScript 脚本基本结构
mp.add_key_binding('ctrl+s', 'screenshot', function() {
    mp.command('screenshot');
});

常用模块 ​

javascript
// mp 模块
// 自动可用,无需 require

// 消息模块
mp.msg.info('Info message');

快捷键绑定 ​

添加快捷键 ​

javascript
// 添加快捷键
mp.add_key_binding('ctrl+s', 'screenshot', function() {
    mp.command('screenshot');
});

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

鼠标绑定 ​

javascript
// 鼠标绑定
mp.add_key_binding('MBTN_LEFT', 'toggle-pause', function() {
    mp.command('cycle pause');
});

属性操作 ​

获取属性 ​

javascript
// 获取属性
const title = mp.get_property('media-title');
const volume = mp.get_property_number('volume');
const paused = mp.get_property_bool('pause');

设置属性 ​

javascript
// 设置属性
mp.set_property('volume', 80);
mp.set_property_number('volume', 80);
mp.set_property_bool('pause', true);

监听属性变化 ​

javascript
// 监听属性变化
mp.observe_property('volume', 'number', function(name, value) {
    mp.msg.info('Volume changed: ' + value);
});

命令执行 ​

执行命令 ​

javascript
// 执行命令
mp.command('seek 10');
mp.command('cycle pause');
mp.command('set volume 80');

命令参数 ​

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

事件处理 ​

事件监听 ​

javascript
// 文件加载事件
mp.register_event('file-loaded', function() {
    mp.msg.info('File loaded');
});

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

事件类型 ​

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

OSD 显示 ​

显示消息 ​

javascript
// 显示 OSD 消息
mp.osd_message('Hello World', 2);

// 显示属性
const title = mp.get_property('media-title');
mp.osd_message('Title: ' + title, 3);

自定义 OSD ​

javascript
// 自定义 OSD
mp.add_key_binding('ctrl+o', 'show-info', function() {
    const title = mp.get_property('media-title');
    const time = mp.get_property('time-pos');
    mp.osd_message(`Title: ${title}\nTime: ${time}`, 3);
});

定时器 ​

定时器设置 ​

javascript
// 定时器
mp.add_periodic_timer(1, function() {
    mp.msg.info('Timer tick');
});

// 单次定时器
mp.add_timeout(5, function() {
    mp.msg.info('Timeout');
});

调试 ​

调试信息 ​

javascript
// 调试信息
mp.msg.info('Info message');
mp.msg.warn('Warning message');
mp.msg.error('Error message');

// OSD 调试
mp.osd_message('Debug: ' + value);

脚本测试 ​

bash
# 测试 JavaScript 脚本
mpv --script=file.js video.mp4

下一步 ​