キャプチャカードから受け取った4:2:0の生データの一部をAVIファイルに書き込もうとしています。すべてのピクセルに対して、charバッファには2バイト(16ビット)が格納されます。データの順序は、FOURCC UYVY:YUV 4:2:2と同じです(各ピクセルでYサンプル、各ラインで水平ピクセルごとにUとVがサンプリングされます)。マクロピクセルは、1つのu_int32に2つのピクセルを含みます。CUのWindows用ビデオ経由で4:2:0のYUV-RawdataをVideo for Windowsに書き込む
まず、私はOpenCV Videowriterを試しました。しかし、これは、この膨大な量のビデオデータ(私は2つのビデオストリームをキャプチャしていますが、それぞれ1080p25形式です)では単純に遅いので、Windowsの「Video for Windows」ライブラリに切り替えました。 - 私のC++アルゴリズムは、以下のソースコードが含まれます。
まず私はAVIFILE avi_left & AVIStream avi_left_sを初期化:
HRESULT hr = S_OK;
AVIFileInit();
hr=AVIFileOpen(&avi_left,L"Test.avi",OF_WRITE|OF_CREATE, NULL);
if (hr != 0)
{
printf("AVI ERROR");
Sleep(3000);
exit(0);
}
//No compression output with 25 fps
al_info.fccType = streamtypeVIDEO;
al_info.fccHandler = 0;
al_info.dwScale = 1;
al_info.dwRate = 25;
al_info.dwSuggestedBufferSize = 0;
al_info.dwSampleSize = 0;
SetRect(&al_info.rcFrame, 0, 0,1920,1080);
//Define Header for the YUV-Rawdata
BITMAPINFO bi;
ZeroMemory(&bi,sizeof(bi));
BITMAPINFOHEADER &bmi = bi.bmiHeader;
bmi.biSize=sizeof(bmi);
bmi.biWidth=1920;
bmi.biHeight=1080;
bmi.biPlanes=1;
bmi.biBitCount=16;
bmi.biCompression=0x59565955;
bmi.biSizeImage = bmi.biWidth*bmi.biHeight*2;
bmi.biXPelsPerMeter=10000;
bmi.biYPelsPerMeter=10000;
bmi.biClrUsed=0;
bmi.biClrImportant=0;
hr = AVIFileCreateStream(avi_left,&avi_left_s,&al_info);
hr = AVIStreamSetFormat(avi_left_s, 0,&bmi,sizeof(bmi));
いくつかの新しいデータが到着した場合:
//m_byteBufferleft = rawdata as char array in UYVY-order
BYTE* bufferleft=(BYTE*)m_byteBufferleft;
// Writing Data
long size = width * height * 2;
HRESULT hr = AVIStreamWrite(avi_left_s,frameCount-1,1,bufferleft,size,AVIIF_KEYFRAME,NULL,NULL);
をキャプチャが終了している場合:
//Closing AVIStream & AVIFile
AVIStreamClose(avi_left_s);
AVIFileClose(avi_left);
AVIFileExit();
しかし、このコードは機能しません罰金。最後の部分が実行されている間、エラーメッセージが表示されます。XsensDecklinkCapture.exeのUnbehandelte Ausnahme bei 0x5ee36266:0xC0000005:Zigriffsverletzung beim Lesenの位置0xcdcdcdcd。多分あなたはアイデアを持っていますか?私のコードに大きな間違いがありますか?
申し訳ありませんが、最終的にそれを得た、コードは正常に動作します;)よろしくご連絡ください – user1213697
実際には、それは速度を上げるためにいくつかのアイデアを持っている実際には非常に遅いですか? – user1213697
遅い場合は、元の質問に投稿したコードではありません。 'AVI' APIは非常に軽量です。これは15年以上前にビデオ処理がワークステーションに大きな負荷をかけたときに作られたもので、その時点でAPIは既にうまく機能していました。他の場所で処理が遅いので、デバッグの過程でこれらの処理段階を分離する必要があります。 –