【问题标题】:Writing YUV to file results in duplicated frames将 YUV 写入文件会导致帧重复
【发布时间】:2013-03-18 05:02:21
【问题描述】:

我正在将 YUV (YV12) 帧写入 YUV 文件。我正好保存了 101 帧。但是当我播放输出 YUV 文件时,我有 2 倍以上的帧,而每一秒帧总是空的。

这是我的代码:

            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 次。我仔细检查了它。另一个帧是从哪里来的?

【问题讨论】:

    标签: c++ opengl video-encoding yuv


    【解决方案1】:

    对opengl一无所知,但是YV12格式的帧大小是

    width * height * 1.5
    

    即色度部分在水平和垂直方向上按因子 2 进行二次采样。 上面我看到3 很多,把那个值改为1.5

    如果您对我用 python 编写的 YUV 格式转换工具感兴趣,请查看this。还有一个基于SDLhere 的查看器。那里有很多灵感:-)

    【讨论】:

    • 所以 fwrite 应该采用 size width * height *1.5 吗? ,计数参数也一样?谢谢你的信息,顺便说一句!
    • @MichaelIV:小心 1.5!如果您在计算中使用浮点数,则容易出现舍入错误。改为使用 3/2;这当然意味着您的图像宽度必须是可被 2 整除的数字(这是色度子采样的约束)。
    • 是的,它是 704 x 480。谢谢。
    • @datenwolf - 你完全正确,应该提到w*h*3/2 部分!
    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多