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
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
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
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
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
ah oui tien j'avais oublier swscale ... c'est loin tout ça
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
Hors ligne
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 :
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
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
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
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
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
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
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:
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
Bonjour,
Merci pour votre aide, j'essaye de regarder tout cela en détail
Hors ligne
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 :
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
à l'époque ce bout de code fonctionnais
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
Hors ligne
Avec IGUIImage, cela fonctionne parfaitement, il faut juste que je fasse un petit calcul pour garder les proportions
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
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
Hors ligne