首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ios中的libyuv库将kCVPixelFormatType_420YpCbCr8BiPlanarFullRange Buffer转换为YUV420?

如何使用ios中的libyuv库将kCVPixelFormatType_420YpCbCr8BiPlanarFullRange Buffer转换为YUV420?
EN

Stack Overflow用户
提问于 2013-02-08 12:50:01
回答 4查看 3.4K关注 0票数 1

我已经用kCVPixelFormatType_420YpCbCr8BiPlanarFullRange格式捕获了视频,设置了(视频设置),并以outputsamplebuffer AVFoundation .i格式输出。但我需要YUV420格式的进一步处理。

为此,我使用libyuv框架。

代码语言:javascript
复制
LIBYUV_API
int NV12ToI420(const uint8* src_y, int src_stride_y,
           const uint8* src_uv, int src_stride_uv,
           uint8* dst_y, int dst_stride_y,
           uint8* dst_u, int dst_stride_u,
           uint8* dst_v, int dst_stride_v,
           int width, int height);

 libyuv::NV12ToI420(src_yplane, inWidth ,
                   src_uvplane, inWidth,
                   dst_yplane, inWidth,
                   dst_vplane, inWidth / 2,
                   dst_uplane, inWidth / 2,
                   inWidth,  inHeight);

但是我得到的输出缓冲区是完全绿色的吗?我在这个过程中做错了什么吗?请帮帮我?

EN

回答 4

Stack Overflow用户

发布于 2013-02-26 11:42:13

看起来是对的。确保您的src_uvplane指向src_yplane + inWidth * inHeight

票数 0
EN

Stack Overflow用户

发布于 2013-04-07 14:18:01

你需要将你的数据转换成I420,我也在处理相机,但在安卓上。我认为在iOS上应该是类似的。安卓raw摄像头是NV21或者NV16格式,我把NV21或者NV16转换成YV12,I420跟YV12差不多:

代码语言:javascript
复制
BYTE m_y[BIG_VIDEO_CX * BIG_VIDEO_CY], 
     m_u[(BIG_VIDEO_CX/2) * (BIG_VIDEO_CY/2)],
     m_v[(BIG_VIDEO_CX/2) * (BIG_VIDEO_CY/2)];

    void NV21_TO_YV12(BYTE *data)
{
    int width = BIG_VIDEO_CX;
    int height = BIG_VIDEO_CY;
        m_y2=data;
    data=&data[width*height];
    for (uint32_t i=0; i<(width/2)*(height/2); ++i)
    {
        m_v[i]=*data;
        m_u[i]=*(data+1);
        data+=2;
    }
}
void NV16_TO_YV12(BYTE *data)
{
    int width = BIG_VIDEO_CX;
    int height = BIG_VIDEO_CY;
    m_y2=data;
    const BYTE* src_uv = (const BYTE*)&data[width*height];
    BYTE* dst_u = m_u;
    BYTE* dst_v = m_v;
    for (uint32_t y=0; y<height/2; ++y)
    {
        const BYTE* src_uv2 = src_uv + width;
        for (uint32_t x=0; x<width/2; ++x)
        {
            dst_u[x]=(src_uv[0]+src_uv2[0]+1)>>1;
            dst_v[x]=(src_uv[1]+src_uv2[1]+1)>>1;
            src_uv+=2;
            src_uv2+=2;
        }
        src_uv=src_uv2;
        dst_u+=width/2;
        dst_v+=width/2;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-05-30 14:14:04

Android是NV21,libyuv支持Arm和英特尔。如果需要定向,它还可以作为转换的一部分旋转90、180或270。Arm优化版本比C++快2倍左右

C

NV12ToI420_Opt (782毫秒)

NV21ToI420_Opt (764毫秒)

Arm (霓虹灯优化)

NV12ToI420_Opt (398毫秒)

NV21ToI420_Opt (381ms)

奇怪的是,你在安卓系统上使用NV16。我期望与NV21保持一致的NV61。您的代码看起来是正确的,但是可以使用vrhadd.u8将其优化为霓虹灯。如果你想看的话,提交一个libyuv问题。https://code.google.com/p/libyuv/issues/list

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

https://stackoverflow.com/questions/14765892

复制
相关文章

相似问题

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