2013-01-03 34 views
0

此代碼段應保存視頻的一部分,其範圍由startend定義。有一系列結構(data[i]),用於保存原始視頻中拍攝的視頻的開始和結束幀。共有8個鏡頭。在opencv中使用cvVideoWriter時出錯?

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等,但都給出了相同的結果。

回答

1

如果岡瑟·福克斯的回答贏得了」 t幫助嘗試使用不同的編解碼器 - 這很奇怪,但在我的情況下,iyuv根本不工作,其他一些編解碼器工作正常,但在調試時我無法讀取它們...對於我 - ms視頻和半徑cinepak始終工作正常(寫作和閱讀),iyuv根本沒有工作,其他代碼 - 寫作和閱讀,但不是在調試時。

+0

Radius cinepack在我的系統中不工作。有沒有辦法通過我可以找到由opencv安裝的編解碼器? –

2

在您的while循環中,frame_number永遠不會增加。既然你說程序實際執行並創建了這些文件,這意味着你的while循環中沒有任何東西運行......否則你會陷入無限循環,因爲frame_number將始終爲0

我勸你初始化frame_numberstart代替0而且也沒有理由爲它存在循環的範圍之外因此for似乎更爲合適:

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); 
} 
相關問題