读书人

Android摄像视频流的格式转换(YUV -

发布时间: 2012-08-22 09:50:35 作者: rapoo

Android拍摄视频流的格式转换(YUV --- RGB)
Android允许用户实时捕获摄像头的视频流,这在利用摄像头的AR应用中非常有用。可以利用摄像流实时做画面图像的分析,并做出许多有用的应用。比如人脸识别,条码识别,特定图像替换等等,不过大多数图像处理软件在处理时是需要RGB格式的图像,而默认的视频流是压缩的YUV格式,Android下是YUV420SP,这个格式,虽然可以在程序中修改,但是修改后好像不起作用,也就是说只能得到编码为YUV420SP的视频流,这就需要把YUV420SP的视频流转换成RGB格式的图像,用于图像识别。特贴一个格式转换函数,方便大家使用。



我这里一直用的,在多款android手机上测试都是好的,包括最新的Nexus s,只是在模拟器上有一些阴影一样的颜色,不知道你们的程序是否有其他问题

我这里一直用的,在多款android手机上测试都是好的,包括最新的Nexus s,只是在模拟器上有一些阴影一样的颜色,不知道你们的程序是否有其他问题

我调了一下 感觉是
byte[] rgbBuf, byte[] yuv420sp, int width, int height
这几个参数的比例 应该有某种问题

不知道 楼主 是怎么设置的 以及 android端setPreviewSize的大小
我这里一直用的,在多款android手机上测试都是好的,包括最新的Nexus s,只是在模拟器上有一些阴影一样的颜色,不知道你们的程序是否有其他问题

我调了一下 感觉是
byte[] rgbBuf, byte[] yuv420sp, int width, int height
这几个参数的比例 应该有某种问题

不知道 楼主 是怎么设置的 以及 android端setPreviewSize的大小
我的程序中是这样设置这些参数的
    public synchronized void onPreviewFrame(byte[] data, Camera camera) {    if (data == null) {    return;    }    if (isStopPreview) {    return;    }    if (mRenderer == null) {    return;    }    //关闭摄像头预览回调    camera.setPreviewCallback(null);        if (bitmapData == null) {    previewWidth = camera.getParameters().getPreviewSize().width;        previewHeight = camera.getParameters().getPreviewSize().height;        bitmapData = new int[previewWidth * previewHeight];        rgbBuffer = new byte[previewWidth * previewHeight * 3];    }    decodeYUV420SP(bitmapData, rgbBuffer, data, previewWidth, previewHeight);if (mARHelp != null) {//调用artoolkit识别mARHelp.findMarker(rgbBuffer, mRenderer);}//取得摄像头画面Bitmap image = Bitmap.createBitmap(bitmapData, previewWidth, previewHeight, Bitmap.Config.ARGB_8888);mRenderer.setBackgroundImage(image);//刷新openGL显示requestRender();//打开摄像头预览回调camera.setPreviewCallback(this);    }


楼主,能你发的“decodeYUV420SP”少了个参数,能否帖个这断代码里用的“decodeYUV420SP”方法不???
13 楼 windloverain 2011-06-17 very good.
学习下。 14 楼 Jefry 2012-02-03 大侠,ARGB_8888占4个字节啊,怎么乘以3呢 15 楼 土块的魅力 2012-02-17 我的在pc机端是花屏,如果解决的话请指点,qq:776704371,谢谢了! 16 楼 cwh643 2012-03-27 Jefry 写道大侠,ARGB_8888占4个字节啊,怎么乘以3呢
这个函数是转成RGB的,如果要ARGB,请按照下面提示自行修改
out[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);

读书人网 >Android

热点推荐