2

4008x2672 の高解像度カメラを使用しています。カメラからフレームを取得し、そのフレームを avi ファイルに送信する簡単なプログラムを作成しています。このような高解像度で作業するには、トリックを実行できる x264 コーデックしか見つかりませんでした (提案を歓迎します)。ほとんどの画像処理にopencvを使用しています。この投稿http://doom10.org/index.php?topic=1019.0で述べたように、libx264 の ffmpeg プリセットに従って AVCodecContext メンバーを変更しました (壊れた ffmpeg デフォルト設定エラーを回避するためにこれを行う必要がありました)。これは、プログラムを実行しようとしたときに得られる出力です

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

おそらく、ffmpeg が設定すべきだと思っていた dts と pts の値を設定していません。

どんな提案も歓迎します。
前もって感謝します

4

3 に答える 3

1

おそらく、x264 実行可能ファイルを別のプロセスで実行し、rgb または yuv ピクセルをパイプします。次に、すべての通常の x264 (または ffmpeg) フラグを使用して、マルチスレッドを処理します。

また、x264 は GPL ライセンスであるため、アプリのライセンス供与の自由度も高まります。

ps。Qt のffmpeg を使用したサンプル コードを次に示します。Qt 固有のビットは無視できますが、C++ アプリから ffmpeg を使用するための良い出発点となります。

于 2011-01-15T21:10:05.773 に答える
1

実際のエラーは「単調でないタイムスタンプ」です。ビデオ フレームのプロパティを正しく初期化していないようです。可能であれば、libx264 を直接使用してください。より扱いやすくなります。

PS。-fvpre オプションで 264 プリセット ファイルを指定することで、ffmpeg x264 設定の問題を回避できます。

于 2011-01-16T01:21:38.013 に答える