Tuto 11 directx : directshow les video dans vos jeux.

Soyez le premier à donner votre avis sur cette source.

Vue 15 954 fois - Téléchargée 1 394 fois

Description

Pour se code, pas beaucoup de nouveauté, simplement l'affichage d'une vidéo en se servant de DirectShow, vidéo affiché soit en plein écran (pour un jeu) soit en fenetré dans une picture box ou tout autre objet possédant un hWnd.

Source / Exemple :


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 DSevent As IMediaEvent           'IMediaEvent permet d'accéder aux événements sur un filtre
Public DScontrol As IMediaControl       'IMediaControl permet d'avoir accès au flux de donner passant par un filtre
Public IPosition As IMediaPosition      'IMediaPosition permet d'accéder à la position d'un fichier lu par un filtre
Public VideoWindow As IVideoWindow      'Information concernant l'affichage de la video, fenetre de destination, taille, et autres...
Public FullScreen As Boolean            'Option pour le mot plein ecran ou fenetré

'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 VideoWindow = Control                       ' Attribut le control de la fenetre video
    
    If Not FullScreen Then
        VideoWindow.WindowStyle = 1                 ' Si on est en fenetré on enleve le cadre de la fenetre d'affichage Direct Show
    Else
        VideoWindow.FullScreenMode = True           ' Met le mode plein ecran à vrai
    End If
    
End If

End Function

'Joue le fichier
Public Function PlayVideo(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
    
    
    If Not FullScreen Then
        
        DsVideo.GetVideoSize lWidth, lHeight                    'Récupere les dimensions de la video
        
        VideoWindow.Owner = hWnd                                'Attribut la fenetre d'affichage à la fenetre de Direct Show
        VideoWindow.SetWindowPosition 0, 0, lWidth, lHeight     'Définition des positions de la fenetre et de sa taille
        
    End If
    
    
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
    
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 ReStartVideo(ByRef Control As IMediaControl)
    
    Control.Run                         ' Relance la video
    
End Function

Conclusion :


Pour le mode plein écran je n'ai pas trouvé comment quitter automatiquement, toutefois dans la source j'ai mis une astuce utilisable :

If IPosition.CurrentPosition = IPosition.Duration Then

Form1.Show

End If

Ceci suffit à retourner en mode fenetré.

J'ai utilisé l'aide de msdn, et le code du module suivant :
http://files.codes-sources.com/fichier.aspx?id=8202&f=Module1.bas

Surement je ferais une mise a jour pour permettre differente modification au niveau de la vidéo.

Aucune erreur n'est gerer dans le zip.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
3
Date d'inscription
dimanche 3 décembre 2000
Statut
Membre
Dernière intervention
24 septembre 2008

Bien ce code mais j'ai un gros souci avec une erreur qui revient régulièrement "- Erreur d'execution 430
La classe ne gère pas soit automation ou l'interface attendue ."

Et cela intervient à ce niveau : VideoWindow.WindowStyle = 1

Le problème est-il connu ? Merci
Messages postés
1
Date d'inscription
vendredi 16 novembre 2007
Statut
Membre
Dernière intervention
19 janvier 2008

intéressant
Messages postés
9
Date d'inscription
dimanche 2 décembre 2007
Statut
Membre
Dernière intervention
2 décembre 2007

thnek you
Messages postés
589
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010

Je suis pas d'accord a mon avis utiliser une video pour faire une texture animé (sprite) c'est une tres mauvaise idée.
Pour ce qui est d'un fond d'ecran video il me semble que ca a deja etait fait sur le site.
Non vraiment tes idées ne suffisent pas pour me donner envie de programmer cela.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
oui et non...

tu vas pas diffuser tout un film sur un ecran d'un jeu

voir ce genre de choses:
http://www.cppfrance.com/codes/RENDU-SUR-TEXTURE-OPENGL-VCPLUSPLUS_11278.aspx
Afficher les 11 commentaires

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.