2011-01-12 102 views
2

我正在使用高分辨率相機:4008x2672。我寫了一個簡單的程序,從相機抓取幀並將幀發送到avi文件。爲了處理如此高的分辨率,我發現只有x264編解碼器可以做到這一點(建議歡迎)。我正在使用opencv處理大部分圖像處理內容。正如在這篇文章http://doom10.org/index.php?topic=1019.0中提到的那樣,我修改了AVCodecContext成員,按照libx264的ffmpeg預設(必須這樣做以避免破壞ffmpeg默認設置錯誤)。這是我得到的輸出,當我嘗試運行程序使用Opencv進行X264編碼

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 

中止

修改到AVCodecContext是:

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

我可能不會設置DTS和PTS值我相信ffmpeg應該爲我設定。

歡迎任何建議。
在此先感謝

回答

1

我可能會在另一個進程中運行x264可執行文件,並管道rgb或yuv像素到它。然後,您可以使用所有常規的x264(或ffmpeg)標誌,併爲您處理多線程。

由於x264是GPL授權,它還爲您提供更多的自由授權您的應用程序。

ps。以下是一些使用ffmpeg from Qt的示例代碼,您可以忽略Qt特定位,但它爲從C++應用程序使用ffmpeg提供了一個很好的起點。

1

實際錯誤是「非單調時間戳」。我似乎沒有正確初始化視頻幀屬性。如果它可能直接使用libx264。這將更容易處理。

PS。您可以通過使用-fvpre選項指定264預設文件來解決ffmpeg x264設置問題。

0

您作爲avcodec_encode_video的最後一個參數發送的AVFrame的pts值需要由您設置。設置完成後,編解碼器上下文的coded_from-> pts字段將具有正確的值,您可以使用av_rescale_q()並在AVPacket中設置av_interleaved_write_frame()。