Skip to content

C 插件

本节介绍 mpv 的 C 插件开发。

插件基础

头文件

c
#include <mpv/plugin.h>

插件入口

c
// 插件入口点
int mpv_open_cplugin(mpv_handle *ctx) {
    // 插件逻辑
    return 0;
}

插件功能

快捷键绑定

c
// 添加快捷键
mpv_observe_property(ctx, 0, "volume", MPV_FORMAT_INT64, property_change_cb);

属性操作

c
// 获取属性
int64_t volume;
mpv_get_property(ctx, "volume", MPV_FORMAT_INT64, &volume);

// 设置属性
int64_t volume = 80;
mpv_set_property(ctx, "volume", MPV_FORMAT_INT64, &volume);

命令执行

c
// 执行命令
mpv_command(ctx, (const char*[]){"seek", "10", NULL});

插件回调

属性变化回调

c
// 属性变化回调
void property_change_cb(void *data, mpv_event_property *prop) {
    if (prop->format == MPV_FORMAT_INT64) {
        int64_t value = *(int64_t *)prop->data;
        printf("Volume changed: %ld\n", value);
    }
}

事件回调

c
// 事件回调
mpv_event *event = mpv_wait_event(ctx, 1000);
switch (event->event_id) {
    case MPV_EVENT_FILE_LOADED:
        printf("File loaded\n");
        break;
    case MPV_EVENT_END_FILE:
        printf("Playback ended\n");
        break;
}

插件编译

编译选项

bash
# 编译插件
gcc -shared -o plugin.so plugin.c -lmpv

# 链接
gcc -shared -o plugin.so plugin.c $(pkg-config --cflags --libs mpv)

CMake 配置

cmake
find_package(PkgConfig)
pkg_check_modules(MPV REQUIRED mpv)

add_library(plugin SHARED plugin.c)
target_link_libraries(plugin ${MPV_LIBRARIES})
target_include_directories(plugin PRIVATE ${MPV_INCLUDE_DIRS})

插件加载

加载插件

bash
# 加载插件
mpv --script=plugin.so video.mp4

# 插件目录
~/.config/mpv/scripts/

示例插件

简单插件

c
#include <mpv/plugin.h>
#include <stdio.h>

int mpv_open_cplugin(mpv_handle *ctx) {
    printf("Plugin loaded\n");
    
    // 添加快捷键
    mpv_observe_property(ctx, 0, "volume", MPV_FORMAT_INT64, 
        [](void *data, mpv_event_property *prop) {
            if (prop->format == MPV_FORMAT_INT64) {
                int64_t volume = *(int64_t *)prop->data;
                printf("Volume: %ld\n", volume);
            }
        }
    );
    
    // 事件循环
    while (1) {
        mpv_event *event = mpv_wait_event(ctx, 1000);
        if (event->event_id == MPV_EVENT_SHUTDOWN)
            break;
    }
    
    printf("Plugin unloaded\n");
    return 0;
}

调试

调试信息

c
// 调试信息
printf("Plugin loaded\n");

// 错误处理
int result = mpv_command(ctx, args);
if (result < 0) {
    printf("Error: %s\n", mpv_error_string(result));
}

插件测试

bash
# 测试插件
mpv --script=plugin.so video.mp4

故障排除

常见问题

  1. 插件加载失败

    • 检查插件路径
    • 检查插件权限
  2. 插件功能异常

    • 检查插件逻辑
    • 检查插件回调
  3. 插件编译错误

    • 检查头文件路径
    • 检查链接库

调试命令

bash
# 显示插件信息
mpv --msg-level=all=v video.mp4

# 测试插件
mpv --script=plugin.so video.mp4

下一步