Se connecter / S'enregistrer
Votre question

[C++] Copie de stream Audio dans un AVI

Tags :
  • Programmation
Dernière réponse : dans Programmation
29 Octobre 2005 22:25:38

Salut,

J'arrive à ouvrir un fichier AVI decompresser les frames pour obtenir des BMP (ou simplement un tableau de données) et recompresser ensuite ces frames pour avoir un nouveau fichier AVI par l'intermédiaire des méthodes AVIStreamGetFrame et AVIStreamWrite (dans le but d'appliquer des transformations aux images par la suite).

Mon problème est dans le stream audio, en effet, je ne souhaite pas modifier ce flux, je souhaiterai donc simplement le copier, j'aimerais donc creer une fonction du type "Add_Audio(PAVISTREAM stream_audio,PAVIFILE avi_file)" qui ajouterai le stream audio au fichier mais je ne vois pas du tout comment m'y prendre...

J'ai bien essayé d'appliquer la même méthode qu'avec le flux Vidéo mais beaucoup d'inconnues persistent, de plus, je ne souhaite pas traiter la piste audio, il n'est donc pas necessaire de la decomposer.

Merci d'avance de me libérer mon ignorance !

Autres pages sur : copie stream audio avi

30 Octobre 2005 14:58:58

J'ai un peu avancer, et compris que le Header d'un streamAudio etait du type WAVEFORMATEX, à l'excution de ce code, un fichier d'une taille relativement petite (devrai etre autour des 3mo et ne fait que 293 ko) mais d'une durée correcte, je n'ai pas trouvé d'information sur la taille des frames de son :

Code :

void Add_Audio(char * Name,PAVISTREAM audio)
{
PAVIFILE avi_file;

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

//AVISTREAMINFO
AVISTREAMINFO avi_stream_info;
int a=AVIStreamInfo(audio, &avi_stream_info, sizeof(AVISTREAMINFO));

//WAVEFORMATEX
WAVEFORMATEX wave;
LONG lStreamSize = sizeof(wave);
AVIStreamReadFormat(audio, 0, &wave, &lStreamSize);

//Nouveau stream
PAVISTREAM newstream;
AVIFileCreateStream(avi_file, &newstream, &avi_stream_info);
AVIStreamSetFormat(newstream, 0, &wave, sizeof(wave));

int size=wave.cbSize; // Quel est la taille d'une frame son ?

unsigned char * trame=new unsigned char;

//Copie byte par byte
for(int i=AVIStreamStart(audio);i<AVIStreamEnd(audio);i++)
{
AVIStreamRead(audio,i,1,trame,size,NULL,NULL);
AVIStreamWrite(newstream,i,1,trame,size, AVIIF_KEYFRAME, NULL, NULL);
}

AVIStreamRelease(audio);
AVIStreamRelease(newstream);

AVIFileRelease(avi_file);
}


"int size=wave.cbSize;" j'ai de serieux doute sur cette taille, car elle est égale à 12 quand je debug, ce qui me parai peu...
30 Octobre 2005 14:59:38

PS : ce n'est pas byte par byte que je copie mais frame par frame...

Apparament, la trame ne change jamais dans la boucle...
Contenus similaires
30 Octobre 2005 17:00:51

J'ai trouvé l'erreur, mais je ne sais comment la résoudre :
"AVIStreamRead(audio,i,1,trame,size,NULL,NULL);" me retourne AVIERR_BUFFERTOOSMALL

quel taille doit-je accorder au buffer ?
30 Octobre 2005 17:01:59

J'ai trouvé l'erreur, mais je ne sais comment la résoudre :
"AVIStreamRead(audio,i,1,trame,size,NULL,NULL);" me retourne AVIERR_BUFFERTOOSMALL

quel taille doit-je accorder au buffer ?
a b L Programmation
2 Novembre 2005 17:07:17

Ce sont des valeurs de sorties, tu déclares 2 variables:
  1. LONG nbOctets;
  2. LONG nbEchantillons;


Tu donne ces variables en pointeur à ta fonction:
  1. AVIStreamRead(audio,i,1,trame,size, &nbOctets, &nbEchantillons);


Et après cet appel, nbOctets contiendra le nombre d'octets mis dans le buffer trame (ce nombre étant < à size), et nbEchantillons contiendra le nombres de samples.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS