我想寫使用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,所以任何幫助表示讚賞。謝謝
那麼,多少幀你居然寫的呢?什麼是關閉文件時的_frameCount?它不是'150',是嗎? – 2012-02-03 15:49:34
嗯...所以我再次跑了一遍,我錄了大約14秒,最後拍了大約4秒的視頻。 _frameCount實際上是141幀,其在30fps約4.7秒。似乎我必須在某個地方丟幀。基本上我做的是我創建了一個DirectShow圖形連接到我的筆記本電腦攝像頭,使用ISampleGrabberCB我抓住每一幀,然後發佈給我的訂閱者,其中之一是我的avi作家。我猜我在我的sampleGrabberCB中或者在我的發佈框架中大約每四幀中就有一幀丟失。 – mash 2012-02-03 16:10:55