NV12和YUV420的转换是在相同采样空间的转换,只是个别分量位置的调整,只要明白了Y、U、V分量的布置,就很容易写出来。

代码如下:

/**
yyyy yyyy
uv    uv
->
yyyy yyyy
uu
vv
*/
void yuv420sp_to_yuv420p(unsigned char* yuv420sp, unsigned char* yuv420p, int width, int height)
{int i, j;int y_size = width * height;unsigned char* y = yuv420sp;unsigned char* uv = yuv420sp + y_size;unsigned char* y_tmp = yuv420p;unsigned char* u_tmp = yuv420p + y_size;unsigned char* v_tmp = yuv420p + y_size * 5 / 4;// ymemcpy(y_tmp, y, y_size);// ufor (j = 0, i = 0; j < y_size/2; j+=2, i++){u_tmp[i] = uv[j];v_tmp[i] = uv[j+1];}
}/**
yyyy yyyy
uu
vv
->
yyyy yyyy
uv    uv
*/
void yuv420p_to_yuv420sp(unsigned char* yuv420p, unsigned char* yuv420sp, int width, int height)
{int i, j;int y_size = width * height;unsigned char* y = yuv420p;unsigned char* u = yuv420p + y_size;unsigned char* v = yuv420p + y_size * 5 / 4;unsigned char* y_tmp = yuv420sp;unsigned char* uv_tmp = yuv420sp + y_size;// ymemcpy(y_tmp, y, y_size);// ufor (j = 0, i = 0; j < y_size/2; j+=2, i++){// 此处可调整U、V的位置,变成NV12或NV21
#if 01uv_tmp[j] = u[i];uv_tmp[j+1] = v[i];
#elseuv_tmp[j] = v[i];uv_tmp[j+1] = u[i];
#endif}
}

后记:

一口气把自己研究很久的东西写出来,好像都没写到点子上。以前也尝试过写技术性很强的文章,到处找资料,找出处,但后来发觉自己不是那块料,于是就直接贴代码,理论的东西反而不说——因为说不清,也怕说错。

关于YUV,初步听说是在6、7年前的大学,开始接触是在4、5年前,而真正了解其原理,却是近些年。学习进度不可谓不慢。写出来,也算有个交待。也为自己准备实现的YUV播放器做些准备。

迟 2015.8.5 晚上



YUV格式学习:NV12和YUV420P格式互换相关推荐

  1. 【Android】直播必备之YUV使用总结 —— 常用的几种格式:NV21/NV12/YV12/YUV420P的区别

    转载自 gitzzp 的博客 [Android]直播必备之YUV使用总结 -- 常用的几种格式:NV21/NV12/YV12/YUV420P的区别 转自:http://www.cnblogs.com/ ...

  2. 学习记录:RGBA格式数据加边框

    项目场景: 最近学习使用ffmpeg在做一个视频缩略图的例子.在这里做一个记录. 在网上找了很多资料,加边框都是更改图片外围数据,这样图片会缺失一部分,不太符合我的需求. 按照这个思路,下面是一种实现 ...

  3. ffmpeg4.4项目学习--音视频基本格式

    目录 一.引言 二.音视频基本格式学习 ------> 2.1.图像压缩数据格式 ------> 2.2.PCM ------> 2.3.H264 ------> 2.4.AA ...

  4. FFMPEG 将YUV420P格式数据编码成H.264

    FFMPEG学习 将YUV420P格式数据编码成H.264 前言 一.编码流程 二.代码实现 三.实现效果 四.总结 前言 在学习FFMPEG过程中,我们需要获取到H264码流,但是我们采集到的一般都 ...

  5. android nv21 nv12,視頻存儲格式YUV420 NV12 NV21 i420 YV12

    1)YUV簡介 YUV格式有兩大類:planar和packed. 對於planar的YUV格式,先連續存儲所有像素點的Y,緊接着存儲所有像素點的U,隨后是所有像素點的V. 對於packed的YUV格式 ...

  6. YUV的plannar,packet及semi-planar格式及RGB

    plannar模式:三维分开存储 在AVFrame::data[]中存储如下: data[0]---Y分量, Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8-, Y16, - data[ ...

  7. FFmpeg学习4:音频格式转换

    前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...

  8. AVI音视频封装格式学习(三)——AVI 数据结构解析

    这里介绍AVI会使用到的数据结构,为了避免翻译引入歧义,决定该部分还是使用英文原文,如后续有时间再进行翻译. AVIMAINHEADER structure The AVIMAINHEADER str ...

  9. FFmpeg视频解码中的YUV420P格式

    参考文章 在做基于FFmpeg解码的视频播放时,需要涉及到帧数据存储的YUV与RGB格式,所以了解了一下,参考下述博文. https://blog.csdn.net/lanxiaziyi/articl ...

最新文章

  1. 如何在 Linux 中创建一个共享目录
  2. java中的枚举类_java中的枚举类型
  3. concurrent(四)Condition
  4. Introduction-to-React-JS -- 2 Helloworld
  5. 新年中国节必备背景素材|传统纹样,这便是中国之美!
  6. python 生成excel_python 数据生成excel导出(xlwt,wlsxwrite)代码实例
  7. [20] 鼓状物(Drum)图形的生成算法
  8. 《别输在不会表达上》— 综合素质提升书籍
  9. axure文件如何加密_Axure教程:密码可见与不可见的切换设置
  10. C、C++编程学习资料收藏
  11. 用HTML和CSS制作一个带图片的旋转立方体
  12. Linux和windows导入scv数据文件
  13. SQLSERVER Agent服务无法启动
  14. unpack python_python数据处理之 ddt,@data, @unpack
  15. Reflector、ReflectorFactory的前世
  16. CentOS下删除和安装JDK
  17. 傅里叶变换(真正的通俗易懂)
  18. Specular/Glossiness传统材质简单转换金属度流程材质metallic/roughness小记
  19. 一文了解什么是财务RPA机器人
  20. Vmware虚拟机无法识别系统移动硬盘或者虚拟机右下角没有USB图标

热门文章

  1. 苹果下周将推出紫色版iPhone 13 但只有高端版本
  2. 被美列入投资黑名单后 商汤重启公开招股发行规模定价没变
  3. 太畅销了!AirTag送货时间延长至4-5周
  4. 杨笠代言电脑遭投诉抵制,网友吵翻!英特尔回应了...
  5. Redmi K40系统截图曝光:配备顶级2K屏幕+骁龙870移动平台
  6. 1月25日再次开抢!三星Galaxy S21系列标准版已多次开售即罄
  7. 豪宅周边5家盒马却不配送?盒马回应...
  8. iPhone 12 Pro最新概念图:五摄相机模组也带下巴
  9. 教育部官宣延期开学 这些教培机构在线捐课捐资
  10. 高通孟樸:5G+AI将会是移动互联网主流趋势