YUV格式转换中的stride

stride.gif

前言

ios调用系统框架采集出的视频YUV格式为NV12.
为满足不同业务需求,我们需要把nv12转换为i420或者rgba等格式.
libYUV库和ffmpeg都可以帮助我们轻松搞定.(推荐libyuv库,性能比ffmpeg高出很多).

libyuv

libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速.

使用libyuv

libyuv下载和编译网上教程较多,可去官网下载
我们来看一下NV12转换为i420的接口

// Convert NV12 to I420.
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);

src_ 为我们需要转换的NV12格式数据,dst_ 为转换后的i420数据
那么stride代表啥???

跨距-stride

我们都知道现在计算机的cpu都是32位或者64位的cpu,他们一次最少读取4、8个字节,如果少于这些,反而要做一些额外的工作,会花更长的时间。所有会有一个概念叫做内存对齐,将结构体的长度设为4、8的倍数。

跨距也是因为同样的理由出现的。因为图像的操作通常按行操作的,如果图像的所有数据都紧密排列,那么会发生非常多次的读取非对齐内存。会影响效率。而图像的处理本就是一个分秒必争的操作,所以为了性能的提高就引入了跨距这个概念。
跨距就是指图像中的一行图像数据所占的存储空间的长度,它是一个大于等于图像宽度的内存对齐的长度。这样每次以行为基准读取数据的时候就能内存对齐,虽然可能会有一点内存浪费,但是在内存充裕的今天已经无所谓了。

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        //表示开始操作数据
        CVPixelBufferLockBaseAddress(pixelBuffer, 0);
        //图像宽度(像素)
        size_t pixelWidth = CVPixelBufferGetWidth(pixelBuffer);
        //图像高度(像素)
        size_t pixelHeight = CVPixelBufferGetHeight(pixelBuffer);
        //获取CVImageBufferRef中的y数据
        uint8_t *y_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);
        //获取CMVImageBufferRef中的uv数据
        uint8_t *uv_frame = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1);
        //y stride
        size_t plane1_stride = CVPixelBufferGetBytesPerRowOfPlane (pixelBuffer, 0);
        //uv stride
        size_t plane2_stride = CVPixelBufferGetBytesPerRowOfPlane (pixelBuffer, 1);
       //y_size
        size_t plane1_size = plane1_stride * CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
        //uv_size
        size_t plane2_size = CVPixelBufferGetBytesPerRowOfPlane (pixelBuffer, 1) * CVPixelBufferGetHeightOfPlane(pixelBuffer, 1);
        //yuv_size
        size_t frame_size = plane1_size + plane2_size;
        
        
        uint8* buffer = malloc(frame_size);
        uint8* dst_u = buffer + plane1_size;
        uint8* dst_v = dst_u + plane1_size/4;
        
        // Let libyuv convert
       NV12ToI420(/*const uint8* src_y=*/y_frame, /*int src_stride_y=*/plane1_stride,
                           /*const uint8* src_uv=*/uv_frame, /*int src_stride_uv=*/plane2_stride,
                           /*uint8* dst_y=*/buffer, /*int dst_stride_y=*/plane1_stride,
                           /*uint8* dst_u=*/dst_u, /*int dst_stride_u=*/plane2_stride/2,
                           /*uint8* dst_v=*/dst_v, /*int dst_stride_v=*/plane2_stride/2,
                           pixelWidth, pixelHeight);
        CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
       free(buffer);
        

以上为NV12转化为i420的所有代码.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 年初偷偷策划了场“三十岁的成人礼”,转眼间,三十一便来了。人们常用“秋”来代表年轮,代表经历,寓意着成长与收获。也...
    穆恰阅读 601评论 0 3
  • 冠心病,吃银杏。 吃鲜橙,防卒中。 吃西柚,防血稠。 吃洋葱,脑路通。 吃大蒜,降血脂。 蘑菇餐,防血栓。 吃鲜姜...
    紫可阅读 1,243评论 0 1
  • 随着老书记病退,原来撂挑子不干的村长又掌握了山后村的大权。说是不会秋后算账的村长大人,又显示出来了“雷厉风行”的作...
    南良大维阅读 357评论 1 10
  • 台湾花莲发生地震 腾讯娱乐讯 2月6日23时50分,台湾花莲县附近海域发生6.5级地震。当晚,众星发声为台湾祈福。...
    汇聚天下儒将阅读 310评论 0 0
  • 人生总有不如意,关键在于熬。 熬得住,出众,熬不过,出局! 熬,不是逆来顺受的活着;熬,不是对命运的妥协。熬,是能...
    厚道不吃亏阅读 361评论 0 0