2011-01-12 4 views
2

Je travaille avec une caméra haute résolution: 4008x2672. J'écris un programme simple qui saisit l'image de la caméra et envoie le cadre à un fichier avi. Pour travailler avec une résolution aussi élevée, je n'ai trouvé que du codec x264 qui pourrait faire l'affaire (Suggestions bienvenues). J'utilise opencv pour la plupart des trucs de manipulation d'images. Comme mentionné dans cet article http://doom10.org/index.php?topic=1019.0, j'ai modifié les membres AVCodecContext selon les préréglages ffmpeg pour libx264 (J'ai dû faire ceci pour éviter les erreurs de configuration par défaut de ffmpeg). C'est sortie que je reçois lorsque je tente d'exécuter le programmeCodage X264 en utilisant Opencv

libx264 @ 0x992d040]non-strictly-monotonic PTS 
1294846981.526675 1 0 //Timestamp camera_no frame_no 
1294846981.621101 1 1 
1294846981.715521 1 2 
1294846981.809939 1 3 
1294846981.904360 1 4 
1294846981.998782 1 5 
1294846982.093203 1 6 
    Last message repeated 7 times 
[avi @ 0x992beb0]st:0 error, non monotone timestamps 
-614891469123651720 >= -614891469123651720 

OpenCV Error: Unspecified error (Error while writing video frame) in 
icv_av_write_frame_FFMPEG, file 
/home/ajoshi/ext/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp, line 1034 
terminate called after throwing an instance of 'cv::Exception' 
what(): /home/ajoshi/ext/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp:1034: 
error: (-2) Error while writing video frame in function icv_av_write_frame_FFMPEG 

Aborted

Les modifications du AVCodecContext sont:

if(codec_id == CODEC_ID_H264) 
{ 
    //fprintf(stderr, "Trying to parse a preset file for libx264\n"); 
    //Setting Values manually from medium preset 
    c->me_method = 7; 
    c->qcompress=0.6; 
    c->qmin = 10; 
    c->qmax = 51; 
    c->max_qdiff = 4; 
    c->i_quant_factor=0.71; 
    c->max_b_frames=3; 
    c->b_frame_strategy = 1; 
    c->me_range = 16;<br> 
    c->me_subpel_quality=7; 
    c->coder_type = 1; 
    c->scenechange_threshold=40; 
    c->partitions = X264_PART_I8X8 | X264_PART_I4X4 | X264_PART_P8X8 | X264_PART_B8X8; 
    c->flags = CODEC_FLAG_LOOP_FILTER; 
    c->flags2 = CODEC_FLAG2_BPYRAMID | CODEC_FLAG2_MIXED_REFS | CODEC_FLAG2_WPRED | CODEC_FLAG2_8X8DCT | CODEC_FLAG2_FASTPSKIP; 
    c->keyint_min = 25; 
    c->refs = 3; 
    c->trellis=1; 
    c->directpred = 1; 
    c->weighted_p_pred=2; 
} 

Je ne suis probablement pas mise en dts et pts valeurs que je Je crois que ffmpeg devrait être le réglage pour moi.

Toutes les suggestions sont les bienvenues.
Merci d'avance

Répondre

1

Je ferais probablement exécuter l'exécutable x264 dans un autre processus et y placerais des pixels rgb ou yuv. Ensuite, vous pouvez utiliser tous les indicateurs normaux x264 (ou ffmpeg) et il gère le multi-threading pour vous.

Et puisque x264 est sous licence GPL, il vous donne également plus de liberté sur la licence de votre application.

ps. Voici un exemple de code utilisant ffmpeg from Qt, vous pouvez ignorer les bits spécifiques à Qt mais cela donne un bon point de départ pour utiliser ffmpeg depuis une application C++.

1

L'erreur réelle est "horodatage non monotone". Il semble que vous n'avez pas correctement initialisé les propriétés de l'image vidéo. Si son utilisation possible libx264 directement. Ce sera plus facile à gérer.

PS. vous pouvez contourner le problème de réglage de ffmpeg x264 en spécifiant le fichier de preset 264 avec l'option -fvpre.

0

La valeur pts de l'AVFrame que vous envoyez en tant que dernier argument de avcodec_encode_video doit être définie par vous. Une fois que vous avez défini ceci, le champ coded_from-> pts du contexte du codec aura la valeur correcte que vous pouvez av_rescale_q() et définie dans l'AVPacket pour votre av_interleaved_write_frame().

Questions connexes