[OpenCV 2.1] Créer un flux vidéo
Bonsoir,
J'utilise OpenCV 2.1 sous Windows 7. Je souhaite créer un flux vidéo identique à celui en entrée. Pour cela, je fais :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
// ouverture du flux vidéo à partir du fichier test.avi
capture = cvCaptureFromFile("test.avi");
// créer d'un video writer
CvVideoWriter* writer
= cvCreateVideoWriter("res.avi",
//CV_FOURCC('P','I','M','1'),
//CV_FOURCC('M','J','P','G'),
cvGetCaptureProperty(capture, CV_CAP_PROP_FOURCC),
cvGetCaptureProperty(capture, CV_CAP_PROP_FPS),
cvSize(w, h)
);
// get a frame
image = cvQueryFrame(capture);
// write a frame
cvWriteFrame(writer, image ); |
Le problème est que le programme plante sur la dernière ligne. Après investigation, il s'agit d'un problème de codec car la fonction cvGetCaptureProperty(capture, CV_CAP_PROP_FOURCC) semble retourner 0.0
De même en passant CV_FOURCC('P','I','M','1') ou CV_FOURCC('M','J','P','G'), le programme plante sur la même ligne.
En mettant -1 à ce paramètre, cela marche et j'ai une fenêtre qui s'ouvre me demandant de choisir le codec à utiliser mais quelque soit mon choix, la vidéo en sortie est beaucoup plus grosse que celle en entrée.
Je voudrais juste "dupliquer" une vidéo passée en entrée. (bien sur à termes, il y aura des traitements intermédiaires)
Il faut savoir que j'ai un warning :
Citation:
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler. You may try recompiling using gcc >= 4.2.
Do not report crashes to FFmpeg developers.
Apparemment ce n'est pas grave... mais peut être que le problème vient de là mais aucune solution a été trouvé pour virer ce message à part utiliser Linux pour recompiler la lib !
Merci et bonne soirée :)
et bien essai de voir ton problème avec les boucles
une vidéo est une succession d'images cadencée à une certaine fréquence (pas important pour l'instant vu que tu en a tenu compte),
donc je te propose un truc du genre
Code:
1 2 3 4 5 6 7 8 9
|
while((frame = cvQueryFrame(capture)) != NULL)
{
cvWriteFrame( writer, frame );
}
//Libération des resources
cvReleaseVideoWriter(&writer);
cvReleaseImage( &frame );
return(0); |
en tenant compte du fait que ton writer est bien fait :ccool: