2011-01-12 9 views
2

Ich arbeite mit einer hochauflösenden Kamera: 4008x2672. Ich schreibe ein einfaches Programm, das Frame von der Kamera ergreift und den Frame an eine AVI-Datei sendet. Für das Arbeiten mit solch einer hohen Auflösung habe ich nur einen x264-Codec gefunden, der den Trick machen könnte (Vorschläge willkommen). Ich benutze opencv für die meisten Bildbearbeitung Sachen. Wie in diesem Post http://doom10.org/index.php?topic=1019.0 erwähnt, habe ich die AVCodecContext-Mitglieder wie in ffmpeg Voreinstellungen für libx264 geändert (musste dies tun, um defekte ffmpeg Standardeinstellungen Fehler zu vermeiden). Dies ist Ausgabe ich immer bin, wenn ich versuche, das ProgrammX264 Codierung mit 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

Änderungen am AVCodecContext auszuführen, sind:

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; 
} 

Ich bin wahrscheinlich nicht die dts Einstellung und pts Werte, die ich geglaubt ffmpeg sollte es für mich einstellen.

Alle Vorschläge willkommen.
Vielen Dank im Voraus

Antwort

1

Ich würde wahrscheinlich die x264 ausführbare Datei in einem anderen Prozess ausführen und entweder rgb oder yuv Pixel zu pipen. Dann können Sie alle normalen x264 (oder ffmpeg) -Flags verwenden und es behandelt Multi-Threading für Sie.

Und da x264 ist GPL lizenziert gibt Ihnen auch mehr Freiheit bei der Lizenzierung Ihrer App.

ps. Hier ist ein Beispielcode mit ffmpeg from Qt Sie können die Qt spezifischen Bits ignorieren, aber es gibt einen guten Ausgangspunkt für die Verwendung von ffmpeg aus einer C++ App.

1

Aktueller Fehler ist "nicht monotone Zeitstempel". Es scheint, dass Sie die Video-Frame-Eigenschaften nicht richtig initialisiert haben. Wenn es möglich ist, benutze libx264 direkt. Es wird einfacher zu handhaben sein.

PS. Sie können das Problem mit ffmpeg x264 umgehen, indem Sie eine 264-Preset-Datei mit der Option -fvpre angeben.

0

Der pts-Wert des AVFrame, den Sie als letztes Argument an avcodec_encode_video senden, muss von Ihnen festgelegt werden. Sobald Sie dies festgelegt haben, wird das Feld coded_from-> pts des Codec-Kontexts den richtigen Wert haben, den Sie av_rescale_q() und im AVPacket für Ihren av_interleaved_write_frame() setzen können.