Android音视频任务列表之(三)——使用 Camera API 进行视频的采集,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调

一.主要使用的方法

Camera

1.Camera.open(int cameraId)

创建新的摄影机对象,使用完需要释放release(),否则其它应用无法使用。

2.setPreviewFormat(int pixel_format)

设置onPreviewFrame方法中数据回调的类型( nv21,YV12)
Camera.getParameters().

3.setPreviewCallbackWithBuffer

与addCallbackBuffer(byte[] callbackBuffer) 搭配使用实现内存复用

1.startPreview()

开始预览

SurfaceView

1.surfaceCreated:SurfaceView创建完成回调
2.onPreviewFrame(byte[] data, Camera camera)

data:摄像头数据回调

3.surfaceDestroyed:SurfaceView销毁回调

TextureView

setPreviewCallback(PreviewCallback cb)

设置预览回调

setPreviewTexture(SurfaceTexture surfaceTexture)

预览图像设置到surfaceTexture纹理
在startPreview之前调用

开始预览

二.实现过程

1.申请相机权限

2.SurfaceView实现

1)继承SurfaceView,实现surfaceCreated,surfaceDestroyed,onPreviewFrame等方法

public class RYSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback{
    private String TAG="RYSurfaceView";
    private Camera.Size size;
    private Camera mCamera;
    byte[] buffer;
    public RYSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        getHolder().addCallback(this);
    }

    @Override
    public void surfaceCreated(@NonNull SurfaceHolder holder) {
        startPreview();
    }

    private void startPreview() {
        mCamera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
        Camera.Parameters parameters = mCamera.getParameters();
        size=parameters.getPreviewSize();
        try {
            mCamera.setPreviewDisplay(getHolder());
            mCamera.setDisplayOrientation(90);
            //设置回调格式为nv21
            parameters.setPreviewFormat(ImageFormat.NV21);
            mCamera.setParameters(parameters);
            buffer=new byte[size.width*size.height*3/2];
            mCamera.addCallbackBuffer(buffer);
            mCamera.setPreviewCallbackWithBuffer(this);
            mCamera.startPreview();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
        if(mCamera != null){
            mCamera.stopPreview();
            mCamera.release();
            mCamera= null;
        }
    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        if(mCamera!=null)
        mCamera.addCallbackBuffer(data);//复用内存提供效率
        //注意,先addCallbackBuffer,然后再处理帧数据,否则会降低帧率。
        //  parameters.setPreviewFormat(ImageFormat.NV21);设置后 data为nv21
        Log.i(TAG,data.toString());
    }
}

2)在布局文件中使用自定义SurfaceView

 <com.ry.question3.RYSurfaceView
        android:id="@+id/ryview"
        android:layout_width="match_parent"
        android:layout_height="500dp" />

2.TextureView实现

1)代码实现

public class TextureViewActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, Camera.PreviewCallback {

    TextureView textureView;
    Camera mCamera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_texture_view);
       TextureView textureView= findViewById(R.id.textureView);
        textureView.setSurfaceTextureListener(this);
        // 打开摄像头
        mCamera = Camera.open();
        mCamera.setDisplayOrientation(90);
        Camera.Parameters parameters = mCamera.getParameters();
        //设置回调格式为nv21
        parameters.setPreviewFormat(ImageFormat.NV21);
        mCamera.setParameters(parameters);
        mCamera.setPreviewCallback(this);
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        try {
            mCamera.setPreviewTexture(surface);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { }
    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

        mCamera.release();
        return false;
    }
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
    //数据回调
    }
}

2)布局文件

 <TextureView
        android:id="@+id/textureView"
        android:layout_width="match_parent"
        android:layout_height="500dp"/>

三.结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值