5 votes

media player classic - sauter à un point précis de la vidéo/audio par programmation

Dans Media Player Classic, j'ai trouvé un moyen de sauter à un point dans une vidéo/audio de façon programmatique, en évitant la fonction Go To... boîte. Les distances de saut sont disponibles à OptionsTweaks , et HKEY_CURRENT_USER\Software\MPC-HC\MPC-HC\Settings ( JumpDistL / JumpDistM / JumpDistS ).

Ce que je fais, c'est trouver les distances de saut dans l'espace d'adressage de Media Player Classic, et définir la valeur de la grande distance de saut comme suit que si vous l'appliquez au temps écoulé, vous obtiendrez le temps souhaité.

J'envoie ensuite un WM_COMMAND message avec paramètre 903 / 904 (tout cela via AutoHotkey. J'obtiens le temps écoulé en récupérant/analysant le contenu de la balise Edit contrôle.)

Parce que le saut est relatif au point actuel, il est imprécis, et arrive à une seconde près au bon moment, mais n'arrive pas exactement au même point à chaque fois.

Existe-t-il un moyen plus direct d'y parvenir et, dans la négative, comment faire ? les utilisateurs/programmeurs de Media Player Classic pourraient-ils envisageraient de discuter sur le forum, d'introduire de nouvelles WM_COMMAND messages qui permettent de sauter à un point (en millisecondes), ou qui récupèrent les valeurs numériques listées aquí ( state , position , duration , volumelevel , muted , playbackrate , reloadtime ). (La méthode a trouvé aquí est trop lent pour obtenir l'heure avec précision, et nécessite le réglage d'options spéciales).

4voto

vafylec Points 623

Merci au message de wOxxOm, en dessous de la question, J'ai pu créer ce script AutoHotkey, qui résout mon problème initial : régler le temps écoulé dans Media Player Classic de manière programmatique, directement, sans utiliser la fonction Go To... boîte.

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

Les touches de raccourci sont les suivantes :
- Ctrl+Q pour lancer l'API MPC,
- Ctrl+W pour récupérer des informations,
- les touches numériques pour sauter au milieu de la vidéo.

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

^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 :

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

Media Player Classic - Homecinema MPC remote API (via WM_COPYDATA) - Exemple d'AutoIt scripts - Forums 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X