2012-02-02 64 views
0

我想寫使用AVIStreamWrite AVI文件,但生成的AVI文件是有點亂了。 avi中的圖像包含適當的圖像和顏色,但視頻的持續時間和速度已關閉。我錄製了一段應該在7秒鐘左右的視頻,並在Windows資源管理器中查看文件屬性,結果顯示它有大約2秒的持續時間。當我在媒體播放器中播放它時,它太短了,似乎很快播放(視頻中的動作就像快進)。我似乎也無法使用Media Player在視頻中尋找。 下面是我在做什麼...AVI有不正確的長度和播放速度

//初始化

HRESULT AVIWriter::Init() 
{ 
HRESULT hr = S_OK; 
_hAVIFile = NULL; 
_videoStream = NULL; 


_frameCount = 0; 
AVIFileInit(); 

::DeleteFileW(_filename); 

hr = AVIFileOpen(&_hAVIFile,_filename,OF_WRITE|OF_CREATE, NULL); 
if (hr != AVIERR_OK) 
{ 
    ::cout << "AVI ERROR"; 
    return 0; 
} 
/**************************************/ 
// Create a raw video stream in the file 
::ZeroMemory(&_streamInfo, sizeof(_streamInfo)); 
_streamInfo.fccType    = streamtypeVIDEO; // stream type 
_streamInfo.fccHandler    = 0;     // No compressor 
_streamInfo.dwScale    = 1;          
_streamInfo.dwRate     = _aviFps; //this is 30 
_streamInfo.dwSuggestedBufferSize = 0; 
_streamInfo.dwSampleSize = 0; 
SetRect(&_streamInfo.rcFrame, 0, 0,_bmi.biWidth , _bmi.biHeight); 

hr = AVIFileCreateStream( _hAVIFile,  // file pointer 
          &_videoStream,// returned stream pointer 
          &_streamInfo); // stream header 

hr = AVIStreamSetFormat(_videoStream, 0, 
          &_bmi, 
          sizeof(_bmi)); 

return hr; 
} 

//調用這個,當我從我的相機接收幀

HRESULT AVIWriter::AddFrameToAVI(BYTE* buffer) 
{ 
HRESULT hr; 
long size = _bmi.biHeight * _bmi.biWidth * 3; 

hr = AVIStreamWrite(_videoStream,   // stream pointer 
       _frameCount++,    // time of this frame 
       1,      // number to write 
       buffer, // pointer to data 
       size,// size of this frame 
       AVIIF_KEYFRAME,   // flags.... 
       NULL, 
       NULL); 

return hr; 

}

//調用此當我做

void AVIWriter::CloseAVI() 

    { 
    AVIStreamClose(_videoStream); 
    AVIFileClose(_hAVIFile); 
    AVIFileExit(); 

    } 

現在,作爲一個測試我用DirectShow中的GraphEdit中創建包含此相同的相機VideoCapture過濾器和AVI MUX的圖形和創建的AVI文件。由此產生的AVI文件很好。幀速率爲30 fps,與我使用的相同。我通過調用AVIStreamInfo來查詢兩個avi文件(我的'壞'和'用'GraphEdit創建的'好'),兩個文件的流信息幾乎相同。我本來預計每秒樣本數量或者幀數是爲了我的'壞'avi,但事實並非如此。我做錯了什麼,會導致我的AVI有不正確的長度,似乎以提高的速度播放?我是新來的使用VFW,所以任何幫助表示讚賞。謝謝

+0

那麼,多少幀你居然寫的呢?什麼是關閉文件時的_frameCount?它不是'150',是嗎? – 2012-02-03 15:49:34

+0

嗯...所以我再次跑了一遍,我錄了大約14秒,最後拍了大約4秒的視頻。 _frameCount實際上是141幀,其在30fps約4.7秒。似乎我必須在某個地方丟幀。基本上我做的是我創建了一個DirectShow圖形連接到我的筆記本電腦攝像頭,使用ISampleGrabberCB我抓住每一幀,然後發佈給我的訂閱者,其中之一是我的avi作家。我猜我在我的sampleGrabberCB中或者在我的發佈框架中大約每四幀中就有一幀丟失。 – mash 2012-02-03 16:10:55

回答

1

在遺囑中的幀時間將最終爲_frameCount/_aviFps,所以它要麼是你丟幀,他們沒有達到AVIStreamWrite,或者如果你喜歡跳過文件中的幾幀,你需要增加分別跳過幀跳過。

+0

感謝您輸入羅馬文。看起來你是對的,我的所有框架都沒有達到AVIStreamWrite! – mash 2012-02-03 16:33:50