Jump to content

[RESOLU] convertisseur flux MJPG -> AVI


Recommended Posts

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 !

Link to post
Share on other sites

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 ?

Link to post
Share on other sites

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 !

Link to post
Share on other sites
  • 1 month later...

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 :D)

Link to post
Share on other sites

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]
[...]

Link to post
Share on other sites

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

Link to post
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...