Encodage AVI [Résolu]

Signaler
Messages postés
20
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
2 juillet 2006
-
Messages postés
69
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
23 avril 2009
-
J'aimerais encoder un fichier AVI en y ajoutant des images, j'utilise la classe 30768 Image et j'arrive déjà à récupérer des BMP à partir d'une vidéo (voir [forum.v2.aspx?ID=589666 http://www.cppfrance.com/forum.v2.aspx?ID=589666] )



Pour l'encodage, je ne suis pas sûr d'avoir saisi les parametres à
utiliser pour l'initialisation du nouveau stream et si une image en
unsigned char * convenait...



Le fait est que ça ne marche pas vraiment, le fichier AVI créé est de
bonne taille (aproximativement celle du bitmap) mais reste illisible ...



Code :

AVIEncodage::AVIEncodage(char *Name, Image *Premiere)

{

//Creation du Fichier

AVIFileOpen(&avi_file,Name,OF_WRITE | OF_CREATE, NULL);



//Copie des information pour formatage du stream

BITMAPINFOHEADER BInfo;

ZeroMemory(&BInfo, sizeof(BITMAPINFOHEADER));

BInfo.biBitCount = 24;

BInfo.biCompression = BI_RGB;

BInfo.biHeight = Premiere->Largeur;

BInfo.biWidth = Premiere->Hauteur;

BInfo.biPlanes = 1;

BInfo.biSize = sizeof(BInfo);

BInfo.biSizeImage = (Premiere->Largeur*Premiere->Hauteur*24*sizeof(BYTE))/8;



//Caractéristique du stream

AVISTREAMINFO streaminfo;

ZeroMemory(&streaminfo, sizeof(AVISTREAMINFO));



streaminfo.fccType = streamtypeVIDEO;

streaminfo.fccHandler =mmioFOURCC('M','P','G','4');

streaminfo.dwScale = 1;

streaminfo.dwRate =30;

streaminfo.dwSuggestedBufferSize =BInfo.biSizeImage;

streaminfo.dwQuality =1000;

streaminfo.rcFrame.right = Premiere->Hauteur;

streaminfo.rcFrame.bottom = Premiere->Largeur;



//Création d'un nouveau stream video

AVIFileCreateStream(avi_file,&avi_stream, &streaminfo);



//Formatage du stream

AVIStreamSetFormat(avi_stream, 0, &BInfo, sizeof(BInfo));



//Ecriture de l'image

AVIStreamWrite(avi_stream,0, 1,Premiere->PImage, BInfo.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);



AVIFileRelease(avi_file);

}



Merci pour votre aide

2 réponses

Messages postés
20
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
2 juillet 2006

Solution trouvé sur : http://www.gamedev.net/community/forums/topic.asp?topic_id=57497



Je me suis reinspirer de ce code pour refondre le mien...
Messages postés
69
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
23 avril 2009

Bonjour,

Chez moi ça marche en créant un stream compressé et en ajoutant l'image à celui-ci :

    ...

    //Création d'un nouveau stream video
    AVIFileCreateStream(avi_file,&avi_stream, &streaminfo);

    //Stream compressé
    PAVISTREAM pAviCompress;

    //Caractéristiques de compression
    AVICOMPRESSOPTIONS CompressOptions;
    memset(&CompressOptions,0,sizeof(AVICOMPRESSOPTIONS));
    CompressOptions.fccHandler = StreamInfo.fccHandler;
    CompressOptions.dwFlags = AVICOMPRESSF_KEYFRAMES|AVICOMPRESSF_VALID;
    CompressOptions.dwKeyFrameEvery = StreamInfo.dwRate;

    //Compression du stream
    AVIMakeCompressedStream(&pAviCompress,avi_stream,&CompressOptions,NULL);

    //Formatage du stream
    AVIStreamSetFormat(pAviCompress, 0, &BInfo, sizeof(BInfo));
   
    //Ecriture de l'image
    AVIStreamWrite(pAviCompress,0, 1,Premiere->PImage, BInfo.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);