2013-03-17 21 views
1

我正在將YUV(YV12)幀寫入YUV文件。我準確地保存了101幀。但是當我播放輸出YUV文件時,我有兩個更多的幀,而每個第二幀總是空的。將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); 

我運行此塊101 times.I雙重檢查it.Where不另一幀是從哪裏來的?

回答

2

不知道有關的OpenGL什麼,但在YV12格式一幀的大小是

width * height * 1.5 

即柯洛瑪-部分由因子2水平地和垂直子採樣。 以上我看到3很多,改爲將值改爲1.5

如果您對我在python中編寫的YUV格式轉換工具checkout this感興趣,以及基於SDLhere的查看器。 Lot的靈感來源於:-)

+0

因此,fwrite應該考慮尺寸寬*高* 1.5? ,count參數是一樣的嗎?感謝您的信息,順便說一句! – 2013-03-17 22:10:48

+0

是的,看起來像它 – 2013-03-17 22:23:44

+0

@MichaelIV:關心1.5的Carefull!如果您在計算中使用浮點數,則容易出現舍入誤差。改用3/2;這當然意味着您的圖像寬度必須是可被2整除的數字(這是色度子採樣的限制)。 – datenwolf 2013-03-17 23:31:07