zoukankan      html  css  js  c++  java
  • Android 音视频开发(四):使用 Camera API 采集视频数据

    使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调。

    注: 需要权限:<uses-permission android:name="android.permission.CAMERA" />

    一、预览 Camera 数据

    做过Android开发的人一般都知道,有两种方法能够做到这一点:SurfaceView、TextureView。

    下面是使用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();
    }

    下面是使用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格式的数据。

    在后面的文章中,会对这些数据进行处理,来满足相关的需求场景。

    --------------------- 本文来自 caoliu1024cl 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/caoliu1024cl/article/details/77853422?utm_source=copy 

  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/Jackie-zhang/p/9700650.html
Copyright © 2011-2022 走看看