begin process at 2012 05 27 20:20:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > LECTEUR VIDEO OPENGL

LECTEUR VIDEO OPENGL


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Niveau :Expert Date de création :12/09/2004 Date de mise à jour :26/09/2004 11:22:53 Vu / téléchargé :12 663 / 1 224

Auteur : Funto66

Ecrire un message privé
Site perso
Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!

LE CODE COMPLET EST ICI : http://perso.wanadoo.fr/funto/CJVVideo.zip

les touches :
-P pour Play/Pause
-B pour mettre en boucle ou pas
-S pour Stop

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!

lisez-moi.txt
========== ===

Comme je n'ai rien trouvé de satisfaisant pour faire de la lecture vidéo (le lecteur de AVI de NeHe n'étant pas portable, et puis y'a beaucoup de trucs que j'aimais pas...), j'ai créé une classe CJVVideo de lecture vidéo (j'ai surtout créé ça pour un projet commun avec AmK, Cf le forum de Coder-Studio - Concours #3 - petit coup de pub :p)).

Le format CJV est en fait un format personnel, que j'ai inventé donc, et qui utilise la compression JPEG. Je n'ai pas fait de compression vidéo (autre que JPEG, je parle des calculs de l'image suivante en fonction de la précédente comme avec les codecs modernes) d'une part parce que c'est trèèèès compliqué et d'autre part parce que je n'en avais pas besoin.

Le code utilise SDL pour le fenêtrage, pour les types (comme Uint32) et pour le timer (SDL_GetTicks()). L'affichage est fait avec OpenGL.
Il faut noter que l'affichage se fait sur une texture (d'ailleurs je redimensionne l'image en utilisant la matrice de texture ^^), ce qui veut donc dire que l'on peut appliquer la vidéo sur un objet 3D, ou rajouter des effets de brouillard, ou un système de particules par-dessus...bref toutes les possibilités qu'offre OpenGL :)

Aussi, comme j'utilise le format JPEG et que celui-ci est très compliqué, j'utilise la libjpeg (une des 2 seules "véritables" libs pr manipuler le JPEG, avec celle d'Intel ^^).
Donc si vous voulez compiler le code, il vous la faudra.
Pour ça, je vous recommande le site de BeLZeL (si vous êtes sous Dev-C++) : http://belzel.free.fr/
Sinon, allez voir du côté de GameTutorials.com, le dernier tutorial sur le chargement de textures JPEG, si vous êtes sous Visual C++.

Je remercie Keirua (alias Cyberboy/CyberKeirua) pour son soutient, BeLZeL pour son aide quant à l'install de la libjpeg, DigiBen (Cf GameTutorials.com) pr le code de chargement d'images JPEG, NeHe pour la vidéo, AmK pr mener le projet dans lequel fait partie ce lecteur avec moi...et puis les membres du forum de Coder-Studio.com pr leur aide et leurs conseils (surtout quand j'étais en galère avec glTexImage2D qui faisait que ça ne marchait que chez moi, merci à tous; Wett, mr-prog, Kirua, Pixel...etc ;)).

UPDATE : et MickaGL pour avoir réussi à me corriger le bug lié à glTexImage2D, 1000 mercis ;)

UPDATE 2 : et re-BeLZeL pour avoir aussi réussi à corriger le bug du timer :)

PS : pour convertir une vidéo de l'AVI vers le format CJV, il vous faut VirtualDub. Explications dans conversion/conversion.txt.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 septembre 2004 16:47:43 :
Grâce à MickaGL, plus de bug lié à glTexImage2D :) On passe à la version 1.1 :) Par contre je trouve toujours l'affichage un peu lent...
26 septembre 2004 11:22:55 :
Remerciements à BeLZeL pour avoir réussi à supprimer le bug du timer et ceux de jpeg2cjv :) (explications dans historique.txt)

 Sources du même auteur

Source avec Zip Source avec une capture GÉNÉRATEUR DE LIGHTMAPS À PARTIR D'UNE HEIGHTMAP
Source avec Zip CHARGER UNE DLL DYNAMIQUEMENT (PORTABLE)
Source avec Zip Source avec une capture [OPENGL] LOADER XPM: TEXTURES DANS L'EXE
Source avec Zip Source avec une capture HEIGHTMAP OPENGL
Source avec Zip Source avec une capture ALPHA EDIT 3.5 (OUTIL POUR OPENGL)

 Sources de la même categorie

Source avec Zip Source avec une capture AFFICHER DES COURBES DE BEZIER par shorzy
Source avec Zip Source avec une capture BASE/MOTEUR 3D EN QT/OPENGL (COMPLET ET FONCTIONNEL!) POUR U... par envi33
Source avec Zip Source avec une capture CLASSE AVEC OPENGL - OBJETS 3D ET ANIMATIONS par rasta63
Source avec Zip Source avec une capture LETTRES 3D AVEC OPENGL ET QT par opossum_farceur
Source avec Zip CUBE 3D GLUT32 VC++ ET DEVC++ par bobby03

Commentaires et avis

Commentaire de Arnaud16022 le 12/09/2004 12:27:11

2méga!
hé, ya pas tt le monde qui a l'adsl, hein! enfin je suppose que ca vaut le coup.
je suis en train de télécharger, j'en ai pour un moment.
t'as essayé GL_CLAMP_TO_EDGE ?
je suppose que oui, mais comme je sais pas encoe exactement ce qui se passe je peux pas dire...
moi aussi j'ai eu des pb avec les paramertes de textures: on ne peux pas faire de mipmaps avec les tga - enfin, j'utilise pas ton loader funto, du moins pas pr le moment, dsl :) - et je vois pas pourquoi ca marcherait pas avec les jpg... on va bien voir.
si j'ai bien compris, ton codec vidéo c'est juste des jpg a la file c'est ca? ca a un rapport avec la question que tu me posais l'autre jour (euh, semaine...) pour savoir si mon format 3d supporait les animations?
bien que je ne voie pas où tu pourais mettre une anim sur un avion, euh, coucou :p

Commentaire de Funto66 le 12/09/2004 17:34:30

Ouais bah les 2 mégas c'est à cause de la vidéo, dsl...
J'ai tout mis, y compris la version originale en .AVI, et la compression JPEG n'est pas au maximum...

Si vous voulez je peux faire une version "light" lol.

Pour GL_CLAMP_TO_EDGE, ben je ne sais simplement pas ce que c'est, dis-moi? ;)

En ce qui concerne le mipmapping, c'est ce que fait effectivement mon loader de TGA :) C'est d'ailleurs grâce à gluBuild2DMipMaps que l'on peut supporter autre chose que des images avec des côtés en puissances de 2 ^^

La vidéo, c'est effectivement simplement des images JPEG mises à la suite, et ça n'a aucun rapport avec ton format 3D ;)
Quant à l'animation, ça m'intéresse toujours, et t'inquiète pas que j'en trouverais des applications ;)

Commentaire de eRoZion le 12/09/2004 18:44:20

Les nouveaux codecs mpeg-4 ne contiennent qu'un très faible pourcentage d'images compressées en jpeg dans leur intégralité appelées i-frames (enfin c'est de la compression vectorielle meme si c'est pas exactement le jpeg).
Le reste c'est des p-frames, et dernièrement aussi les b-frames.

Renseigne-toi, c'est trop pas compliqué à en comprendre le principe, et tes vidéos seront bien moins lourdes.

Autrement j'ai pas encore regardé le code mais chez moi ca tourne sans problème. :)


eRoZion

Commentaire de eRoZion le 12/09/2004 18:48:09

correc:
c'est PAS TROP compliqué à en comprendre le principe.

Dans l'autre sens on dirait que c'est super simple alors que c'est pas vraiment le cas.


eRoZion

Commentaire de eRoZion le 12/09/2004 19:08:45

Le code est très clair. 9/10

Commentaire de Funto66 le 12/09/2004 19:55:41

Merci :)
L'histoire des i-frames, p-frames et b-frames, je connais, je m'étais renseigné avant de coder ce lecteur ;)
Sauf que bon, ok le principe est simple mais maintenant l'application pas autant... :S
Et tant qu'à faire, si l'on arrive à coder un lecteur qui fonctionne comme ça, autant essayer de l'adapter au MPEG plutôt que de créer son propre format.
Mais bon, j'ai aussi des contraintes de temps (vu que ce lecteur a été créé pour un concours de prog sur Coder-Studio.com, ce n'en est qu'une partie), et pour l'instant je suis satisfait :)

Maintenant si tu te sens le courage de faire un lecteur vidéo MPEG-4, je suis intéressé ;)

Commentaire de Arnaud16022 le 12/09/2004 21:48:58

oué ben je ois nulle art un filtrage trilinéaire, qui devrait arranger pas mal de choses:

glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


voila là t'as pas mieux en qualité; et je ne pense pas que les fps vont bcp baiser;sinon tu peux te contenter du bilinéaire: tu remplaces GL_LINEAR_MIPMAP_LINEAR par GL_NEAREST_MIPMAP_LINEAR (ou GL_LINEAR_MIPMAP_NEAREST je sé plus :(  )

hoh c'est bô!

et GL_CLAMP_TO_EDGE  c'est surtout pour les skybox pasque si tu mts pas ca, u vois les aretes du cube et ca ruine tout l'effet.

et enfin, vérifie que les autres qui ont testé ont bien la derniere version d'openGL (du moins pas la 1.0, si elle est encore sur le serveur...)

et en dernier, je pense que la pixellisation sur les bords c'est pasque je mode par défaut c'est GL_NEAREST, qu'il ne faut utiliser QUE quand on a un prog qui rame vraiement, pasque c'est tout moche (pixellisé)

Commentaire de eRoZion le 13/09/2004 03:21:53

Funto66 > Biensur ça doit être beaucoup plus difficile et surtout long à mettre en oeuvre. Ta méthode fonctionne déjà très bien.

Quant à coder un lecteur mpeg-4, pour l'instant je suis loin d'avoir les compétences requises... Mais plus tard ça pourrait être un très bon entrainement. En attendant j'apprend déjà les api windows, opengl on verra plus tard. ;)


eRoZion

Commentaire de Funto66 le 13/09/2004 19:29:46

eRoZion >> c'est en se disant qu'on n'a pas "encore" les capacités que l'on avance pas, je parle d'expérience ;)

Pour l'histoire du filtrage Arnaud, là n'est pas le problème.
Contrairement à un programme classique où les textures sont chargées au démarrage une bonne fois pour toutes, le mien crée 2 textures au démarrage (oui je fais une sorte de double-buffering avec des textures), mais il met à jour ces textures via glTexSubImage2D à chaque fois que c'est nécessaire (et il passe à l'autre "texture-buffer" d'ailleurs à ce moment-là, en fait je garde toujours une image chargée d'avance).

J'ai essayé de rajouter un filtre, seulement quand je crée la texture la 1ère fois, glTexImage2D ne fonctionne pas (sauf UNIQUEMENT sur mon PC O_o !).
Donc je me suis résigné à utiliser gluBuild2DMipmaps, qui, elle, fonctionne...mais je ne crée les mipmaps qu'en utilisant la 1ère image de la vidéo...
Quand je mets un filtre (même GL_NEAREST...), au moment où le prog doit changer de mipmap (c'est à dire quand l'image est sur le bord de la fenêtre, qu'elle va passer derrière le cube) le prog m'affiche le mipmap créé au début du prog, soit la 1ère image de la vidéo...

Essaye par toi-même, tu verras :(
Donc si tu trouvais pourquoi glTexImage2D ne marche pas, je t'en serais TRES reconnaissant ;)

Commentaire de Funto66 le 23/09/2004 16:53:02

Update : le bug a été trouvé ! (merci MickaGL :))
La nouvelle version, 1.1, est dispo, pour ceux que ça intéresserait...

Commentaire de BeLZeL le 25/09/2004 23:01:33

Un petit commentaire sur le rendu. Ajoute ces deux lignes avant gluBuild2DMipmaps(). Le rendu des textures sera nettement meilleur :

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);


Je crois savoir pourquoi la vidéo semble ramer un peu. Remplace :
m_date_previous_frame = SDL_GetTicks();
par
m_date_previous_frame = get_ticks;
ou peut-être mieux, par :
m_date_previous_frame += m_nb_ms_per_frame;


Sinon, je n'ai pas réussi à créer de vidéo. J'ai mis les images TGA (de 0 à 90 avec le fichier Face2.avi) dans le bon rep. Les images sont converties en JPG, je spécifie tout, mais le fichier CJV ne fait que 16 octets. Est-ce qu'il faut un chemin absolu (c:\...) pour le rep JPG ?

Commentaire de Funto66 le 26/09/2004 01:36:29

Normalement, avec la version qui est postée maintenant les glTexParameteri() ont été déjà rajoutés et les gluBuild2DMipmaps() remplacés par des glTexImage2D()...

Pour le coup du get_ticks je viens de tester et ça marche nickel :) Tu viens de résoudre le dernier problème qui restait, merci bcp :)
Normalement je devrais poster une version corrigée, peut-être demain.

Pour ce qui est de la conversion, normalement on n'est pas obligé de mettre un chemin absolu, c'est bizarre que ça ne fonctionne pas...
Essaye de déplacer le tout dans un dossier plus "simple", genre C:\CJVVideo...(il me semble que j'avais eu ce problème aussi ^^)
Si tu n'y arrive pas, on peut essayer de régler ça par messages privés, par MSN ou sur le chan IRC #Coder-Studio si tu veux.

Commentaire de BeLZeL le 26/09/2004 02:04:24

Oki, j'ai réussi à faire une vidéo :)

Un petit détail dans jpeg2cjv.c. Bizarrement, il commencait l'encodage à partir de la 8è image. J'ai juste modifier la ligne 28 "int i=0;" (en initialisant i).

Ensuite, toujours dans jpeg2cjv.c, ca bug au niveau du répertoire JPG car str_nom_dossier_jpeg est limité à 100 caractères !!! Il existe la variable MAX_PATH. J'ai testé et ca règle le pb.

char str_nom_video[MAX_PATH];
char str_nom_dossier_jpeg[MAX_PATH];
char str_nom_fichier_jpeg[MAX_PATH];

Dans la version que j'ai DL, il n'y avait pas de glTexParameteri(); C'est pour ca.

Voilou ^o^

Commentaire de Funto66 le 26/09/2004 10:24:32

Effectivement je viens de télécharger la version sur mon site et il n'y a pas les glTexParameteri()...merci de me l'avoir signalé, j'update tout ça avec en plus la modification du timer et celle de jpeb2cjv.c. Heureusement que t'es là pour corriger mes erreurs ;)

Juste par curiosité, tu comptes utiliser le lecteur vidéo dans un projet particulier...?

Commentaire de BeLZeL le 26/09/2004 14:49:28

Ce ne sont que quelques petits bugs qui n'empêchent pas d'utiliser le prog :)

J'aime bien ton projet parce que tu as créer un format personnel et que tu as fait le lecteur OGL qui va avec. Je trouve ca tout aussi courageux que de faire un lecteur utilisant un format vidéo déjà existant. Là, on est sûr de ne pas avoir de pb de codecs ;) Et pis je suis comme toi, je n'aimais pas le programme de NeHe. Et c'est parfois intéressant de mettre une telle "texture animée" dans un jeu, une texture qui ne soit visible que dans le jeu (et pas autrement).

J'aime bien ce genre de projet. Je me suis intéressé également à un explorateur de fichiers OGL. J'aimerais bien un petit explorateur 3D capable de faire un peu de tout (viewer d'image, lecteur vidéo, lecteur mp3, avec quelques effets 3D sympatiques).

Commentaire de Funto66 le 26/09/2004 16:38:22

Ouais, un explorateur 3D où faudrait se diriger avec un joystick, tirer sur des fichiers-zombies pour les détruire...chaque dossier étant une grotte...ouais ça serait sympa :)
J'imaginerais bien avec une heightmap en dessous, dans un style Mars (mais en laissant le tout personnalisable...)
Moui il me plaît ton projet :)

En ce qui concerne le fait que j'utilise un format personnel, c'est justement, je trouve ça moins courageux que de s'attaquer à un format existant (se taper la doc en anglais mal faite et compliquée...marre quoi lol).
Enfin bref jusque là ça marche alors ça me convient :)

Commentaire de BeLZeL le 01/10/2004 19:10:47

Qui dit 3D ne dit pas forcément jeu vidéo. Je pense à quelque chose d'un peu plus esthétique que les interfaces 2D traditionnelles de Windows/Linux. Et en 3D, on peut faire pas mal de choses, qui sont en plus accélérées par la carte graphique.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales