我正在尝试使用 AVIStreamWrite 写入 AVI 文件,但生成的 avi 文件有点混乱。avi 中的图像包含正确的图像和颜色,但视频的持续时间和速度已关闭。我录制了一个应该是 7 秒左右的视频,并在 Windows 资源管理器中查看文件属性,它显示它的持续时间约为 2 秒。当我在媒体播放器中播放它时,它太短了,而且播放速度似乎非常快(视频中的运动就像快进一样)。我似乎也无法使用媒体播放器在视频中搜索。这就是我正在做的...
//初始化
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 Filter 和 AVI mux 组成,并创建了一个 avi 文件。生成的 AVI 文件很好。帧速率为 30 fps,与我使用的相同。我使用对 AVIStreamInfo 的调用查询了两个 avi 文件(我的“坏”文件和用 GraphEdit 创建的“好”文件),两个文件的流信息几乎相同。我本来预计每秒的样本数或帧数对于我的“坏” avi 来说都是很差的,但事实并非如此。我是否做错了什么会导致我的 AVI 的长度不正确并且似乎以更高的速度播放?我是使用 VFW 的新手,因此不胜感激。谢谢