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