#0 

29-04-2013 12:42:34

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Bonjour,

Dans le cadre d'un projet de jeu j'aimerais intégrer des cinématiques en utilisant le moteur Irrlicht.

J'avais d'abord pensé à utiliser de grosses animations en .x mais celles fournies par mon infographistes sont un peu trop lourdes, passent mal et mettent trop de temps à se charger or c'est un peu dommage de devoir absolument faire du low poly en "trichant" grâce aux textures alors que le rendu sera toujours le même.

Or, je me demandais s'il n'y avait pas moyen de "pré-calculer" toute l'animation, ainsi Irrlicht n'aurait plus qu'à afficher.
Je pensais donc utiliser des vidéos mais comme Irrlicht ne peut pas lire de vidéos, j'ai commencé à rechercher des bibliothèques simples, portables et avec une licence BSD ou LGPL qui me permettrait de lire de telles vidéos.

Je n'ai pour le moment trouvé que SfeMovie qui s'utilise avec la SFML 2.0 mais cette dernière me pose quelques problèmes à l'édition des liens ( je dois avoir des bibliothèques trop anciennes ).

J'aimerais donc connaitre votre avis sur le sujet, que me conseillez-vous ?

Hors ligne


#1 

29-04-2013 16:28:35

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

http://irrlicht-fr.org/viewtopic.php?id=778
par contre j'ai pas intégré la lecture du sons

sur le forum off y en a un qui est pas mal qui utilise la lib Theora coupler a openal pour le sons

Hors ligne


#2 

29-04-2013 19:05:57

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Merci, je pense que c'est exactement ce qu'il me faut ^^
Pour le son, je peux le jouer moi-même (j'utilise la SFML pour cela).

Par contre lors de la compilation de tes sources, j'ai pas mal d'erreurs :

neckara@neckUbu:~/Bureau/test$ g++ main.cpp cguivideo.cpp gameintro.cpp svideo.cpp -lIrrlicht -lavformat -lavcodec -lavutil   -D__STDC_CONSTANT_MACROS -o exe
main.cpp: In function ‘int main()’:
main.cpp:13:115: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
cguivideo.cpp:10:12: error: language string ‘"\012> RESTART <\012\012"’ not recognized
cguivideo.cpp: In constructor ‘interne::_interface::CGUIVideo::CGUIVideo(interne::SVideo*, bool, bool)’:
cguivideo.cpp:39:28: warning: converting ‘false’ to pointer type ‘irr::video::ITexture*’ [-Wconversion-null]
cguivideo.cpp:40:26: warning: converting ‘false’ to pointer type ‘irr::video::IImage*’ [-Wconversion-null]
svideo.cpp:23:12: error: language string ‘"\012> RESTART <\012\012"’ not recognized
svideo.cpp: In destructor ‘interne::SVideo::~SVideo()’:
svideo.cpp:60:35: warning: ‘void av_close_input_file(AVFormatContext*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1580) [-Wdeprecated-declarations]
svideo.cpp:60:64: warning: ‘void av_close_input_file(AVFormatContext*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1580) [-Wdeprecated-declarations]
svideo.cpp: In member function ‘bool interne::SVideo::open(char*, bool)’:
svideo.cpp:66:12: warning: ‘int av_open_input_file(AVFormatContext**, const char*, AVInputFormat*, int, AVFormatParameters*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1368) [-Wdeprecated-declarations]
svideo.cpp:66:62: warning: ‘int av_open_input_file(AVFormatContext**, const char*, AVInputFormat*, int, AVFormatParameters*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1368) [-Wdeprecated-declarations]
svideo.cpp:71:12: warning: ‘int av_find_stream_info(AVFormatContext*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1412) [-Wdeprecated-declarations]
svideo.cpp:71:41: warning: ‘int av_find_stream_info(AVFormatContext*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1412) [-Wdeprecated-declarations]
svideo.cpp:77:9: warning: ‘void dump_format(AVFormatContext*, int, const char*, int)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1902) [-Wdeprecated-declarations]
svideo.cpp:77:42: warning: ‘void dump_format(AVFormatContext*, int, const char*, int)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1902) [-Wdeprecated-declarations]
svideo.cpp:84:61: error: ‘CODEC_TYPE_VIDEO’ was not declared in this scope
svideo.cpp:88:61: error: ‘CODEC_TYPE_AUDIO’ was not declared in this scope
svideo.cpp:92:61: error: ‘CODEC_TYPE_DATA’ was not declared in this scope
svideo.cpp:103:13: warning: ‘int avcodec_open(AVCodecContext*, AVCodec*)’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:4035) [-Wdeprecated-declarations]
svideo.cpp:103:51: warning: ‘int avcodec_open(AVCodecContext*, AVCodec*)’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:4035) [-Wdeprecated-declarations]
svideo.cpp:109:13: warning: ‘int avcodec_open(AVCodecContext*, AVCodec*)’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:4035) [-Wdeprecated-declarations]
svideo.cpp:109:51: warning: ‘int avcodec_open(AVCodecContext*, AVCodec*)’ is deprecated (declared at /usr/include/libavcodec/avcodec.h:4035) [-Wdeprecated-declarations]
svideo.cpp: In member function ‘bool interne::SVideo::makeFrame()’:
svideo.cpp:137:96: error: ‘avcodec_decode_video’ was not declared in this scope
svideo.cpp:158:58: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
svideo.cpp: In member function ‘bool interne::SVideo::restart()’:
svideo.cpp:188:17: warning: ‘int av_open_input_file(AVFormatContext**, const char*, AVInputFormat*, int, AVFormatParameters*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1368) [-Wdeprecated-declarations]
svideo.cpp:188:67: warning: ‘int av_open_input_file(AVFormatContext**, const char*, AVInputFormat*, int, AVFormatParameters*)’ is deprecated (declared at /usr/include/libavformat/avformat.h:1368) [-Wdeprecated-declarations]
svideo.cpp: In member function ‘char* interne::SVideo::getAuthor()’:
svideo.cpp:196:53: error: ‘struct AVFormatContext’ has no member named ‘author’
svideo.cpp: In member function ‘char* interne::SVideo::getAlbum()’:
svideo.cpp:197:53: error: ‘struct AVFormatContext’ has no member named ‘album’
svideo.cpp: In member function ‘char* interne::SVideo::getTitle()’:
svideo.cpp:198:53: error: ‘struct AVFormatContext’ has no member named ‘title’
svideo.cpp: In member function ‘char* interne::SVideo::getCopyright()’:
svideo.cpp:199:53: error: ‘struct AVFormatContext’ has no member named ‘copyright’
svideo.cpp: In member function ‘char* interne::SVideo::getComment()’:
svideo.cpp:200:53: error: ‘struct AVFormatContext’ has no member named ‘comment’
svideo.cpp: In member function ‘char* interne::SVideo::getGenre()’:
svideo.cpp:201:49: error: ‘struct AVFormatContext’ has no member named ‘genre’
svideo.cpp: In member function ‘int interne::SVideo::getYear()’:
svideo.cpp:202:49: error: ‘struct AVFormatContext’ has no member named ‘year’
svideo.cpp: In member function ‘int interne::SVideo::getTrack()’:
svideo.cpp:203:49: error: ‘struct AVFormatContext’ has no member named ‘track’


Saurais-tu comment les résoudre ?


EDIT : le wrapper de theora marche parfaitement, par contre, il faut que je retrouve les formats vidéos supportés^^

Dernière modification par Neckara (29-04-2013 20:42:36)

Hors ligne


#3 

29-04-2013 23:18:55

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

je doit dire que c'est un code que j'ai écris y a plusieurs année maintenant pour toi je pense qu'il serait mieux d'utiliser le lecteur sur Théora et de warper directement depuis l'interface qu'il donne, mon code ne propose pas d'extraction des donner audios, j'avais commencer

pour ce qui est des fonction (getAuthor(),etAlbum(),getTitle(),getCopyright(),getComment(),getGenre(),getYear(),getTrack()) qui t'empeche de compiler tu peut les supprimée elle ne sont pas utile a la lecture

pour CODEC_TYPE_VIDEO & ci sa a été remplacer par AVMEDIA_TYPE_VIDEO apparemment

externe "\012> RESTART <\012\012" a remplacer par externe "C"
avcodec_decode_video est remplacer par avcodec_decode_video2

pour les fonctions déprécier par contre pour le moment ça ne devrait pas être problématique a sont fonctionnement, cherche sur google sinon tu trouveras bien les fonctions de remplacement

Hors ligne


#4 

29-04-2013 23:52:44

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Merci pour votre réponse.

Pour theora, il marche bien mais je n'ai pas encore réussi à convertir une vidéo .avi en .ogg avec le codec theora sans perdre en qualité.

FFMPEG semble prendre en compte plusieurs codecs si j'ai bien compris, il me semble donc un peu plus intéressant. Pour les warnings, je pense que j'arriverais à les corriger, j'ai aussi dû rajouter -lswscale et -D__STDC_CONSTANT_MACROS.

Par contre maintenant j'ai des erreurs de segmentations un peu partout (des pointeurs qui sont à NULL apparemment), mais bon rien d'insurmontable tant que j'arrive à compiler ^^.

Mercredi je me pencherais en détail là-dessus et je reposterais le code modifié.

D'ailleurs est-ce qu'éventuellement si je trouve votre code assez pratique je pourrais faire un tutoriel dessus sur un certain forum de professionnels en informatique ( je pense qu'on a pas trop le droit de citer des forums/liens ici (?) )

D'ailleurs quels sont les formats et codecs supportés par votre code ?

Dernière modification par Neckara (29-04-2013 23:53:36)

Hors ligne


#5 

30-04-2013 00:18:09

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

ah oui tien j'avais oublier swscale ... c'est loin tout ça smile

pas de soucis pour les liens
pour les codec :  http://ffmpeg.org/general.html#Video-Codecs

tu peut faire ton tuto, cite juste les sources, et passe dans le coin dire ou ce trouve ton tuto wink

Hors ligne


#6 

10-05-2013 11:13:05

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Bonjour,

J'ai réussi à corriger les erreurs "deprecied", mais en toute sincérité, ton code a pas mal de choses qui produisent des comportements indéterminés comme des variables non-initialisées etc.

Là j'arrive à jouer les 4 premières frames d'une vidéo mais la vidéo s'arrête juste après, il faut donc que je continue à creuser.

Sinon dans ce code :

Code:

bool CGUIVideo::refreshByTime()
        {
            bool rf;
            if(data->Play
                    #if defined   SDL_SUPPORT
                        && SDL_GetTicks() - lastTime > videoFPS*1000
                    #elif defined SFML_SUPPORT
                        && timer.GetElapsedTime() > videoFPS
                    #elif defined IRRLICHT_SUPPORT
                        && Timer->getRealTime() - lastTime > data->videoFPS*1000
                    #endif
              )
            {
                #if defined SDL_SUPPORT
                    lastTime = SDL_GetTicks();
                #elif defined SFML_SUPPORT
                    timer.Reset();
                #elif defined IRRLICHT_SUPPORT
                    lastTime = Timer->getRealTime();
                #endif
                return refresh();
            }
        }

On ne retourne rien si la condition du if est fausse, que devrait-on retourner dans ce cas là?
Il faut en fait retourner true, mais là j'ai maintenant des "flash" d'écrans noirs, je pense savoir comment résoudre le problème, sinon le code fonctionne très bien wink

Je vais essayer de rendre le code fonctionnel puis je relirais pour corriger tout ce qui pourrait provoquer des comportements indéterminés.

Dernière modification par Neckara (10-05-2013 11:18:23)

Hors ligne


#7 

10-05-2013 12:14:10

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

ah oui ... t'a raison c'est return true !

ba si tu post une archive pour compiler tout ça ...
y a moyen que je te face un truc plus propre et optimiser, je relie certain truc la et c'est asser moche en faite

Hors ligne


#8 

10-05-2013 13:14:33

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

J'ai corrigé la petite erreur du scintillement, là je pense que le code est fonctionnel.
Faudrait juste le relire un peu.

Sinon, peut-être serait-il intéressant de créer une dépôt github afin qu'on puisse voir les modifications qu'on ajoute (?).

Sinon, ce forum n'intègre pas la possibilité d'inclure des "pièces jointes" à un post ?

Hors ligne


#9 

10-05-2013 16:13:04

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

non pas de piece joint sur le forum :')
pour git pas la pène je vais faire ça en 10/20 minutes

histoire de virer les truc qui servent a rien, reorganiser le code, faire un render to texture au lieux dans crée un nouvelle a chaque frame ... etc
et peut-être lire les données audios

ça dépendra de mon temps libre, puis bon même si c'était un oubli a la con, ça crain autemps tout verifier
pour le coup de l'extern c'est le forum qui bug ... marrant, m'enfin ...

Hors ligne


#10 

10-05-2013 23:31:50

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

J'ai hébergé l'archive temporairement pour 24h :
https://imo.im/fd/B/k66qhrexpv/test.tar.gz

J'ai laissé des std::cerr de déboguage (avec Irrlicht, je ne sais pas pourquoi, mais QtCreator refuse de lancer le débogueur :aie: )

Hors ligne


#11 

11-05-2013 06:34:12

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

voila (a par l'audio), pour bien faire faudrais faire une interface correct et tout le tralala mais je n'est pas suffisement de temps pour cela
http://www.filedropper.com/test_22

ffmepg version:

Code:

  libavutil      52. 30.100
  libavcodec     55.  7.100
  libavformat    55.  4.101
  libavdevice    55.  0.100
  libavfilter     3. 64.100
  libswscale      2.  3.100
  libswresample   0. 17.102

bon, ba y a plus cas aller pioncer ...

Hors ligne


#12 

11-05-2013 08:56:12

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Bonjour,

Merci pour votre aide, j'essaye de regarder tout cela en détail wink

Hors ligne


#13 

18-05-2013 14:12:11

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Bonjour,

Le code marche parfaitement mais maintenant j'aimerais tenter de redimensionner la vidéo en fonction de la taille de la fenêtre.
La texture ne semble pas avoir de méthode setScale(), donc soit il faudrait que :
- Je la copie dans une image pour la redimensionner (?);
- j'essaye de jouer avec le viewport (?) ;
- ou le faire de manière brute dans le code :

Code:

irr::u32 *tBits = (irr::u32*)VTexture->lock();
                for(irr::u32 x=0; x<data->width; ++x)
                {
                    for(irr::u32 y=0; y<data->height; ++y)
                    {
                        int p = x*3+y*data->FrameRGB->linesize[0];
                        tBits[y*data->width+x] = data->FrameRGB->data[0][p]   << 16 |
                                                 data->FrameRGB->data[0][p+1] << 8 |
                                                 data->FrameRGB->data[0][p+2];
                    }
                }
                VTexture->unlock();

Il suffit juste de calculer le poids de chaque images mais pour une vidéo de 1024x800, cela ferait quand même 819 200 calculs avec pas mals de flottant sur le CPU, j'ai donc peur de faire un traitement beaucoup plus lourd, moins efficace (?) et avec plus de chances d'erreurs que si j'utilisais une foncionnalité d'Irrlicht.

Qu'en penses-tu?

Hors ligne


#14 

18-05-2013 17:19:23

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

à l'époque ce bout de code fonctionnais

Code:

            if(resize_for_render) device->getVideoDriver()->OnResize(dimension2d<u32>(vi.getWidth(), vi.getHeight()));

quoi que tu face si tu a la possibilité de modifier directement le rendue ce seras toujours plus performant et maintenable, donc ne fait pas de scale ou autre
sinon tu passe par la gui, tu rajoute une IGUIImage et tu la set en resizable, étant donner que maintenant la texture n'est pas recrée a chaque frame le pointeur resteras identique

ou encore tu peut encore afficher un Quad

Code c++ :


            scrm.Lighting = false;
            scrm.BackfaceCulling = false;
            scrm.ZBuffer = irr::video::ECFN_LESSEQUAL;
            screenVertices[0] = irr::video::S3DVertex(-1.f,  1.f, 0.f, 0.f, 0.f, 1.f, irr::video::SColor(255,255,255,255), 0.f, 0.f);
            screenVertices[1] = irr::video::S3DVertex( 1.f,  1.f, 0.f, 0.f, 0.f, 1.f, irr::video::SColor(255,255,255,255), 1.f, 0.f);
            screenVertices[2] = irr::video::S3DVertex( 1.f, -1.f, 0.f, 0.f, 0.f, 1.f, irr::video::SColor(255,255,255,255), 1.f, 1.f);
            screenVertices[3] = irr::video::S3DVertex(-1.f, -1.f, 0.f, 0.f, 0.f, 1.f, irr::video::SColor(255,255,255,255), 0.f, 1.f);
            screenIndices[0] = 0; screenIndices[1] = 1; screenIndices[2] = 2; screenIndices[3] = 3;

            for(irr::u32 c = 0; c < irr::video::MATERIAL_MAX_TEXTURES; c++)
            {
               scrm.TextureLayer[c].BilinearFilter = true;
               scrm.TextureLayer[c].TrilinearFilter = false;
               scrm.TextureLayer[c].AnisotropicFilter = 0;
            }
            scrm.setTexture(0,intro->draw());

            // render

            device->getVideoDriver()->setTransform(irr::video::ETS_PROJECTION, irr::core::IdentityMatrix);
            device->getVideoDriver()->setTransform(irr::video::ETS_VIEW, irr::core::IdentityMatrix);
            device->getVideoDriver()->setTransform(irr::video::ETS_WORLD, irr::core::IdentityMatrix);

            device->getVideoDriver()->setMaterial(scrm);
            device->getVideoDriver()->drawVertexPrimitiveList(screenVertices, 4, screenIndices, 2 , irr::video::EVT_STANDARD, irr::scene::EPT_QUADS);

Hors ligne


#15 

18-05-2013 17:57:35

Neckara
Membre
Date d'inscription: 29-04-2013
Messages: 13

Avec IGUIImage, cela fonctionne parfaitement, il faut juste que je fasse un petit calcul pour garder les proportions wink

Pour le Quad, je pense être encore un peu trop inexpérimenté avec Irrlicht pour me plonger dedans, je vais préférer la solution simple.
Niveau performances est-ce que le Quad sera bien plus avantageux que le IGUIImage (?)

Hors ligne


#16 

19-05-2013 01:09:19

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

pas de grand chose, disons qu'avec le Quad tu n'a que le rendue, tu diminue les calls inutile (une ~30ene) par rapport a une IGUIImage
alors qu'avec une IGUIImage tu a toute la boucle d'event a traiter en plus, et les coordoner a calculer, ... etc
mais bon c'est vraiment minime dans ton cas, puis ça te simplifie la tache et tu peut faire une animation de transition avec IGUIInOutFader wink

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
14 invités en ligne
Aucun membre connecté
RSS Feed