Mephisto Posté(e) le 7 avril 2008 Partager Posté(e) le 7 avril 2008 Bonsoir je suis en train de me coder une uzine a gaz pour envoyer un flux MJPG en AVI et, pour rendre la chose plus marrante, la taille de l'avi doit pouvoir depasser les 1Go (en raison du parser MCIAVI), ou 4Go (a cause de l'adressage 32bits) ((enfin, on est pas la pour se fritter sur la limite)) bref, j'utilise donc un super index (enfin, j'essai) je pensais avoir termine quand, en testant, j'ai constatait que ca ne marchait pas j'ai regarde, dans l'editeur hexadecimal de virtualdub, en applquant le modele RIFF au contenu de mon fichier, j'ai vu que mes index (ix00) n'etaient pas reconnus le flux en question est uniquement video (pas de son, pour l'instant) grossierement, le riffwalk d'un fichier ressemble a ca: RIFF (avi_size) AVI avih (avi_header_size) LIST (strl_size) strl strh (strh_size) (contenu du stream header) strf (strf_size) (contenu du strem format) indx (index_size) (contenu du super index, et tableau de references vers les indexs) LIST (movi_size) movi ix00 (index, et tableau de reference vers les frames) 00dc (frame) 00dc (frame) 00dc (frame) etc. ix00 (index, et tableau de reference vers les frames) 00dc (frame) 00dc (frame) 00dc (frame) etc. etc. idx1 (size_idx1) (mais, normalement c'est optionnel, et j'aimerais bien ne pas le mettre) premier probleme, deja evoque plus haut: ix00 n'est pas reconnu, VDub ne sait pas de quoi il s'agit deuxieme probleme: si je suis les conseils de la doc openDML sur le conteneur AVI (a savoir, les header dans le RIFF AVI et le film dans le RIFF AVIX), j'ai un message d'erreur comme quoi il n'y a pas de movie chunk dans le fichier troisieme probleme, a moins que je ne mette un 'idx1' a la fin de mon fichier, riffwalk cherche au dela de la fin du fichier et finit par me dire qu'il ne reconnait pas le type de chunk sur lequel il est tombe... volontairement, je ne met pas de code: j'aimerais juste avoir des eclairssisements sur le conteneur avi j'ai bouffe toute la doc OpenDML, j'ai trouve peut de renseignements sur google, je ne comprends pas pourquoi ix00 n'est pas reconnu et pourquoi movi ne pourrait pas etre exclusivement dans AVIX je pense mettre mes index apres les frames auxquelles ils font reference pour faire exactement comme dans la doc, mais, si tout n'est qu'une question d'offset, j'ai un doute sur l'utilite de la chose... merci pour votre aide eventuelle ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 8 avril 2008 Auteur Partager Posté(e) le 8 avril 2008 bon, une petite avancee: a present, j'ai remplace hdrl par hdrx (pour suivre la doc au mot, ca reste non reconnu par virtualdub, mais il le developpe tout de meme, donc ca ne doit pas etre si grave) mais ix00 sont apres les frames aux quelles ils font reference deux lignes de la doc parlent d'utiliser 00ix plutot que ix00, ce que j'ai fait. maintenant, l'index est reconnu comme une frame (j'imagine que ce n'est pas forcement bon signe) je n'ai plus aucune erreur au RiffWalk ou sur l'editeur hexadecimal de VirtualDub DVDate plante quand j'essai de lire les en-tetes RIFF enfin, vidtrace liste le debut du fichier, et s'arrete sur RIFF [movie_size] (sans noter 'AVIX', ni developper son contenu) ah, et, quand j'essai de lire mon fichier avec VDb, j'ai droit au "this AVI file doesn't have a movi data block" (sur l'editeur hexa, avec le 'RIFF chunk tree', il est evidemment present, et en le developpant; on a acces a toutes les frames...) je vais tenter de creer un LIST 4 movi avant le RIFF size AVIX, mais, j'y crois pas... [edit: c'est bien ce que je pensais: 'no video stream found'] [edit2: la structure RIFF, pour plus de clarte] C:\DOCUME~1\lorent\Bureau\download\RiffWalk>RiffWalk.exe -f2 -x ..\..\export1.avi 00000000 RIFF (004E8918) 'AVI ' 0000000C LIST (00000100) 'hdrx' 00000018 avih (00000038) TotalFrames : 367 Streams : 1 InitialFrames: 0 MaxBytes : 43632 BufferSize : 14544 uSecPerFrame : 333333 Rate : 3.000 fps Size : (352, 288) Flags : 0x00000800 00000058 LIST (000000B4) 'strl' 00000064 strh (00000038) Stream Type : vids Stream Handler: mjpg Samp/Sec : 3.000 Priority : 0 Language : unspecified InitialFrames : 0 Start : 0 Length : 367 Length (sec) : 122.3 Flags : 0x00000000 BufferSize : 14544 Quality : 10000 SampleSize : 0 Frame Rect : [0 0 352 288] 000000A4 strf (00000028) Size : (352, 288) Bit Depth : 24 Colors used : 0 Compression : MJPG Image Size : 14544 000000D4 indx (00000038) 04 00 00 00 02 00 00 00 30 30 64 63 00 00 00 00 '........00dc....' 00 00 00 00 00 00 00 00 48 80 3A 00 00 00 00 00 '........H.:.....' B8 08 00 00 5C 00 00 00 A8 84 4E 00 00 00 00 00 '....\.....N.....' 08 03 00 00 1F 00 00 00 '........ ' 00000154 LIST (00000004) 'movi' 00000160 RIFF (004E87B8) 'AVIX' 0000016C LIST (004E87AC) 'movi' 004E8920 C:\DOCUME~1\lorent\Bureau\download\RiffWalk> [edit3]J'ai fait quelques tests (des divx concatennes pour obtenir des fichiers de 5G minimum) en fait, la size a mettre dans RIFF size 'AVI ' ne doit pas prendre compte de celle des RIFF AVIX je suis retourne a l'appelation des index par ix00 (c'est ainsi qu'ils sont appeles dans mes fichiers de test) ce coup ci, VDb trouve bien un stream video, mais pretend que mes indexs sont inexistants ou foireux (il en genere donc, et arrive a me lire la video) RiffWalk me sort une erreur, mais je me demande si je peux lui faire confiance (un utilitaire si vieux, qu'on ne trouve plus en circulation, et qui n'qrrive pas a ouvrir mes fichiers de 5Go, je pense pouvoir honnetement mettre en doute ses capacites...) a present, la seule difference que je remarque entre le fichier que je genere et un avi de 5G, c'est que dans le mien, chaque sous-partie contient ses images et son index a la suite, tandis que dans celui genere par VDb comporte tous ses ix00 sont en fin de fichier ; mais ca m'etonnerait que ca soit important (tant que les offsets sont bons, avec le mien, la recherche d'une frame sera juste tres indistinctement plus longue) C:\Documents and Settings\lorent\Bureau\download\RiffWalk>RiffWalk.exe -f2 -x ..\..\export1.avi 00000000 RIFF (00000160) 'AVI ' 0000000C LIST (00000100) 'hdrl' 00000018 avih (00000038) TotalFrames : 367 Streams : 1 InitialFrames: 0 MaxBytes : 43632 BufferSize : 14544 uSecPerFrame : 333333 Rate : 3.000 fps Size : (352, 288) Flags : 0x00000800 00000058 LIST (000000B4) 'strl' 00000064 strh (00000038) Stream Type : vids Stream Handler: mjpg Samp/Sec : 3.000 Priority : 0 Language : unspecified InitialFrames : 0 Start : 0 Length : 367 Length (sec) : 122.3 Flags : 0x00000000 BufferSize : 14544 Quality : 10000 SampleSize : 0 Frame Rect : [0 0 352 288] 000000A4 strf (00000028) Size : (352, 288) Bit Depth : 24 Colors used : 0 Compression : MJPG Image Size : 14544 000000D4 indx (00000038) 04 00 00 00 02 00 00 00 30 30 64 63 00 00 00 00 '........00dc....' 00 00 00 00 00 00 00 00 48 80 3A 00 00 00 00 00 '........H.:.....' B8 08 00 00 5C 00 00 00 A8 84 4E 00 00 00 00 00 '....\.....N.....' 08 03 00 00 1F 00 00 00 '........ ' 00000154 LIST (00000004) 'movi' 00000160 idx1 (00000000)00000168 warning: RIFF file contains 4E87C0 additional bytes after end of RIFF chunk. 004E8928 C:\Documents and Settings\lorent\Bureau\download\RiffWalk> [edit4]en fait, on va arreter de reediter, histoire de... (avis aux admins: desole pour le multiposte occasionne) des idees ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 11 avril 2008 Auteur Partager Posté(e) le 11 avril 2008 Maintenant: plus aucun erreur a l'ouverture du fichier !! le probleme venait simplement de mes offset (il est probable que j'oubliais de compter 8bit par frame, assez genant, je vous l'accorde...), a quoi il fallait ajouter que certaines frames peuvent se repeter plusieurs fois (la video est issue d'un flux reseau, en cas d'emcombremant du trafic, on doit pouvoir gerer la duplication d'une ancienne frame pour ne pas perdre la notion de temps), et donc necessiter deux entrer differentes mais pointant au meme endroit dans le movi chunk (or, avec mon algo precedant, c'etait impossible) mais vous noterez que j'ai bien precise 'a l'ouverture': en effet, a la lecture, la video stagne sur la premiere frame, et ne bouge pas ; arrive a sa fin, la frame actuelle reste presente, a la quelle se supperpose deux de ses doublons, en bas a gauche et en bas a droite, a l'echelle 1/2, rotation de 180° et 'effet mirroir', avec une saturation de rose/violet (enfin, le couleure, je presume qu'on s'en cogne un peut). La nouvelle question est donc: qu'est-ce qui peut faire dans l'encodage d'une video que dans sa lecture on pourrait rencontrer ce probleme ? Merci pour votre aide ! [dernier edit!] bon, on va sans doute changer le topic en fait, en cherchant a droite a gauche, j'ai installe PICVideo M-JPEG 3 et la, miracle, la video fonctionne parfaitement (sans commentaires je vous pris, c'est pourtant note partout que VDb 1.7.8 supporte les "AVI 2") sauf que maintenant, ben, quand je lis une video avec ce codec, en haut, il y a note "PICVideo M-JPEG 3", et en bas, l'adresse de leur site... pas tres professionel... Par contre, a part avec VirtualDub et Gspot, je n'arrive pas a lire la video (pas d'image, voire une erreur) (et pour la petite histoire, GSpot segfault quand je quitte apres avoir lu une de mes videos de test) je vais essayer de desinstaller ce codec (enfin, d'abord, la pose clope), mais il m'en faudrait un qui marche "normalement", et si possible sur un vrai player (je parle pas de windows media player, rassurez vous, mais quelque chose comme VLC, ou autre) des idees a ce sujet ? merci ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 12 mai 2008 Auteur Partager Posté(e) le 12 mai 2008 Bonjour Je remet ce topic en circulation: j'ai un nouveau probleme... La video semble fonctionner correctement (aucuns problemes, mis a part VLC qui laisse une frame fixe pendant tout le temps de la lecture, mais avec une video de test (MJPG, 10G - donc AVI2 - genere avec VirtualDub), je me retrouve avec le meme probleme, donc, pour l'instant, le laisse ce probleme de cote. Ce qui me gene le plus, c'est qu'avec WMP, la video passe, mais des que je me deplace dans la barre d'avancement, le temps avance exatement 3x plus vite (indice: la video est a 3fps, et oui, je suis sur que le temps passe exactement 3x plus vite, j'ai rajoute un timecode). Par contre, sur Media Player Classic, le player de VirtualDub ou encore totem, ... aucuns problemes. Des idees sur l'origine ou la solution ? (l'alcool ne sera pas considere comme une solution ici, merci ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 13 mai 2008 Partager Posté(e) le 13 mai 2008 une corde ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 13 mai 2008 Auteur Partager Posté(e) le 13 mai 2008 je vais garder cette solution a l'etude en dernier recours, mais ca m'arrangerait de trouver quelque chose de plus fonctionnel :) pour info, je remplie mes header comme ca: RIFF riff_chunk_size 'AVI ' LIST header_chunk_size hdrl avih avi_header_size 1000000 / fps // microseconds per frame suggested_buf_size * fps // max bytes per second 0 // padding granularity AVIF_HASINDEX | AVIF_MUSTUSEINDEX | AVIF_TRUSTCKTYPE // flags nb_frames // nombre de frames 0 // initial frame 1 // number of streams suggested_buf_size // suggested buffer size width // width height // height 1 // scale fps // rate 0 // start nb_frames // length LIST strl_size strl strh strh_size vids // VIDeo Stream mjpg // FOURCC: MJPEG stream 0 // flags 0 // priority / language 0 // initial frames 1 // scale fps // rate in units / second 0 // starting time nb_frames // length suggested_buf_size // buffer size 10000 // quality 0 // sample size (0 = variable) 0 // left of playing window 0 // top of playing window width // right of playing window height // bottom of playing window strf strf_size 40 // biSize width // biWidth height // biHeight 1 // biPlanes 24 // biBitCount MJPG; // biCompression suggested_buf_size // biSizeImages width // biXPelsPerMeter height // biYPelsPerMeter -- height ? 0 // biClrUsed 0 // biClrImportant [indx] [junk] [...] Lien vers le commentaire Partager sur d’autres sites More sharing options...
Mephisto Posté(e) le 13 mai 2008 Auteur Partager Posté(e) le 13 mai 2008 euh.... en fait; j'ai trouve, et la j'ai honte mon erreur venait du superindex, dans le tableau en fin de structure ou lùon rentre l'offset, la size et le timespan au timespan je mettais le (nombre de frames / fps), sauf qu'apparemment, et allez savoir pourquoi, quartz.dll ne compte pas le temps en secondes... en ne mettant que le nombre de frames concerne par l'entree dans ce tableau, ca fonctionne parfaitement a defaut d'avoir suscite l'interet des foules, j'espere que ce topic aidera les suivants qui souhaiteront reinventer la roue :) desole Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 20 mai 2008 Partager Posté(e) le 20 mai 2008 T'as pas à être désolé. Ça montre simplement que la quasi-totalité du forum n'a pas le level pour ce genre de problèmes... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.