android比较字节数组,有效绘制字节数组流以在Android中显示的选项

简单来说,我需要做的就是在Android中显示视频帧的实时流(每帧都是YUV420格式).我有一个回调函数,我接收单个帧作为字节数组.看起来像这样的东西:

public void onFrameReceived(byte[] frame, int height, int width, int format) {

// display this frame to surfaceview/textureview.

}

一个可行但很慢的选择是将字节数组转换为Bitmap并在SurfaceView上绘制到画布.在将来,我希望能够改变这个框架的亮度,对比度等,因此我希望我可以使用OpenGL-ES.我有效地做到这一点的其他选择是什么?

请记住,与Camera或MediaPlayer类的实现不同,我无法使用camera.setPreviewTexture(surfaceTexture)将输出定向到surfaceview / textureview;因为我在C中使用Gstreamer接收单个帧.

解决方法:

我正在为我的项目使用ffmpeg,但渲染YUV帧的原理应该对你自己来说是一样的.

例如,如果一帧是756 x 576,则Y帧将是该大小. U和V框架是Y框架宽度和高度的一半,因此您必须确保考虑尺寸差异.

我不知道相机API,但我从DVB源获得的帧有一个宽度,每条线都有一个步幅.在帧中每行末尾添加像素.如果你的相同,那么在计算纹理坐标时就要考虑到这一点.

调整纹理坐标以考虑宽度和步幅(linesize):

float u = 1.0f / buffer->y_linesize * buffer->wid; // adjust texture coord for edge

我使用的顶点着色器采用0.0到1.0的屏幕坐标,但您可以更改这些以适应.它还采用纹理坐标和颜色输入.我使用了颜色输入,以便我可以添加淡入淡出等.

顶点着色器:

#ifdef GL_ES

precision mediump float;

const float c1 = 1.0;

const float c2 = 2.0;

#else

const float c1 = 1.0f;

const float c2 = 2.0f;

#endif

attribute vec4 a_vertex;

attribute vec2 a_texcoord;

attribute vec4 a_colorin;

varying vec2 v_texcoord;

varying vec4 v_colorout;

void main(void)

{

v_texcoord = a_texcoord;

v_colorout = a_colorin;

float x = a_vertex.x * c2 - c1;

float y = -(a_vertex.y * c2 - c1);

gl_Position = vec4(x, y, a_vertex.z, c1);

}

片段着色器采用三个均匀纹理,每个Y,U和V一个纹理,并转换为RGB.这也乘以从顶点着色器传入的颜色:

#ifdef GL_ES

precision mediump float;

#endif

uniform sampler2D u_texturey;

uniform sampler2D u_textureu;

uniform sampler2D u_texturev;

varying vec2 v_texcoord;

varying vec4 v_colorout;

void main(void)

{

float y = texture2D(u_texturey, v_texcoord).r;

float u = texture2D(u_textureu, v_texcoord).r - 0.5;

float v = texture2D(u_texturev, v_texcoord).r - 0.5;

vec4 rgb = vec4(y + 1.403 * v,

y - 0.344 * u - 0.714 * v,

y + 1.770 * u,

1.0);

gl_FragColor = rgb * v_colorout;

}

使用的顶点是:

float x, y, z; // coords

float s, t; // texture coords

uint8_t r, g, b, a; // colour and alpha

希望这可以帮助!

编辑:

对于NV12格式,你仍然可以使用片段着色器,虽然我自己没有尝试过.它将交错的UV作为亮度-α通道或类似物.

标签:android,surfaceview,opengl-es,textureview

来源: https://codeday.me/bug/20190627/1308575.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值