本文次要讲的是:应用 Camera API 采集视频数据并保留到文件,别离应用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调。
须要增加权限:
<uses-permission android:name="android.permission.CAMERA"/>
一. 预览 Camera 数据
1.1 应用 SurfaceView 预览
SurfaceView surfaceView;
Camera camera;
@Override
protected 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 预览 ----------
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder){
try{camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();}catch(IOException e){e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder,int format,int w,int h){
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder){camera.release();
}
1.2 应用 TextureView 预览
TextureView textureView;
Camera camera;
@Override
protected 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 预览 ----------
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture,int i,int i1){
try{camera.setPreviewTexture(surfaceTexture);
camera.startPreview();}catch(IOException e){e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {camera.release();
return false;
}
@Override
public 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 格局的数据。