2012-02-16 5 views
0

キャプチャカードから受け取った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。多分あなたはアイデアを持っていますか?私のコードに大きな間違いがありますか?

答えて

2

ビデオコードそのものをチェックする前に、すぐに違反例外が発生するため、この問題に直接対処する必要があります。あなたは例外があります - 例外的な位置でコールスタックをチェックすることができます。問題の原因となるコード行を提供するためにここにポストする必要があります。

0xcdcdcdcdでは、初期化されていないポインタが有効であるかのようにアクセスされている可能性があります。

+0

申し訳ありませんが、最終的にそれを得た、コードは正常に動作します;)よろしくご連絡ください – user1213697

+0

実際には、それは速度を上げるためにいくつかのアイデアを持っている実際には非常に遅いですか? – user1213697

+0

遅い場合は、元の質問に投稿したコードではありません。 'AVI' APIは非常に軽量です。これは15年以上前にビデオ処理がワークステーションに大きな負荷をかけたときに作られたもので、その時点でAPIは既にうまく機能していました。他の場所で処理が遅いので、デバッグの過程でこれらの処理段階を分離する必要があります。 –

関連する問題