Ahk + mpv

测试用 ahk 调用 libmpv 完全OK。我打算写个纯VIM式操控的播放器。
我苦各播放器的简陋接口久矣,获取当前视频的路径都TM千难万难。
我要写三套不同接口,窗口消息命名管道ZMQ都用上。。
我还要写播放器会话,批量恢复视频。。

ui:=gui("-Caption +AlwaysOnTop +ToolWindow -DPIScale")
DllCall("LoadLibrary", "str", "mpv.dll","Cdecl UPtr")
mpv:=DllCall("mpv.dll\mpv_create","Cdecl UPtr")

DllCall("mpv.dll\mpv_set_option","ptr", mpv, "astr", "wid","int64", 4, "ptrp", &j:=ui.hwnd, "Cdecl int")

S1 := "loadfile"
S2 := "Z:\2.mp4"
l1 := StrPut(s1, "cp0")
l2 := StrPut(s2, "utf-8")
buf := Buffer(3 * A_Ptrsize + l1 + l2)
StrPut(s1, pl := buf.Ptr + 3 * A_Ptrsize, "cp0")
StrPut(s2, p2 := pl + 11, "utf-8")
NumPut("ptr", pl, "ptr", p2, "ptr", 0, buf)
DllCall("mpv.dll\mpv_initialize","ptr", mpv, "Cdecl int")
DllCall("mpv.dll\mpv_command_async","ptr", mpv, "int", 0, "ptr", buf.ptr, "Cdecl UPtr")
ui.show("w2800 h1620")
1 个赞

->mpv_create,创建实例。

->mpv_set_option,设置播放句柄。

->mpv_set_property,设置属性。

->mpv_set_option,设置参数。

->mpv_initialize,初始化实例。

->mpv_command_async,拉流。

->mpv_terminate_destroy,释放实例。

你可以基于如下官方提供的手册来为它添加其他功能。

@foyax 谢谢你分享的代码和资料!
现在有个问题,mpv.dll 和 mpv.exe 不一样,它不接受按键发送,无法显示 osc 控制面板,请问你是如何解决的?
另外,能让它执行 mpv.conf 配置吗?

我是禁用了 mpv 显示视频之外其他交互的,所有需要的信息通过主动获取或者回调接收。
启用 mpv 的交互也简单,不设置 AutoHotkey 窗口作为容器就行了。这样除了没有 mpv 进程就和普通 mpv 没有区别,热键应该也会生效。

设置配置:
DllCall(“libmpv-2.dll\mpv_set_option_string”, “ptr”, g_mpv, “astr”, “include”, “ptr”, StrBuf(“mpv.conf”), “Cdecl int”)

1 个赞

谢谢!很高兴这么快的回复 :)
你说的方法,我需要花些时间去弄明白,以前写过调用mpv.exe的脚本,这跟调用dll有很多不同。

呵,加载配置文件生效了。
mpv_set_opt_st(mpvhd, “include”, “mpv.conf”)

但是,不管是否绑定 AHK 窗口,mpv 都不响应按键,osc 也显示不出来。

找到一些资料, 加入下面三项设置,不绑定 AHK 窗口,可以响应按键,显示 osc,基本与直接运行 mpv.exe 无异,就是点击窗口关闭按钮时,不能正常关闭。

mpv_set_option_string(mpv, "input-default-bindings", "yes")   ;启用默认的按键绑定
mpv_set_option_string(mpv, "input-vo-keyboard", "yes")        ;启用 X11 窗口的键盘输入
mpv_set_option_string(mpv, "osc", "yes")

如果绑定 AHK 窗口,能接收到 ControlSend 发送的按键,不能显示 osc

说到 gui程序控制命令行的视频播放,
作为QQ影音3.9的用户,因为它很多新格式不支持了,支持多一点的potplayer又没有画面x1、x2的快捷按钮,而且目录里视频列表连刷新功能都没有,很想写个gui程序操控mpv或vlc。
不知道mpv/vlc打开的视频播放窗口,是否支持被别的gui程序接管?
完整过程是:gui程序选择文件开始播放,播放窗口也在gui程序的主窗口里,另外还有一些快捷按钮:画面x1,x2,全屏,播放速度x1,x2,目录里的视频列表和刷新、排序按钮,标准的进度条及其操作功能

可以的,参考顶楼的代码,新建一个窗口,然后把 mpv 绑定到这个窗口

看来mpv可以,就可以先查一下它的使用方式。。。。