2012-02-02 9 views
0

AVIStreamWriteを使用してAVIファイルに書き込もうとしていますが、結果のAVIファイルがちょっと混乱しています。 aviファイルの画像には適切な画像と色が含まれていますが、動画の再生時間と速度はオフです。私は約7秒のビデオを録画し、Windowsエクスプローラのファイルプロパティを調べると、約2秒の時間があることがわかりました。 Media Playerで再生したとき、再生時間が短すぎて非常に速く再生されているように見えました(ビデオの動きは早送りのようでした)。私はまた、Media Playerを使用してビデオ内で探すこともできません。ここで は、私は私のカメラからフレームを受信したときAVIStreamWriteで作成された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マルチプレクサからなるグラフを作成し、aviファイルを作成しました。結果のAVIファイルは問題ありませんでした。フレームレートは30fpsで、私が使用しているのと同じです。私はAVIStreamInfoへの呼び出しを使用して両方のaviファイル(私の '悪い'と '良い'はGraphEditで作成されたもの)を照会し、ストリーム情報は両方のファイルでほとんど同じでした。私は、1秒あたりのサンプル数またはフレーム数が私の「悪い」aviのために離れていると予想していたでしょうが、そうではありませんでした。私は私のAVIが間違った長さを持ち、速度を上げて再生するように思える何かを間違ってやっていますか?私はVFWを使うのが初めてだから、どんな助けもありがとう。ありがとう

+0

実際にそこに書き込んだフレームの数はいくつですか?ファイルを閉じるときに '_frameCount'とは何ですか?それは「150」ではないですか? –

+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、 _frameCountは実際には141フレームで、30フレーム/秒で約4.7秒です。フレームをどこかにドロップしなければならないようだ。基本的には、DirectShowグラフを作成してラップトップのWebカメラに接続し、ISampleGrabberCBを使用してフレームを取得して、それを購読者に公開しています。その1つは自分のaviライターです。私は、私のsampleGrabberCBまたはフレームの私の出版のいずれかで、私は4つのフレームのおおよそ1つを失うと思っています。 – mash

答えて

1

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

+0

入力ローマ字をありがとう。あなたが正しいと思う、私のフレームのすべてがAVIStreamWriteに達していない! – mash

関連する問題