You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt/C++应用中能否通过libmpv C/C++ API设置自定义按键绑定?

解决Qt/C++中libmpv自定义按键绑定的无依赖方案

你不需要修改mpv源码,也不用依赖input.conf或Lua脚本,核心思路是禁用mpv自身的键盘输入处理,在Qt层全权接管键盘事件并直接调用libmpv API执行操作,具体实现步骤如下:

1. 初始化mpv时禁用默认键盘处理

通过libmpv的选项API关闭mpv自带的键盘绑定和VO层键盘输入,确保mpv不会拦截按键事件:

mpv_handle *mpv = mpv_create();
if (!mpv) {
    // 错误处理逻辑
}

// 禁用mpv默认按键绑定
mpv_set_option_string(mpv, "input-default-bindings", "no");
// 禁止mpv处理视频输出层的键盘事件
mpv_set_option_string(mpv, "input-vo-keyboard", "no");

if (mpv_initialize(mpv) < 0) {
    // 初始化失败处理
}

2. 用Qt事件过滤器接管键盘事件

重写Qt控件的事件过滤器,捕捉所有键盘事件(即使mpv嵌入窗口抢占焦点也能处理),根据按键调用对应的mpv命令:

class PlayerWidget : public QWidget {
    Q_OBJECT
public:
    PlayerWidget(QWidget *parent = nullptr) : QWidget(parent) {
        // 初始化mpv并嵌入到当前控件(例如通过mpv_set_option_int设置wid)
        installEventFilter(this);
    }

private:
    mpv_handle *mpv = nullptr; // 已初始化的mpv句柄

    bool eventFilter(QObject *watched, QEvent *event) override {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
            // 自定义按键逻辑,示例如下
            switch (keyEvent->key()) {
                case Qt::Key_Space:
                    // 切换播放/暂停
                    mpv_command(mpv, (const char*[]){"cycle", "pause", nullptr});
                    return true; // 阻止事件传递给其他控件
                case Qt::Key_Right:
                    // 快进10秒
                    mpv_command(mpv, (const char*[]){"seek", "10", "relative", nullptr});
                    return true;
                case Qt::Key_Left:
                    // 后退10秒
                    mpv_command(mpv, (const char*[]){"seek", "-10", "relative", nullptr});
                    return true;
                case Qt::Key_Up:
                    // 音量+5%
                    mpv_command(mpv, (const char*[]){"add", "volume", "5", nullptr});
                    return true;
                case Qt::Key_Down:
                    // 音量-5%
                    mpv_command(mpv, (const char*[]){"add", "volume", "-5", nullptr});
                    return true;
                // 添加更多自定义按键绑定
                default:
                    break;
            }
        }
        return QWidget::eventFilter(watched, event);
    }
};

3. 补充说明

  • 该方案完全基于libmpv的C API和Qt事件系统,无需外部配置文件或Lua脚本,也不需要修改mpv源码。
  • 如果需要处理组合键(如Ctrl+S),可以通过keyEvent->modifiers()判断修饰键状态。
  • 若只想在播放器窗口激活时处理按键,可在事件过滤中增加isActiveWindow()判断。

内容的提问来源于stack exchange,提问作者luis agreda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:43:32