android 视频通话yuv rgb,Android视频渲染: YUV转RGB

Android SDK为Camera预览提供了一个Demo,这个Demo的大致流程是初始化一个Camera和一个SurfaceView,SurfaceView被 创建之后可以获取到一个SurfaceHolder的实例,将这个SurfaceHolder传递给Camera,这样Camera就会自动的将捕获到的 视频数据渲染到SurfaceView上面,这也就是Camera预览的效果。当然更多的时候我们需要获取到Camera的实时视频数据来自己进行预处理 并渲染,Camera也提供了这个接口,用法如下:

mCamera.setPreviewCallback(new PreviewCallback(){

@Override

public void onPreviewFrame(byte[] data, Camera camera)

{

});

在这个回调里我们就能够获取到当前帧的数据,我们可以对其进行预处理,比如压缩、加密、特效处理等,不过byte[]这个buffer里面的数据是 YUV格式的,一般是YUV420SP,而Android提供的SurfaceView、GLSurfaceView、TextureView等控件只支 持RGB格式的渲染,因此我们需要一个算法来解码。

先介绍一个YUV转RGB的算法,转换的公式一般如下,也是线性的关系:

R=Y+1.4075*(V-128)

G=Y-0.3455*(U-128) – 0.7169*(V-128)

B=Y+1.779*(U-128)

下面是一段将YUV转成ARGB_8888的jni代码,类似的代码网上很多,将这个代码简单修改一下也能直接用在C中。

jintArray Java_com_spore_jni_ImageUtilEngine_decodeYUV420SP(JNIEnv * env,

jobject thiz, jbyteArray buf, jint width, jint height)

{

jbyte * yuv420sp = (*env)->GetByteArrayElements(env, buf, 0);

int frameSize = width * height;

jint rgb[frameSize]; // 新图像像素值

int i = 0, j = 0,yp = 0;

int uvp = 0, u = 0, v = 0;

for (j = 0, yp = 0; j

你可能感兴趣的:(android,视频通话yuv,rgb)