本文次要讲的是:应用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格局的数据。