由於Android下網路攝影機預覽資料只能 ImageFormat.NV21 格式的,所以解碼時要經過一翻周折.
Camera mCamera = Camera.open();Camera.Parameters p = mCamera.getParameters();p.setPreviewFormat(ImageFormat.NV21);/*這是唯一值,也可以不設定。有些同學可能設定成 PixelFormat 下面的一個值,其實是不對的,具體的可以看官方文檔*/
mCamera.setParameters(p);
mCamera.startPreview();
下面是解碼核心部分:
@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {Size size = camera.getParameters().getPreviewSize();try{YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);if(image!=null){ByteArrayOutputStream stream = new ByteArrayOutputStream();image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size()); stream.close();}}catch(Exception ex){Log.e("Sys","Error:"+ex.getMessage());}}
代碼很簡單。就是把YUV資料轉成 Bitmap 就行了,系統提供 YuvImage 類。