0

AVIStreamWriteを使用してAVIファイルに書き込もうとしていますが、結果のaviファイルが少し混乱しています。aviの画像には適切な画像と色が含まれていますが、ビデオの長さと速度はオフになっています。約7秒のはずのビデオを録画し、Windowsエクスプローラーでファイルのプロパティを見ると、約2秒の長さであることがわかりました。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を使用して、この同じカメラのVideoCaptureフィルターとAVIマルチプレクサで構成されるグラフを作成し、aviファイルを作成しました。結果のAVIファイルは問題ありませんでした。フレームレートは30fpsで、私が使用しているものと同じです。AVIStreamInfoの呼び出しを使用して、両方のaviファイル(GraphEditで作成された「悪い」ファイルと「良い」ファイル)を照会しましたが、ストリーム情報は両方のファイルでほぼ同じでした。私の「悪い」aviでは、1秒あたりのサンプル数またはフレーム数のいずれかが大幅に減少すると予想していましたが、そうではありませんでした。AVIの長さが正しくなく、高速で再生されているように見える何か間違ったことをしていますか?私はVFWを使うのが初めてなので、どんな助けでもありがたいです。ありがとう

4

1 に答える 1

1

意志のフレーム時間は最終的にになる_frameCount / _aviFpsので、フレームをドロップして到達しないAVIStreamWriteか、またはファイル内のいくつかのフレームをスキップしたい場合は、_frameCountフレームをジャンプしてにジャンプするために、それぞれインクリメントする必要がありますスキップ。

于 2012-02-03T16:14:55.290 に答える