Android音视频开发:使用Camera API采集视频数据

Posted 学杰杰杰杰.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android音视频开发:使用Camera API采集视频数据相关的知识,希望对你有一定的参考价值。

本文主要讲的是:使用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格式的数据。

以上是关于Android音视频开发:使用Camera API采集视频数据的主要内容,如果未能解决你的问题,请参考以下文章

Android音视频开发:MediaRecorder录制视频

使用 Camera2(Android 版本 21)API 录制 60fps 视频

Android Camera2 API:捕获视频而不预览

Android Camera2 教程 · 第一章 · 概览

安卓camera2 API获取YUV420_888格式详解

Android音视频(六) 使用OpenGL ES 3.0预览Camera