0

このコード スニペットは、 と によって範囲が定義されているビデオの一部を保存することになっていstartますenddata[i]元のビデオで撮影されたビデオの開始フレームと終了フレームを保持する構造体 ( ) の配列があります。合計8ショットあります。

for (int i = 0; i < finalCount-1; ++i) {
    capture = cvCaptureFromAVI("Stats\\Shots\\Cricketc1.avi");
    assert(capture);

    int frame_number = 0;
    int start = data[i].start_frame;
    int end   = data[i].end_frame;

    char shotname[100];
    strcpy_s(shotname, "shot_");
    char shot_id[30];
    _itoa_s(data[i].shot_no, shot_id, 10);
    strcat_s(shotname, shot_id);
    strcat_s(shotname, ".avi");

    IplImage* image = NULL;

    CvVideoWriter* writer = NULL;
    writer = cvCreateVideoWriter (shotname, CV_FOURCC('i','Y','U','V'), fps, cvSize(width, height), 1);
    assert(writer);
    while (frame_number >= start && frame_number < end) {
        image = cvQueryFrame(capture);
        assert(image);
        cvWriteFrame(writer, image);
    }
    cvReleaseImage(&image);
    cvReleaseVideoWriter(&writer);
    cvReleaseCapture(&capture);
    cout << shotname << " saved ..." << endl;
}

プログラムを実行すると、サイズが 6kb で実行されない 8 つのビデオ ファイルが作成されます。divx、mjpg、mpg2、iyuv などのさまざまなコーデックを試しましたが、すべて同じ結果になります。

4

2 に答える 2

2

あなたのwhileループでframe_numberは、インクリメントされることはありません。whileプログラムが実際に実行されてファイルが作成されると言うので、これはループ内で何も実行されないことを意味します...そうしないと、frame_number常に0.

の代わりに初期化frame_numberすることをお勧めします。ループの範囲外に存在する理由はないため、 a の方が適切と思われます。start0for

int start = data[i].start_frame;
int end   = data[i].end_frame;

...

for (int frame_number = start; frame_number < end; frame_number++) {
    image = cvQueryFrame(capture);
    assert(image);
    cvWriteFrame(writer, image);
}
于 2013-01-03T21:20:53.740 に答える
1

Gunther Foxの回答が別のコーデックを使用しようとするのに役立たない場合-それは非常に奇妙ですが、私の状況ではiyuvがまったく機能せず、他のいくつかのコーデックは正常に機能しますが、デバッグ中にそれらを読み取ることができません...私にとって- ms video と radius cinepak は常に正常に動作します (書き込みと読み取り)。iyuv はまったく動作しません。他のコード - 書き込みと読み取り、デバッグ中は動作しません。

于 2013-01-04T01:14:50.187 に答える