Android通过OpenGl Es渲染NV21格式视频

Android通过OpenGl Es渲染NV21格式视频

第一次写博客(主要是写给自己的),请各位大神多多指教!!!

提取NV21格式视频中的YUV分量

  1. YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
  2. 对于Android Camera录制视频,大多数使用的是NV21(默认格式)和NV12格式的数据
  3. NV21格式数据的排列方式是YYYYYYYYYY(w*h)vuvuvuvuvu(w*h/2)。对于NV12的格式,排列方式是YYYYYYY(w*h)uvuvuvuvuvuv(w*h/2)。

根据上面说的NV21数据排列格式,其实提取YUV分量很简单(以下代码亲自测试过)

//NV21格式的宽和高,对于Camera就是所选择的分辨率
final int size = width * height;
final byte[] y = new byte[size];
//这里注意,uv统一占Y的1/2,那么各自占1/4
final byte[] u = new byte[size/4];
final byte[] v = new byte[size/4];
//提取Y分量
System.arraycopy(data, 0, y, 0, size);
//提取vu分量
for (int i = 0,k = 0; i < size/4; i++,k += 2) {
       v[i] = data[size + k];
       u[i] =data[size + k +1];
}

根据上面提取NV21格式的YUV分量,其实提取NV12或者其他的都很简单

//提取NV12格式的YUV分量
final int size = width * height;
final byte[] y = new byte[size];
final byte[] u = new byte[size/4];
final byte[] v = new byte[size/4];
System.arraycopy(data, 0, y, 0, size);
for (int i = 0,k = 0; i < size/4; i++,k += 2) {
    u[i] = data[size + k];
    v[i] =data[size + k +1];
}

OpenGL ES进行显示

我不懂OpenGl Es,这方面现在只是在学习,所以只能在网上复制代码,感谢博主大神提供的办法:Android上使用OpenGLES2.0显示YUV数据

在这里,我把自己的使用方式做一下说明,我主要用于Android Camera数据的渲染上。

  1. 在打开Camera 预览之前,我通过调用 mGlRenderer.update(width, height),设置宽高

    2、在Camera数据回调中,分离YUV分量并且调用mGlRenderer.update(yData, uData, vData);

我的改动

1、为了实现竖屏预览效果,我修改GlProgram中的coordVertices

java

// 横屏

private static float[] coordVertices = { 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }

//竖屏

private static float[] coordVertices = {1.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f,};

至于原理,请看http://www.lai18.com/content/1455210.html

2、我需要用到的是全屏预览形式,就算图像拉升了也没有关系,所以需要改动update(int w, int h)方法:

  if (mScreenWidth > 0 && mScreenHeight > 0) {
         prog.createBuffers(GLProgram.squareVertices);
   }
 if (w != mVideoWidth && h != mVideoHeight) {
     this.mVideoWidth = w;
     this.mVideoHeight = h;
     int yarraySize = w * h;
     int uvarraySize = yarraySize / 4;
     synchronized (this) {
     y = ByteBuffer.allocate(yarraySize);
     u = ByteBuffer.allocate(uvarraySize);
     v = ByteBuffer.allocate(uvarraySize);
    }
}

好了,经过以上的改动,我的程序就已经可以跑起来了!!

以后还要多写写博客。写的不好,请多多指教…..

时间: 2024-08-03 00:23:19

Android通过OpenGl Es渲染NV21格式视频的相关文章

【Qt for Android】OpenGL ES 绘制彩色立方体

Qt 内置对OpenGL ES的支持,选用Qt进行OpenGL ES的开发是非常方便的,许多辅助类都已经具备.从Qt 5.0开始增加了一个QWindow类,该类既可以使用OpenGL绘制3D图形,也可以使用QPainter绘制2D传统的GDI+图形,5.0以前的QGLWidget不推荐再使用.在即将到来(官方时间是今年秋天)Qt 5.4会完全废弃QGLWidget,作为替代将会新增QOpenGLWidget和QOpenGLWindow类来方便OpenGL的编程. 好了废话不多说了,今天我会使用O

基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之Shader准备(7)

Cocos2d-x底层图形绘制是使用OpenGL ES协议的.OpenGL ES是什么呢? OpenGL ES(OpenGl for Embedded System)是OpenGL三维图形API的子集,针对手机.Pad和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准.OpenGL ES是OpenGL三维图形API的子集,针对手机.Pad和游戏主机等嵌入式设备而设计.Cocos2d-x底层图形渲染使

基于Cocos2d-x学习OpenGL ES 2.0系列——OpenGL ES渲染之LayerColor(8)

在前面文章中讲述了Cocos2d-x引擎OpenGL渲染准备Shader方面,本文主要讲解使用LayerColor来讲述OpenGL的渲染过程. 1.LayerColor对象创建 添加LayerColor元素到游戏中: autolayerColor = LayerColor::create(Color4B(255, 0, 0, 255), 100, 100); layerColor->setPosition(100,100); 下面是LayerColor::create方法: LayerColo

在iOS上使用OpenGL ES渲染YUV

1)创建OpenGL context [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 2)layer设置成不透明 _eaglLayer = (CAEAGLLayer*) self.layer; _eaglLayer.opaque = YES; 3)创建YUV texture glGenTextures(1, &m_nTexturePlanarY); glGenTextures(1, &m_nTexturePlana

OpenGL ES 渲染立体图形

一.理解 顶点数据存储在申请的缓冲区中,其由数据总线传递给着色器(如果是片元着色器,还须将顶点转换成片元),再由着色器最终渲染到涂层上: 二.思路 1.设置涂层: 2.创建上下文: 3.清空缓存区: 4.创建渲染缓存区和帧缓存区: 5.开始绘制: 三.核心代码 //最终渲染 - (void)renderLayer { //设置窗口背景颜色 glClearColor(0.0, 0.0, 0.0, 1.0); //清空颜色缓存 glClear(GL_COLOR_BUFFER_BIT); //设置视口

在Android中使用OpenGL ES进行开发第(一)节:概念先行

一.前期基础是知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGL ES绘制2D/3D图形的第一步:定义图形:——运用部分 ③使用OpenGL ES绘制出②步骤中定义好的图形:——运用部分,难点所在 通过这三篇文章的分析,就像给万丈高楼垫定了基石,万丈高楼平地起,后面利用OpenGLES做各种效果,各种变换都是建立在这三步的图形编程理解之上的. 话不多说正文开始 (1)什么

OpenGL ES for Android 环境搭建

在Android上运行OpenGL ES程序需要用到GLSurfaceView控件,GLSurfaceView继承自SurfaceView并实现了GLThread,通过OpenGL ES进行绘制. OpenGL ES1.0是基于OpenGL 1.3的,OpenGL ES1.1是基于OpenGL 1.5的.Android1.0和更高的版本支持这个API规范.OpenGL ES 1.x是针对固定硬件管线的. OpenGL ES2.0是基于OpenGL 2.0的,不兼容OpenGL ES 1.x.An

[android] OpenGL与OpenGL ES简介

简介 OpenGL OpenGL的全称是Open Graphics Library,即开放的图形库接口,它定义了一个跨编程语言,跨平台的编程接口的规范,它主要用于3D图形(2D也可以)编程.OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL.IRIS RL是一个工业标准的3D图形软件接口,功能虽然强大,但是移植性不好,于是SGI公司在IRIS GL的基础上开发了OpenGL. OpenGL体系简单,而且具有跨平台特性,它不像Direct3D,是Microsoft开发的windows

Android API Guides---OpenGL ES

OpenGL ES Android包含高性能2D和3D图形开放图形库(OpenGL?的).详细而言,OpenGL ES的API支持. OpenGL是一个跨平台的图形API.用于指定的3D图形处理硬件标准的软件接口. ES是用于嵌入式设备的OpenGL规范的味道??. Android支持OpenGL ES的API的几个版本号: 的OpenGL ES 1.0和1.1 - 本API规范是由Android 1.0及更高版本号支持. OpenGL ES 2.0的 - 这个API规范由Android 2.2