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

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

Marsh Posté le 29-10-2005 à 22:48:45    

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 !

Reply

Marsh Posté le 29-10-2005 à 22:48:45   

Reply

Marsh Posté le 30-10-2005 à 14:54:48    

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 :
  1. void Add_Audio(char * Name,PAVISTREAM audio)
  2. {
  3. PAVIFILE avi_file;
  4. AVIFileInit();
  5. AVIFileOpen(&avi_file, Name, OF_WRITE | OF_CREATE, NULL);
  6. //AVISTREAMINFO
  7. AVISTREAMINFO avi_stream_info;
  8. int a=AVIStreamInfo(audio, &avi_stream_info, sizeof(AVISTREAMINFO));
  9. //WAVEFORMATEX
  10. WAVEFORMATEX wave;
  11. LONG lStreamSize = sizeof(wave);
  12. AVIStreamReadFormat(audio, 0, &wave, &lStreamSize);
  13. //Nouveau stream
  14. PAVISTREAM newstream;
  15. AVIFileCreateStream(avi_file, &newstream, &avi_stream_info);
  16. AVIStreamSetFormat(newstream, 0, &wave, sizeof(wave));
  17. int size=wave.cbSize; // Quel est la taille d'une frame son ?
  18. unsigned char * trame=new unsigned char[size];
  19. //Copie byte par byte
  20. for(int i=AVIStreamStart(audio);i<AVIStreamEnd(audio);i++)
  21. {
  22.  AVIStreamRead(audio,i,1,trame,size,NULL,NULL);
  23.  AVIStreamWrite(newstream,i,1,trame,size, AVIIF_KEYFRAME, NULL, NULL);
  24. }
  25. AVIStreamRelease(audio);
  26. AVIStreamRelease(newstream);
  27. AVIFileRelease(avi_file);
  28. }


 
"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...

Reply

Marsh Posté le 30-10-2005 à 15:29:58    

PS : ce n'est pas byte par byte que je copie mais frame par frame...
 
Apparament, la trame ne change jamais dans la boucle...


Message édité par Shadiest le 30-10-2005 à 15:52:56
Reply

Marsh Posté le 30-10-2005 à 16:54:05    

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
 
quelle taille doit-je accorder au buffer ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed