2 affichages DirectX Vidéo

Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Derniè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

18 réponses

Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 6 septembre 2008
3 sept. 2008 à 16:18
Un oubli.
je programme en VB6 ou VBExpress(2008)

Gi5
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
3 sept. 2008 à 17:04
regarde dans les exemples du sdk directx
tu devrais y trouver ton bonheur

Bonjour chez vous !
0
Utilisateur anonyme
4 sept. 2008 à 01:04
Salut,

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 ?

__________
  Kenji
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Derniè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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
4 sept. 2008 à 17:22
As-tu essayé d'en faire une class ?
J'ai pas pu tester car il me manque les interfaces.
Tu peux aussi regarder dans les exemples fournis avec la sdk.

__________
  Kenji
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Derniè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
0
Utilisateur anonyme
5 sept. 2008 à 11:03
Dépose la ici : http://www.datafilehost.com/
Par contre, je ne vais peut-être pas pouvoir regadrer ca avent aujourd'hui (ou alors ce soir)

__________
  Kenji
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 6 septembre 2008
5 sept. 2008 à 14:08
Bonjour Charles
Il n'y a pas d'urgence cela fait des mois que je cherche la solution.
Voici le lien : http://www.datafilehost.com/download-9a4fe761.html
Bonne journée.
@+

Gi5
0
Utilisateur anonyme
5 sept. 2008 à 22:35
J'ai téléchargé la source, petite remarque, tu travaille en vb6 et non en dot net
Vous êtes ici : Thèmes / VB.NET et VB 2005 / Multimédia / DirectX / 2 affichages DirectX Vidéo
Pense donc à choisir le bon thème pour la prochaine fois.
Mais bon passons.

Quand je démarre ton projet, la vidéo se charge dans 2 fenêtre, ce que tu cherche à faire non ?
Donc là, je vois plus trop le pb ?

__________
  Kenji
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Derniè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.


@+Gi5
0
Utilisateur anonyme
6 sept. 2008 à 01:11
Ok, ok,

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
0
Utilisateur anonyme
6 sept. 2008 à 01:15
Ha juste une petite erreur de ma part, le volume va bien de -10000 à 0.
Donc, modifie la ligne DSAudio2.Volume = -10000

__________
  Kenji
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Derniè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
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Derniè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
0
Utilisateur anonyme
6 sept. 2008 à 11:37
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.

__________
  Kenji
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
6 sept. 2008 à 12:07
il doit y avoir moyen de synchroniser les deux 
en utilisant 1 stream

Mais surtout pas en lisant 2 fois le fichier
pour la réalisation , c'est autre chose évidement
Bonjour chez vous !
0
Gi5 Messages postés 61 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 6 septembre 2008
6 sept. 2008 à 15:49
N'y a t-il donc pas moyen d'envoyer un evenement dans 2 handles ?


je crois me souvenir que par accident je n'avais ouvert qu'une vidéo.


la bidouille était je pense dans DSVidéo .
il n'y avait qu'un seul controle et je crois 2 DSVidéo pilotés par le meme controle.


Mais ma mémoire ......


Si cela vous donne une idée elle sera la bienvenue.


Messieurs , le bonsoir et j'espere a bientot.


@+Gi5
0
Utilisateur anonyme
6 sept. 2008 à 16:18
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.

__________
  Kenji
0
Rejoignez-nous