本文次要讲的是:应用Camera API采集视频数据并保留到文件,别离应用SurfaceView、TextureView来预览Camera数据,取到NV21的数据回调。
须要增加权限:
<uses-permission android:name="android.permission.CAMERA"/>
一. 预览Camera数据
1.1 应用SurfaceView预览
SurfaceView surfaceView;Camera camera;@Overrideprotected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = (SurfaceView)findViewById(R.id.surface_view); surfaceView.getHolder().addCallback(this); //关上摄像头并将展现方向旋转90度 camera = Camera.open(); camera.setDisplayOrientation(90);}//------------ Surface 预览 ----------@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder){ try{ camera.setPreviewDisplay(surfaceHolder); camera.startPreview(); }catch(IOException e){ e.printStackTrace(); }}@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder,int format,int w,int h){}@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder){ camera.release();}
1.2 应用TextureView预览
TextureView textureView;Camera camera;@Overrideprotected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = (TextureView) findViewById(R.id.texture_view); textureView.setSurfaceTextureListener(this); //关上摄像头并将展现方向旋转90度 camera = Camera.open(); camera.setDisplayOrientation(90);}//------------ Texture 预览 ----------@Overridepublic void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture,int i,int i1){ try{ camera.setPreviewTexture(surfaceTexture); camera.startPreview(); }catch(IOException e){ e.printStackTrace(); }}@Overridepublic void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {} @Overridepublic boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { camera.release(); return false;} @Overridepublic void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
二. 取回NV21的数据回调
Android中Google反对的Camera Preview Callback的YUV罕用格局有两种:一个是NV21,一个是YV12。Android个别默认应用YCbCr_420_SP的格局(NV21)。
咱们能够配置数据回调的格局:
Camera.Parameters parameters = camera.getParameters();parameters.setPreviewFormat(ImageFormat.NV21);camera.setParameters(parameters);
通过setPreviewCallback办法监听预览的回调:
camera.setPreviewCallback(new Camera.PreviewCallback(){ @Override public void onPreviewFrame(byte[] bytes,Camera camera){ }});
这外面的Bytes的数据就是NV21格局的数据。