java 读取yuv数据_如何在Android上快速显示yuv数据

[  写在前面:本文来自以下URL http://www.eoeandroid.com/viewthread.phptid=26&extra=page%3D2 推荐大家到这个论坛,和原文查看     在android 当中显示一张网

最近在搞Android方面的视频处理开发,解码出来的都是YUV420格式的数据,如何在surface上高效显示出来,颇费了一点周折,现在总结一下。

[需求:USB Headset插上去后,声音要从本地CODEC切换到USB Headset输出/输入。上网搜了有关USB Audio Hotplug的东西,比较适用的资源如下:1、Hotplugging USB audio devic

思路1:在java中将Surface指针传递到jni层,lock之后就可以获得SurfaceInfo,进而取得要显示的surface格式、高度、宽度,在2.2/2.3版本,surface的Format一般都是RGB565格式,只用做一个颜色空间的转换,scaler就可以将yuv数据显示出来。

颜色空间转换和Scaler算是比较耗时的操作了。如何提高效率,scaler最好能交给android的底层函数去做,如果有gpu的,底层函数直接会利用gpu,效率非常高,又不占用cpu资源。

思路2:

参考framework中的AwesomePlayer,里面利用AwesomeLocalRenderer/AwesomeRemoteRenderer来实现解码出来的数据显示,这个效率应该非常高,但是平台的关联性会增加很多。

调用接口比较简单,

首先创建一个render,

mVideoRenderer = new AwesomeRemoteRenderer(

mClient.interface()->createRenderer(

mISurface, component,

(OMX_COLOR_FORMATTYPE)format,

decodedWidth, decodedHeight,

mVideoWidth, mVideoHeight,

rotationDegrees));

直接调用render函数就可以显示了。

virtual void render(MediaBuffer *buffer) {

void *id;

if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {

mTarget->render((IOMX::buffer_id)id);

}

}

其它的参数都很容易获得,关键是buffer_id 怎么获得?OMXCodec.cpp中有相关的可以参考。

实际的效果在我的S510E上跑,效率非常高,几乎不占用主控cpu资源,很可能都交给dsp和gpu去搞了。

思路3:

参考 camera的方式。由于在第2步已经取得了非常好的效果,笔者没有做深入研究。[joshuastray2014-08-04 14:47:01328 次阅读在Cocos2d-js 3.0beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用java的静态方法。它的使用方法很简单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值