2016-12-24 110 views
5

在Media Player Classic中,我找到了一種以編程方式跳轉到視頻/音頻中的點的方法,避免了Go To...框。 的跳躍距離可在選項調整菜譜方案, 和HKEY_CURRENT_USER\Software\MPC-HC\MPC-HC\SettingsJumpDistL/JumpDistM/JumpDistS)。媒體播放器經典 - 以編程方式跳轉到點視頻/音頻

我所做的是在Media Player Classic的地址空間中查找跳躍距離,並設置大跳躍距離的值如 ,如果將其應用於經過的時間,您將獲得所需的時間。

我然後發送一個WM_COMMAND消息參數903/904(所有經由AutoHotkey的。我得到通過檢索/解析編輯控制的內容的經過時間。)

由於跳躍相對到目前爲止,它不精確, ,並在一秒鐘內到達正確的時間,但不到達 每次完全相同的點。

有沒有實現這一點,如果沒有, 將任何媒體播放器經典用戶/程序員 考慮討論在論壇上,引入新的WM_COMMAND消息 允許跳至點(以毫秒爲單位)的更直接的方式, 或該檢索列出herestatepositiondurationvolumelevelmutedplaybackratereloadtime)的數值。 (發現here的方法太慢,無法準確獲得時間,需要設置特殊選項)。

+1

它已通過WM_COPYDATA實現,請參閱源代碼中的mpcapi.h和[autoit示例](https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc- remote-api-via-wm_copydata /),您可以將其轉換爲AHK或者甚至可以找到現有的lib。 – wOxxOm

+2

由於視頻數據的編碼方式,您不可能以毫秒級的精度跳轉到任意位置。您無法在關鍵幀之間重新開始播放。 – IInspectable

+1

如果您禁用「快速查找」選項(也在調整中),它會有所幫助嗎?此選項使MPC跳轉到關鍵幀,而不是從最近的關鍵幀到關鍵幀之間的選定點的視頻進度 –

回答

4

感謝來自wOxxOm消息,這個問題下面, 我已經能夠創建此AutoHotkey的腳本, 解決了我原來的問題: 以編程方式直接設置經過時間的媒體播放器經典, ,而無需使用Go To...框。

它還解決了檢索有關視頻信息的問題。

的熱鍵是:
- 按Ctrl + Q啓動MPC API,
- 按Ctrl + W檢索信息,
- 數字鍵通過視頻中途跳。

;================================================== 

^q:: ;start MPC API 
hWnd := A_ScriptHwnd+0 
OnMessage(WM_COPYDATA:=74, "On_WM_COPYDATA") 
;64-bit 
Run, "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\mpc-hc64.exe" /slave %hWnd% 
;32-bit 
;Run, "C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC\mpc-hc.exe" /slave %hWnd% 
Return 

;================================================== 

^w:: ;display information 
Send(vMPCApiHWnd, 0xA0003004, "") ;CMD_GETCURRENTPOSITION := 0xA0003004 

vElapsed := 19990101 
vDuration := 19990101 
vElapsed += vMPCApiCurrent, S 
vDuration += vMPCApiDuration, S 

if (vMPCApiCurrent >= 3600) OR (vMPCApiDuration >= 3600) 
vFormat := "HH:mm:ss" 
else 
vFormat := "mm:ss" 

FormatTime, vElapsed, %vElapsed%, %vFormat% 
FormatTime, vDuration, %vDuration%, %vFormat% 

SplitPath, vMPCApiPath, vName, vDir, vExt, vNameNoExt, vDrive 

vText = ;continuation section 
(
title: %vMPCApiTitle% 
author: %vMPCApiAuthor% 
description: %vMPCApiDesc% 
name: %vName% 
path: %vMPCApiPath% 
elapsed: %vElapsed% (%vMPCApiCurrent%) 
duration: %vDuration% (%vMPCApiDuration%) 
) 

MsgBox %vText% 
Return 

;================================================== 

#IfWinActive, ahk_class MediaPlayerClassicW 
0:: ;skip to point 
1:: 
2:: 
3:: 
4:: 
5:: 
6:: 
7:: 
8:: 
9:: 
vNum := SubStr(A_ThisHotkey, 1-1) 
vElapsed2 := Round(vMPCApiDuration*(vNum/10)) 

Send(vMPCApiHWnd, 0xA0002000, "" vElapsed2) ;CMD_SETPOSITION := 0xA0002000 
Return 
#IfWinActive 

;================================================== 

On_WM_COPYDATA(wParam, lParam, msg, hwnd) 
{ 
global vMPCApiHWnd 
global vMPCApiTitle 
global vMPCApiAuthor 
global vMPCApiDesc 
global vMPCApiPath 
global vMPCApiDuration 
global vMPCApiCurrent 

dwData := NumGet(lParam+0, 0) 
cbData := NumGet(lParam+A_PtrSize) 
lpData := NumGet(lParam + 2*A_PtrSize) 
lpData := StrGet(lpData) 

if (dwData = 0x50000000) ;CMD_CONNECT := 0x50000000 
{ 
vMPCApiHWnd := lpData 
WinGetClass, vWinClass, ahk_id %vMPCApiHWnd% 
if (vWinClass = "MediaPlayerClassicW") 
MsgBox, , , MPC API on, 3 
} 

if (dwData = 0x50000003) ;CMD_NOWPLAYING := 0x50000003 
{ 
StringSplit, lpData, lpData, | 
vMPCApiTitle := lpData1 
vMPCApiAuthor := lpData2 
vMPCApiDesc := lpData3 
vMPCApiPath := lpData4 
vMPCApiDuration := lpData5 
} 

if (dwData = 0x50000007) ;CMD_CURRENTPOSITION := 0x50000007 
vMPCApiCurrent := lpData 

Return true 
} 

;================================================== 

Send(Hwnd, dwData, lpData) 
{ 
static WM_COPYDATA := 0x4a 

VarSetCapacity(COPYDATASTRUCT, 3*A_PtrSize, 0) 
cbData := (StrLen(lpData) + 1) * (A_IsUnicode ? 2 : 1) 
NumPut(dwData, COPYDATASTRUCT, 0) 
NumPut(cbData, COPYDATASTRUCT, A_PtrSize) 
NumPut(&lpData, COPYDATASTRUCT, 2*A_PtrSize) 

SendMessage, % WM_COPYDATA, % A_ScriptHwnd , &COPYDATASTRUCT,, % "ahk_id " Hwnd 
return ErrorLevel == "FAIL" ? false : true 
} 

;================================================== 

;USEFUL LINKS 
;Sending Strings Via SendMessage - Ask for Help - AutoHotkey Community 
;https://autohotkey.com/board/topic/98334-sending-strings-via-sendmessage/ 

;Media Player Classic - Homecinema MPC remote API (via WM_COPYDATA) - AutoIt Example Scripts - AutoIt Forums 
;https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc-remote-api-via-wm_copydata/ 

;mpcapi.h 
;https://raw.githubusercontent.com/jeeb/mpc-be/master/src/apps/mplayerc/mpcapi.h 

;winapi - media player classic - jump to point in video/audio programmatically - Stack Overflow 
;http://stackoverflow.com/questions/41310778/media-player-classic-jump-to-point-in-video-audio-programmatically 

;================================================== 

有用的鏈接:

發送字符串通過SendMessage函數 - 尋求幫助 - AutoHotkey的社區
https://autohotkey.com/board/topic/98334-sending-strings-via-sendmessage/

媒體播放器經典 - Homecinema MPC遠程API(通過WM_COPYDATA) - 的AutoIt腳本示例 - AutoIt的論壇
https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc-remote-api-via-wm_copydata/

mpcapi.h
https://raw.githubusercontent.com/jeeb/mpc-be/master/src/apps/mplayerc/mpcapi.h

相關問題