[NET] capturer l'image d'une video MCI [Résolu]

sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention - 7 avril 2008 à 20:49 - Dernière réponse : sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention
- 13 avril 2008 à 18:01
Salut à tous !

Je vous expose le problème...
J'ai un MCI qui joue une vidéo dans un pictureBox grâce à "mciSendStringA".
Tout fonctionne bien. J'essaye de capturer une image de la video grace à "bitBlt" de GDI
et de la coller dans un autrePictureBox.
Je procède comme ceci:

' thevid est le pictureBox qui joue la video
Dim videoGraphics As Graphics = thevid.CreateGraphics
Dim videoHdc As IntPtr = videoGraphics.GetHdc

Dim memoryBitmap As New Bitmap(80, 80)
Dim memoryGraphics As Graphics = Graphics.FromImage(memoryBitmap)
Dim memoryHdc As IntPtr = memoryGraphics.GetHdc

' thedisp est le pictureBox qui récupère le snapshot
Dim displayGraphics As Graphics = thedisp.CreateGraphics
Dim displayHdc As IntPtr = displayGraphics.GetHdc

' copie vers la mémoire
BitBlt(displayHdc, 0, 0, 80, 80, videoHdc, 0, 0, &HCC0020)

' colle vers le pictureBox
BitBlt(displayHdc, 0, 0, 80, 80, memoryHdc, 0, 0, &HCC0020)

Et ce que j'arrive à obtenir au mieux c'est un carré noir de 80x80.
Je ne sais vraiment pas comment faire.
Pour info j'ai déjà essayé d'utiliser CreateCompatibleDC mais ça marche po.
J'ai aussi essayé de mettre la vidéo en pause avant de faire le shot
et aussi de faire un System.Windows.Forms.Application.DoEvents() juste avant.
Ou encore un me.refresh() mais pas plus de résultat.

Avez-vous la solution à mon problème ?
Merci.

In tartiflette we trust !
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention - 13 avril 2008 à 18:01
3
Merci
Enfin... Après des heures de recherche sur le net, j'ai enfin trouvé un truc qui marche et qui est tout simple. Il suffit d'utiliser l'ocx de vlc et de désactiver l'overlay. Je pose quelques infos ici:

' déclare BitBlt de GD (utilisé pour faire le screenshot)
Private Declare Auto Function BitBlt Lib "GDI32.DLL" (ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Int32) As Boolean
   
'charge la vidéo est désactive l'overlay
'axVlc est mon activeX VLC
'filePath est le chemin d'accès de la vidéo
Dim opt() As String = {":no-overlay"}

axVlc.addTarget(filePath, opt, AXVLC.VLCPlaylistMode.VLCPlayListAppendAndGo, -666)

' fait une capture d'écran grâce à BitBlt en 80x80
' thedisp est un pictureBox qui réceptionne l'image
BitBlt(thedisp.CreateGraphics.GetHdc, 0, 0, 80, 80,
axVlc
.CreateGraphics.GetHdc, 0, 0, &HCC0020)
   

Merci sirozz 3

codes-sources a aidé 82 internautes ce mois-ci

Commenter la réponse de sirozz
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 8 avril 2008 à 06:09
0
Merci
' copie vers la mémoire
BitBlt(displayHdc, 0, 0, 80, 80, videoHdc, 0, 0, &HCC0020)

' colle vers le pictureBox
BitBlt(displayHdc, 0, 0, 80, 80, memoryHdc, 0, 0, &HCC0020)

tu devrais pas plutot avoir:

' copie vers la mémoire
BitBlt(memoryHdc, 0, 0, 80, 80, videoHdc, 0, 0, &HCC0020)

' colle vers le pictureBox
BitBlt(displayHdc, 0, 0, 80, 80, memoryHdc, 0, 0, &HCC0020)

?

de même, pourquoi ne pas faire:

BitBlt(displayHdc, 0, 0, 80, 80, videoHdc, 0, 0, &HCC0020)
Commenter la réponse de Renfield
sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention - 8 avril 2008 à 07:31
0
Merci
Oui désolé c'est une erreur de frappe.
Effectivement j'ai bien video->memory puis memory->display.

Si je fais un BitBlt(displayHdc, 0, 0, 80, 80, videoHdc, 0, 0, &HCC0020)
donc video->display je n'ai plus rien du tout.
Même plus de carré noir.
Commenter la réponse de sirozz
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 8 avril 2008 à 10:01
0
Merci
si MCI passe directement via la carte graphique (ce que je pense qu'il fait) tu l'as dans le Baba...

ca fais comme DirectX ... il passes pas par la case GDI. questionner le hDc ne changera rien
Commenter la réponse de Renfield
sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention - 8 avril 2008 à 12:49
0
Merci
Arrg! Je passe par GDI mais c'est pas obligatoire. J'ai fait ça car j'avais l'habitude d'utiliser GDI en VB6 mais si tu as une autre solution je suis preneur. Idem pour MCI, je ne suis pas bloqué à ça, n'importe quoi d'autre qui fonctionne je suis preneur (même un ocx). Le problème est simple, je veux juste copier l'image d'une video lors d'un clic souris et la coller dans un pictureBox, même pas la sauvegarder, juste l'afficher dans un pictureBox.
J'ai fais un gros paquet de recherches sur le net mais je n'ai rien trouvé. Si tu as des pistes ?
Commenter la réponse de sirozz
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 8 avril 2008 à 12:53
0
Merci
tu souhiate juste extraire les frames d'une vidéo ?
Commenter la réponse de Renfield
sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention - 8 avril 2008 à 13:35
0
Merci
Oui tout à fait. C'est vrai que dit comme ça c'est plus simple.
Commenter la réponse de sirozz
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 8 avril 2008 à 14:04
Commenter la réponse de Renfield
sirozz 28 Messages postés mardi 27 avril 2004Date d'inscription 13 avril 2008 Dernière intervention - 8 avril 2008 à 15:10
0
Merci
Merci, je regarde ça ce soir, suis au taf.
J'espère que ça va pas être trop galère à convertir en .net.
Merci en tout cas pour tous ces renseignements Renfield. Je pose ce post comme "réponse accepté" mais si qqun connais qque chose en vb.net merci de m'envoyer un petit message.
Bye.

Commenter la réponse de sirozz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.