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を使うのが初めてだから、どんな助けもありがとう。ありがとう
実際にそこに書き込んだフレームの数はいくつですか?ファイルを閉じるときに '_frameCount'とは何ですか?それは「150」ではないですか? –
えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、 _frameCountは実際には141フレームで、30フレーム/秒で約4.7秒です。フレームをどこかにドロップしなければならないようだ。基本的には、DirectShowグラフを作成してラップトップのWebカメラに接続し、ISampleGrabberCBを使用してフレームを取得して、それを購読者に公開しています。その1つは自分のaviライターです。私は、私のsampleGrabberCBまたはフレームの私の出版のいずれかで、私は4つのフレームのおおよそ1つを失うと思っています。 – mash