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格式的数据.
在以下文章中,将对这些数据进行处理以满足相关的需求情况.