Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TUTO 11 DIRECTX : DIRECTSHOW LES VIDEO DANS VOS JEUX.


Information sur la source

Catégorie :Direct X Classé sous : directx, directshow, video, directshow, jeu Niveau : Débutant Date de création : 29/05/2007 Date de mise à jour : 01/06/2007 16:03:01 Vu / téléchargé: 9 093 / 683

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
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

  • 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
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.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

29 mai 2007 02:48:20 :
Petite erreur.
01 juin 2007 16:03:01 :
Mise à jour du nom de la source.

Commentaires et avis

signaler à un administrateur
Commentaire de shadowmoy le 29/05/2007 11:57:30

bon deja ca plante pas sous xp (1 bon point)
la video n'est pas redimensionée par rapport au container (pas bien ca)
je doit avoir une classe sur mon hdd qui gere le strech le curseur de lecture etc... si t'es interessé pm moi je te la mailerai
un truc interessant sur directshow serait de pouvoir faire un rendu sur une surface directdraw pas sur une picturebox mais j'ai pas encore vu de source vb capable de le faire (tu releves le challenge ?)
bon sinon on en trouve un peu partout des sources directshow... ^^

signaler à un administrateur
Commentaire de draluorg le 29/05/2007 13:58:24

Salut,

Source interessante, mais il gere pas beaucoup de format video :(
Sinon tu devrais revoir un peu le titre car Dx 11 c'est pas encore pour tout de suite :p

++

signaler à un administrateur
Commentaire de Fraggy le 29/05/2007 15:19:07

Je pense qu'il voulait dire DX8 ;-)

Pour info, un AVI (DivXé) se lance directement avec sa taille réelle, sans avoir besoin de le mettre dans une forme ou dans une PicBox. Bien sur vous n'aurez pas non plus de controles pour le piloter avec cette méthode, donc aucun intéret, mais intéressant à savoir tout de même.

J'ai dejà eu l'occasion de tester le module Ciberrique, et ca tourne sans problème.

Sachez aussi que DirectShow permet de lire les mp3, wav, ogg, etc ...
Le tout sans avoir besoin d'un payer lourd comme WMP ou mplayer qui aime pas trop les mp3 en VBR. DirectShow est donc avantageux à tout point de vue.

Ma note : 10/10
Pourquoi ?
1) Ici on ne cherche pas le graphisme, mais l'utilité.
2) Ca marche impeccablement bien (XP Pro).
3) Fonctionne pour le son, comme pour la vidéo.
4) Supporte beaucoups de formats
5) Paramétrable à souhaits

Merci à toi ciberrique !
(Et merci à mon mentor, Renfield, de m'avoir permis de te connaitre)

signaler à un administrateur
Commentaire de draluorg le 29/05/2007 17:38:36

Eh je pense qu'il voulait plutot dire 11eme tuto...

signaler à un administrateur
Commentaire de ciberrique le 29/05/2007 22:51:04

Effectivement j'aurais du mettre Tuto 11. Je vous remercie pour vos commentaires.
Shadowmoy l'interet d'affiche sur une surface, si j'en trouve un je plancherais dessus mais la je n'en voie pas.
L'interet de cette source comme l'a dis Fraggy c'est l'utilité, pouvoir afficher une video dans un jeu en plein ecran est en utilisant que direct show (par exemple une intro),  et un minimum de code.

signaler à un administrateur
Commentaire de shadowmoy le 30/05/2007 12:02:31

ah ben voila on y vient ;op
donc l'interet de pouvoir afficher une video dans une surface directdraw :
- fond animé des menus d'un jeu
- video en fond d'ecran sur le bureau
- afficher une video a la place d'une texture sur un object 3d (ce qui peut donner des effets sympas (sur une tv ,un ecran de pc ,des ecrans geant de stade de foot etc..., et pourquoi pas sur des personnages,monstres ou autres)
- bien sur on pourrais faire ca avec plusieurs textures mais ca prendrai enormement de temps a charger chaque texture les unes a la suite des autres (trop d'acces disques donc moins de fps)
- pouvoir deformer la surface en lui appliquant des skins ou des transformations 3d (rendu d'une video sur une sphere ou un cube etc...)

enfin en termes de 3d il y a pleins d'applications possibles en fait meme pour faire un video player mais pas un traditionnel en gros :op

voila qq idées
++

signaler à un administrateur
Commentaire de Renfield le 30/05/2007 12:13:47 administrateur CS

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

signaler à un administrateur
Commentaire de ciberrique le 30/05/2007 18:19:47

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.

signaler à un administrateur
Commentaire de oomm le 02/12/2007 13:36:00

thnek you

signaler à un administrateur
Commentaire de batang le 19/01/2008 12:54:29

intéressant

signaler à un administrateur
Commentaire de fantomas69 le 05/07/2008 15:16:44

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Lecteur Video Via DirectShow [ par PaTaTe ] Je suis entrain d'ecrire un lecteur video en utilisant DirectShow mais je suis confront&#233; &#224; un probl&#232;me.J'aimerais pouvoir afficher &#22 VB 2005 ou C/C++ ? [ par Kite37 ] Bonjour !Souhaitant avec des amis nous lancer dans un projet de jeu assez conséquent, nécessitant l'utilisation de DirectX 9.0, nous sommes confrontés Projet de jeu video serieux! [ par cobra84 ] Toutes les infos sont sur:http://www.multimania.com/cobra84 Video avec directx [ par Stoomm ] Salut, Quelqu'un pourrait il me donner un exemple pour lire une video en plein ecran avec DirectX.Merci d'avance.A+. Stoomm. Projet de jeu video en Vb [ par cobra84 ] pour toute info:ipone.jeremy@wanadoo.frou:http://www/multimania.com/cobra84/ (site en contruction) Projet de jeu video [ par cobra84 ] Toutes les infos sont sur:http://www.multimania.com/cobra84 Lancer un jeu video dans une fenetre [ par lionel4 ] Lu !Voila je me demandé comment lancer un jeu dans une fenetre (vous savez ils se lancent toujours en pleine ecran).MerciLionel4 - Débutant Directx Strategie [ par bilaloch ] Svpje voudrais demander si pour faire un jeu type warcraft3 il fallait utiliser directdraw pour les menus,barre du jeu, etc... et direct3D pour le jeu Gérer les colision d'un perso avec DirectX [ par Charles Racaud ] SalutG commencé à faire un jeu style 'Mario'Pour cela, G utiliser DirectX.G réussi à faire bouger le jeu mais je ne parviens pas à gérer les collision aide jeu sans directx [ par sammy918 ] bonsoir, premi&#232;rement, comment on fait pour quand tu appui sur la fl&#232;che gauche tel image ce d&#233;place vers la gauche, pour fl&#232;che d


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,83 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.