2011-01-12 36 views
2

私は高解像度カメラで作業しています:4008x2672。私は、カメラからフレームを取得し、そのフレームをaviファイルに送る簡単なプログラムを書いています。このような高解像度で作業するには、このトリックを行うことができるx264コーデックしか見つかりませんでした(推奨)。私は画像処理の大部分のためにopencvを使用しています。このポストhttp://doom10.org/index.php?topic=1019.0で述べたように、私はlibx264のffmpegプリセットごとにAVCodecContextメンバを変更しました(これは、ffmpegのデフォルト設定の誤りを避けるために行いました)。これは私がAVCodecContextへ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 

を実行しようとすると、私は取得しています出力されます:

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を設定し、I値は、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()とav_interleaved_write_frame()のAVPacketで設定できる正しい値が設定されます。

関連する問題