2016-12-24 2 views
5

Dans Media Player Classic, j'ai trouvé un moyen de passer à un point dans une vidéo/audio par programmation, en évitant la boîte Go To.... Les distances de saut sont disponibles à optionsTweaks, et HKEY_CURRENT_USER\Software\MPC-HC\MPC-HC\Settings (JumpDistL/JumpDistM/JumpDistS). Ce que je fais est de trouver les distances de saut dans l'espace d'adressage de Media Player Classic, et de définir la valeur de la grande distance de saut tels que que si vous l'appliquiez au temps écoulé vous obtiendriez l'heure désirée.media player classic - sauter vers un point dans la vidéo/l'audio par programme

J'envoyer alors un message WM_COMMAND avec le paramètre 903/904 (tous via AutoHotkey. Je reçois le temps écoulé en récupérant/analyse le contenu du Modifier contrôle.)

Parce que le saut est par rapport au point actuel, il est imprécis, et arrive dans une seconde du bon moment, mais n'arrive pas exactement au même point à chaque fois.

Y at-il une façon plus directe d'y parvenir et sinon, feriez tous les utilisateurs Media Player Classic/programmeurs envisager de discuter sur le forum, l'introduction de nouveaux WM_COMMAND messages qui permettent saut à un point (en millisecondes), ou qui récupèrent les valeurs numériques figurant here (state, position, duration, volumelevel, muted, playbackrate, reloadtime). (La méthode trouvée here est trop lente pour obtenir l'heure avec précision et nécessite des options spéciales).

+1

Il est déjà mis en œuvre par WM_COPYDATA, voir mpcapi.h dans le code source et [AutoIt exemple] (https://www.autoitscript.com/forum/topic/85354-media-player-classic-homecinema-mpc- remote-api-via-wm_copydata /) que vous pouvez extraire/convertir en AHK ou peut-être même trouver une lib existante. – wOxxOm

+2

En raison de la façon dont les données vidéo sont codées, il est peu probable que vous puissiez sauter à une position arbitraire avec une précision de l'ordre de la milliseconde. Vous ne pouvez pas redémarrer la lecture entre des images clés. – IInspectable

+1

Est-ce que cela fait une différence si vous désactivez l'option "recherche rapide" (également dans Tweaks)? Cette option permet à MPC de passer aux images clés au lieu de passer de la vidéo de l'image clé la plus proche au point sélectionné entre les images clés –

Répondre

4

Merci au message de wOxxOm, sous la question, j'ai pu créer ce script AutoHotkey, qui résout mon problème d'origine: pour régler le temps écoulé dans Media Player Classic programme, directement , sans utiliser la boîte Go To....

Il résout également le problème de récupération informations sur la vidéo.

Les raccourcis clavier sont les suivants:
- Ctrl + Q pour démarrer l'API MPC,
- Ctrl + W pour récupérer des informations,
- les touches numériques pour sauter à travers la vidéo à mi-chemin.

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

^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 

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

LIENS UTILES:

envoi de chaînes via SendMessage - Demande d'aide - AutoHotkey Communauté
https://autohotkey.com/board/topic/98334-sending-strings-via-sendmessage/

Media Player Classic - Homecinema MPC API à distance (via WM_COPYDATA) - AutoIt Exemple 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