0

此代码片段应该保存范围由start和定义的视频的一部分end。有一个结构数组 ( data[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;
}

运行该程序后,将创建 8 个大小为 6kb 且不运行的视频文件。我尝试了各种编解码器,如 divx、mjpg、mpg2、iyuv 等,但都给出了相同的结果。

4

2 回答 2

2

在你的while循环中,frame_number永远不会增加。既然你说程序实际执行并创建文件,这意味着你的while循环中没有任何东西运行......否则你会陷入无限循环,因为frame_number将永远是0.

我建议您初始化frame_number为,start而不是0它没有理由存在于循环范围之外,因此 afor似乎更合适:

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 回答