Android音频和视频开发(四): 使用Camera API采集视频数据

优采云 发布时间: 2020-08-06 23:03

  本文将主要使用Camera API采集视频数据并将其保存到文件中,使用SurfaceView和TextureView分别预览Camera数据,并获取NV21的数据回调.

  注意: 需要许可:

  1. 预览相机数据

  已经完成Android开发的人们通常知道有两种方法可以做到这一点: SurfaceView和TextureView.

  以下是使用SurfaceView预览数据的方法:

  SurfaceView surfaceView;<br />Camera camera;<br /><br />@Override<br />protected void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.activity_main);<br /><br /> surfaceView = (SurfaceView) findViewById(R.id.surface_view);<br /> surfaceView.getHolder().addCallback(this);<br /><br /> // 打开*敏*感*词*并将展示方向旋转90度<br /> camera = Camera.open();<br /> camera.setDisplayOrientation(90);<br /><br />}<br /><br />//------ Surface 预览 -------<br />@Override<br />public void surfaceCreated(SurfaceHolder surfaceHolder) {<br /> try {<br /> camera.setPreviewDisplay(surfaceHolder);<br /> camera.startPreview();<br /> } catch (IOException e) {<br /> e.printStackTrace();<br /> }<br />}<br /><br /><br />@Override<br />public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int w, int h) {<br /><br />}<br /><br />@Override<br />public void surfaceDestroyed(SurfaceHolder surfaceHolder) {<br /> camera.release();<br />}

  以下是使用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);

}<br />  //------ 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的数据回调

  Google在Android中支持“相机预览回调”的两种常见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() {<br /> @Override<br /> public void onPreviewFrame(byte[] bytes, Camera camera) {<br /><br /> }<br />});

  此处的字节数据是NV21格式的数据.

  在以下文章中,将对这些数据进行处理以满足相关的需求情况.

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线