2012-02-16 3 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를 AVI 파일로 작성

먼저 OpenCV Videowriter를 사용해 보았습니다. 그러나이 엄청난 양의 비디오 데이터 (이 비디오 스트림을 캡처하고 있는데 각각 1080p25 형식입니다)가 느리기 때문에 Windows 용 "Video for Video"라이브러리로 전환했습니다.

우선은 AVIFile가 & AVIStream의 avi_left_s avi_left 초기화 : 캡처가 종료 된 경우

//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); 

: 새로운 데이터가 도착하는 경우

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)); 

를 - 내 C++ 알고리즘은 다음과 같은 소스 코드가 포함되어 있습니다 :

//Closing AVIStream & AVIFile 

AVIStreamClose(avi_left_s); 
AVIFileClose(avi_left); 
AVIFileExit(); 

하지만이 코드는 작동하지 않습니다. 괜찮아. 마지막 부분이 실행되는 동안 오류 메시지가 나타납니다. XsensDecklinkCapture.exe의 Unbehandelte Ausnahme bei 0x5ee36266 : 0xC0000005 : 0x1400005 : Zigriffsverletzung beim Lesen 위치 0xcdcdcdcd. 어쩌면 당신은 어떤 생각을 가지고 있을까요? 내 코드에 큰 실수가 있습니까?

답변

2

비디오 코드를 직접 확인하기 전에 위반 예외에 액세스하면 곧바로이 문제를 해결해야합니다. 예외가 있습니다 - 예외 위치에서 호출 스택을 확인할 수 있으며 여기에 게시하여 문제의 원인이되는 코드 줄을 제공해야합니다.

0xcdcdcdcd을 사용하면 초기화되지 않은 포인터가 유효한 것처럼 액세스 할 수있는 문제가 발생할 수 있습니다.

+0

죄송합니다.) 마침내 얻었습니다. 코드는 정상적으로 작동합니다.) 감사합니다. – user1213697

+0

사실 실제로 속도를 높이기위한 아이디어가 매우 느립니다. – user1213697

+0

느린 것이 있으면 원래 질문에 게시 한 코드가 아닙니다. 'AVI' API는 매우 가볍습니다. 비디오 프로세싱으로 워크 스테이션에 엄청난 부하가 걸린 지 15 년이 넘었으며, 이미 API가 그 당시에 훌륭하게 작동했습니다. 다른 곳에서는 속도가 느려지므로 디버깅 과정에서 이러한 처리 단계를 격리해야합니다. –