首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libyuv的问题::在Android上转换到i 420?

libyuv的问题::在Android上转换到i 420?
EN

Stack Overflow用户
提问于 2015-05-20 10:34:59
回答 2查看 2K关注 0票数 0

我设置了一个onPreviewFrame回调。这将获得一个byte[],其中包含NV21数据。我已将预览大小设置为176*144。当设备处于横向模式时,176个*144个维度的byte[]是完美的,但是当设备处于纵向模式时,我仍然可以得到相同尺寸的byte[]。

我想把byte[]旋转90度,得到尺寸为144*176的byte[]。

所以问题是,如何旋转数据,而不仅仅是预览图像?Camera.Parameters.setRotation只影响拍照,而不是视频。Camera.setDisplayOrientation特别指出,它只影响显示预览,而不影响帧字节:

代码语言:javascript
复制
This does not affect the order of byte array passed in      
onPreviewFrame(byte[], Camera), JPEG pictures, or recorded videos.

在查看了各种帖子之后,我发现有一个声明使用libyuv中的ConvertToI420。

现在,我已经编译了libyuv并能够调用libyuv::ConvertToI420 420方法,但是我得到的结果I420在颜色、显示线条和所有.然而,我得到的尺寸现在是144*176,可以检查图像这里

我使用过的代码片段如下所示。

代码语言:javascript
复制
    //sourceWidth = 176 and sourceHeight = 144  
    unsigned char I420M = new unsigned char[(int)(sourceWidth*sourceHeight*1.5)];

    unsigned int YSize = sourceWidth * sourceHeight;
    // yuvPtr is the NV21 data passed from onPreviewCallback (from JAVA layer)
    const uint8* src_frame = const_cast<const uint8*>(yuvPtr);
    size_t src_size = YSize;

    uint8* pDstY = I420M;
    uint8* pDstU = I420M + YSize;
    uint8* pDstV = I420M + (YSize/4);

    libyuv::RotationMode mode;
    if(landscapeLeft){
        mode = libyuv::kRotate90;
    }else{
        mode = libyuv::kRotate270;
    }


    uint32 format = libyuv::FOURCC_NV21;
    int retVal = libyuv::ConvertToI420(src_frame, src_size,
              pDstY, sourceHeight,
              pDstU, (sourceHeight/2),
              pDstV, (sourceHeight/2),
              0, 0,
              sourceWidth, sourceHeight,
              sourceWidth, sourceHeight,
              mode,
              format);

我不希望裁剪图像,只需旋转它90 (顺时针/逆时针方向)附加的图像是为kRotate90。

有人能帮我指出哪里出了问题吗?我强烈怀疑它是否能用传递给ConvertToI420方法的参数来做些什么。

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-21 08:28:06

我已经弄清楚出了什么问题。上面的代码片段工作得很好,I420M包含有144*176维旋转的YUV。

问题在于我在将I420M传递回jbyte[]层时将其转换为jbyte[]的方式。

票数 0
EN

Stack Overflow用户

发布于 2016-12-13 03:41:59

使用sourceWidth而不是sourceHeight int retVal = libyuv::ConvertToI420(src_frame, src_size, pDstY, sourceWidth, pDstU, (sourceWidth/2), pDstV, (sourceWidth/2), 0, 0, sourceWidth, sourceHeight, sourceWidth, sourceHeight, mode, format);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30347134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档