2016-12-24 107 views
5

W programie Media Player Classic znalazłem sposób, aby programowo przeskoczyć do punktu w pliku audio/wideo, omijając pole Go To.... Odległości jump dostępne są w OpcjeTweaks, i HKEY_CURRENT_USER\Software\MPC-HC\MPC-HC\Settings (JumpDistL/JumpDistM/JumpDistS).odtwarzacz multimedialny classic - programowo przeskakuje do punktu wideo/audio

To, co robię, to znajdowanie odległości skoków w przestrzeni adresowej Media Player Classic i ustawienie wartości dużej odległości skoku, takiej jak , która została zastosowana do czasu, w którym uzyskałby pożądany czas.

Następnie wysłać wiadomość WM_COMMAND parametrem 903/904 (wszystko przez AutoHotkey. Mam czas, jaki upłynął od pobrania/analizowania zawartości Edycja Control).

Ponieważ skok jest względna do bieżącego punktu jest nieprecyzyjny, i przybywa w ciągu sekundy we właściwym czasie, ale nie przybywa dokładnie za każdym razem w tym samym punkcie.

Czy istnieje bardziej bezpośredni sposób realizacji tego a jeśli nie, byłoby żadnych Media Player Classic użytkowników/programistów rozważyć dyskusji na forum, wprowadzając nowe WM_COMMAND wiadomości umożliwiające skok do punktu (w milisekundach), lub pobierające wartości liczbowe wymienione here (state, position, duration, volumelevel, muted, playbackrate, reloadtime). (Metoda znaleziona here jest zbyt wolna, aby uzyskać dokładny czas i wymaga ustawienia specjalnych opcji).

+1

jest już realizowane poprzez WM_COPYDATA patrz mpcapi.h w kodzie źródłowym oraz [Autoita przykład] (https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc- remote-api-via-wm_copydata /), które możesz zgrać/przekonwertować do AHK, a może nawet znaleźć istniejącą bibliotekę. – wOxxOm

+2

Ze względu na sposób kodowania danych wideo jest mało prawdopodobne, że można przeskoczyć do dowolnej pozycji z dokładnością do milisekund. Nie można wznowić odtwarzania pomiędzy klatkami kluczowymi. – IInspectable

+1

Czy to ma znaczenie, jeśli wyłączysz opcję "szybkiego wyszukiwania" (także w poprawkach)? Ta opcja powoduje, że MPC przeskakuje do klatek kluczowych zamiast przesuwać wideo z najbliższej klatki kluczowej do wybranego punktu pomiędzy klatkami kluczowymi –

Odpowiedz

4

Dzięki wiadomości od wOxxOm poniżej pytania, udało mi się stworzyć skrypt AutoHotkey, który rozwiązuje mój oryginalny problem: aby ustawić czas, który upłynął w Media Player Classic programowo, bezpośrednio, bez korzystania pole Go To....

Rozwiązuje również problem pobierania informacji o filmie o wartości .

skrótu to:
- Ctrl + Q zacząć API RPP,
- Ctrl + W do pobierania informacji,
- klawisze numeryczne, aby przeskoczyć partway poprzez wideo.

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

^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 

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

PRZYDATNE LINKI:

Wysyłanie Struny Via SendMessage - Poproś o pomoc - AutoHotkey Wspólnotę
https://autohotkey.com/board/topic/98334-sending-strings-via-sendmessage/

Media Player Classic - Home Cinema RPP zdalnego API (przez WM_COPYDATA) - AutoIt Przykładowe skrypty - AutoIt Fora
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