2013-03-17 4 views
1

YUV 파일에 YUV (YV12) 프레임을 쓰고 있습니다. 정확히 101 프레임을 저장하고 있습니다. 그러나 출력 YUV 파일을 재생할 때마다 두 번째 프레임이 더 비싸지 만 두 번째 프레임은 항상 비어 있습니다. 나는 101 번요 번 확인 왔어 어디 다른 프레임에서 온 않는이 블록을 실행파일에 YUV를 쓰면 프레임이 중복됩니다.

  size_t lenght=_viewWidth * _viewHeight * 3; 
    BYTE *bytes=(BYTE*)malloc(lenght); 
    /////////////// read pixels from tex ///////////////////// 
    glBindTexture(GL_TEXTURE_2D,tex); 
    glGetTexImage(GL_TEXTURE_2D,0,GL_RGB,GL_UNSIGNED_BYTE,bytes); 
    glBindTexture(GL_TEXTURE_2D,0); 

     BYTE *uvOut= new uint8_t[_viewWidth * _viewHeight *3]; 

      if(cfg.seqStart <= cfg.seqEnd) 
    { 
    hOutFile = fopen(outFileName.c_str(), cfg.appendMode ? "ab" : "wb"); 
    assert(hOutFile!=0); 



     RGBtoYUV420PSameSize(bytes,uvOut,3,0,_viewWidth,_viewHeight); 

    fwrite(uvOut,_viewWidth* 3, _viewHeight, hOutFile); // Write V line 

    fclose(hOutFile); 
     cfg.seqStart++; 
    }else{ 

     printf("done"); 

    } 

    delete uvOut; 
    free(bytes); 

: 여기

내 코드?

답변

2

OpenGL이 대해서는 아무것도 모르지만 YV12 - 포맷 프레임의 크기는

width * height * 1.5 

은 즉 CROMA 부분은 종횡 계수 2로 서브 샘플링한다. 위의 내용은 3을 많이 보았습니다. 그 대신 값을 1.5으로 변경하십시오.

파이썬으로 작성한 YUV 형식 변환 도구 체크 아웃 this에 관심이 있다면. SDLhere에 기반한 시청자 많은 영감을 얻었습니다 :-)

+0

크기가 너비 * 높이 * 1.5 일 때 fwrite가 필요합니까? , count param도 마찬가지입니까? 정보 주셔서 감사합니다, btw! –

+0

예, 그럴 것 같습니다 –

+0

@MichaelIV : Carefull about 1.5! 계산시 부동 소수점 숫자를 사용하면 반올림 오류가 발생하기 쉽습니다. 대신 3/2를 사용하십시오. 이것은 물론 이미지 너비가 2로 나눌 수있는 숫자 여야한다는 것을 의미합니다 (이것은 크로마 하위 샘플링의 제한 조건입니다). – datenwolf

관련 문제