乐趣区

关于android: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 格局的数据。

退出移动版