我正在尝试使用AVIStreamWrite写入AVI文件,但生成的avi文件有点混乱。 avi中的图像包含正确的图像和颜色,但视频的持续时间和速度关闭。我录制了一段应该大约7秒的视频,并查看Windows资源管理器中的文件属性,它显示它的持续时间约为2秒。当我在Media Player中播放它时,它太短了,似乎播放速度非常快(视频中的动作就像快进一样)。我似乎也无法使用Media Player在视频中寻找。 这就是我正在做的......
//初始化
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创建一个图形,该图形由同一摄像机和AVI多路复用器的VideoCapture过滤器组成,并创建了一个avi文件。生成的AVI文件很好。帧速率为30 fps,与我使用的相同。我使用对AVIStreamInfo的调用查询了两个avi文件(我的'坏'和'使用GraphEdit创建的'好'文件),两个文件的流信息几乎相同。我原本期望每秒的样本或帧数都可以用于我的'坏'avi,但事实并非如此。我做错了什么会导致我的AVI长度不正确并且似乎以更快的速度播放?我是新手使用VFW,所以任何帮助表示赞赏。感谢
答案 0 :(得分:1)
遗嘱中的帧时间最终为_frameCount / _aviFps
,因此要么丢弃帧,要么不能到达AVIStreamWrite
,或者如果你想跳过几帧在文件中,您需要分别增加_frameCount
,跳过要跳过的帧。