Gi5
Messages postés61Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention 6 septembre 2008
-
3 sept. 2008 à 16:16
Utilisateur anonyme -
6 sept. 2008 à 16:18
Bonjour a tous.
J'éspère que "CEUXQUISAVENTTOUT" sont rentrés de vacances.
J'ai réussi par accident a sortir 2 fenètres vidéo différentes sur 2 ecrans(avec le meme film).
En un mot cloner une vidéo dans 2 picturebox.
Depuis impossible de refaire la meme chose.
Si quelqu'un a une idée .
Merci d'avance
Gi5
Ca dépend comment tu crée ta video.
Dans ta méthode, il doit y avoir un endrois ou tu précise l'handle de destination pour l'affichage (ici une picturebox).
Il suffit alors de rappeller la fonction (peut-être des modifications à faires) et de définir un handle différent du premier.
Tu utilise mciSendString pour lire le film ?
Gi5
Messages postés61Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention 6 septembre 2008 4 sept. 2008 à 15:27
Bonjour Charles
J'utilise Microsoft.DirectX.AudioVideoPlayback
Quand je prend un second Handle la video s'affiche uniquement dans la deuxième pictureBox.
J'ai abandonné mciSendString car je ne pouvais lire tous les types de vidéo.
DirectX me permet de lire Tous les fichiers vidéo et audio .
Voici le module que j'utilise :
Option Explicit
Public DSAudio As IBasicAudio 'IBasicAudio permet d'avoir accès à la création de filtre
Public DSVideo As IBasicVideo 'Permet l'accés d'un filtre vidéo
Public DScontrol As IMediaControl 'IMediaControl permet d'avoir accès au flux de données passant par un filtre
Public DSevent As IMediaEvent 'IMediaEvent permet d'accéder aux événements sur un filtre
Public Position As IMediaPosition 'IMediaPosition permet d'accéder à la position d'un fichier lu par un filtre
Public Pvw As IVideoWindow 'Information concernant l'affichage de la video, fenetre de destination, taille, et autres...
Public Pgm As IVideoWindow
'Chargement d'un fichier en memoire
Public Function LoadVideo(ByRef path As String, _
ByRef Video As IBasicVideo, ByRef sEvent As IMediaEvent, _
ByRef Control As IMediaControl, ByRef Position As IMediaPosition)
If path <> "" Then
Set Control = New FilgraphManager ' Initialisation de DirectShow, Filgraphmanager étant un contrôle qui permet d'avoir accède au filtre présent sur un PC
Control.RenderFile path ' La méthode RenderFile cré un filtre qui permet de rendre un fichier.
Set DSAudio = Control ' On donne l'accès au donné des filtres créés par DirectShowAudio à DScontrol
Set Video = Control ' On donne l'accès au donné des filtres créés par DirectShowAudio à DScontrol
Set sEvent = Control ' On donne accès à DScontrol aux événements des filtres
Set Position = Control ' De même pour la position
Set Pvw = Control ' Attribut le control de la fenetre video
Pvw.WindowStyle = 1 ' Si on est en fenetré on enleve le cadre de la fenetre d'affichage Direct Show
End If
End Function
'Charge le fichier
Public Function ChargeVideo(ByRef Control As IMediaControl, ByRef Position As IMediaPosition, Optional ByRef hWnd As Long)
Dim lWidth As Long
Dim lHeight As Long
Control.Stop ' Arret de la lecture
Position.CurrentPosition = 0 ' Remise à 0
Control.Run ' Joue le fichier
Control.StopWhenReady
DSVideo.GetVideoSize lWidth, lHeight 'Récupere les dimensions de la video
Form1.Label8.Caption = lWidth & " x " & lHeight
Pvw.Owner = Form1.Picture1.hWnd 'hWnd 'Attribut la fenetre d'affichage à la fenetre de Direct Show
Pvw.SetWindowPosition 0, 0, 360, 240 'Définition des positions de la fenetre et de sa taille
'VideoWindow2.Owner = Form2.Picture1.hWnd
End Function
'Stop entierement la lecture
Public Function StopVideo(ByRef Control As IMediaControl, ByRef Position As IMediaPosition)
Control.Stop ' Arret de la lecture
Position.CurrentPosition = 0 ' Remise à 0
Control.Pause ' Valide la remise au début
End Function
'Supprime la video de la memoire
Public Function DeleteVideo(ByRef Control As IMediaControl, ByRef sEvent As IMediaEvent, ByRef Video As IBasicVideo, ByRef Position As IMediaPosition)
Control.Stop ' Arret de la video
Set Control = Nothing ' Vidage de la memoire
Set sEvent = Nothing ' Vidage de la memoire
Set Video = Nothing ' Vidage de la memoire
Set Position = Nothing ' Vidage de la memoire
End Function
'Pause
Public Function PauseVideo(ByRef Control As IMediaControl)
Control.Pause ' Pause de la video
End Function
'Redemarage apres une pause
Public Function PlayVideo(ByRef Control As IMediaControl)
Control.Run ' Relance la video
End Function
'Definition du volume de 0 à 10
Public Function SetVolume(ByRef Audio As IBasicAudio, VolumeValue As Integer)
Audio.Volume = VolumeValue * -500 ' On multiplie par -500 car le volume va de -10000 à 0
End Function
'Définition de la balance, gauche-droite, de -10 à 10
Public Function SetBalance(ByRef Audio As IBasicAudio, BalanceValue As Integer)
Audio.Balance = BalanceValue * 1000 ' On multiplie par 1000 car la balance va de -10000 à 10000
End Function
Le 1er ecran est Pvw le 2eme est PGM.
L'appel de fonction est :
LoadVideo Cd1.FileName, DSVideo, DSevent, DScontrol, Position
ChargeVideo DScontrol, Position, Form1.Picture1.hWnd
Voila L'idée sur laquelle j'étais parti.
A bientot
Gi5
PS Merci a Gillardg
Vous n’avez pas trouvé la réponse que vous recherchez ?
Gi5
Messages postés61Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention 6 septembre 2008 5 sept. 2008 à 04:09
Resalut Charles
Je ne maitrise pas du tout les class.
Dans les exemples sdk pas de gestion double affichages.
Comment te faire parvenir la base sur laquelle je travaille?
A bientot.
Gi5
Messages postés61Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention 6 septembre 2008 6 sept. 2008 à 00:52
Salut.
Je dispose de la source en VB6 et VB2008Express.
Je travaille sur les Deux.
Je n'arrive pas a mettre la 2eme vidéo dans une pictureBox.
De plus je ne peux pas gerer le son de la 2eme vidéo(en fait le 2eme son devrait etre coupé tout simplement).
Mon but et de cloner simplement et uniquement la video dans une autre Picturebox de manière a avoir une sortie sur la carte vidéo secondaire et un controle sur la principale.
J'espere etre clair.
merci pour ta patience.
Suffisait de définir l'ahandle pour le second (ca à déjà été fait apparament mais désactivé), ajouter un second DSAudio et lui définir le volume minimum.
Lien vers le projet : http://www.datafilehost.com/download-b36b1c82.html J'ai rajouté le commentaire __________
Kenji
Gi5
Messages postés61Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention 6 septembre 2008 6 sept. 2008 à 01:39
OK Charles cela fonctionne .
Mais les deux vidéo ne sont pas synchrone.
la 2eme prend du retard au fur et a mesure.
Donc 2 vidéo distinctes sont ouvertes.
Mon but est bien de cloner 1 vidéo dans 2 fenetres et pas d'en ouvrir 2.
Si tu a quelques idées a ce sujet.
Merci d'avance.
Gi5
Messages postés61Date d'inscriptionmardi 12 septembre 2006StatutMembreDernière intervention 6 septembre 2008 6 sept. 2008 à 03:05
OK Charles.
J'avais deja modifié la valeur audio -10000.
Voici si tu le veux bien une autre source en VB2008 et DirectX SDK
http://www.datafilehost.com/download-e48de163.html a bientot si tu en a le courage.
@+Gi5
Le décalage, c'est normale, vu que tu lit deux fois la même vidéo, il lit deux fois le fichier à chaque fois, et donc forcement l'une après l'autre. Si le décalage devient trop, il faut de temps en temps, recaler la seconde sur la premiere.
Tout est dans le DSVidéo. c'est lui qui se charge de la lecture et de l'affichage. Il faut forcement un DSVideo pour un affichage. Donc, il t'en faut forcement deux.