0

我正在尝试使用 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 的新手,因此不胜感激。谢谢

4

1 回答 1

1

最终将是帧时间_frameCount / _aviFps,所以要么你正在丢弃你的帧并且它们没有到达AVIStreamWrite,或者如果你喜欢跳过文件中的几帧,你需要_frameCount分别增加,以跳过帧到跳过。

于 2012-02-03T16:14:55.290 回答