设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 89938|回复: 0

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

[复制链接]

90

主题

865

回帖

1576

积分

金牌会员

Rank: 6Rank: 6

积分
1576
发表于 2022-3-26 10:35:39 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView、TextureView 来预览 Camera 数据,取到 NV21 的数据回调。
注: 需要权限:
一、预览 Camera 数据

做过Android开发的人一般都知道,有两种方法能够做到这一点:SurfaceView、TextureView。
下面是使用SurfaceView预览数据的方式:
  
  1. SurfaceView surfaceView;
  2. Camera camera;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5.     super.onCreate(savedInstanceState);
  6.     setContentView(R.layout.activity_main);
  7.     surfaceView = (SurfaceView) findViewById(R.id.surface_view);
  8.     surfaceView.getHolder().addCallback(this);
  9.     // 打开摄像头并将展示方向旋转90度
  10.     camera = Camera.open();
  11.     camera.setDisplayOrientation(90);
  12. }
  13. //------ Surface 预览 -------
  14. @Override
  15. public void surfaceCreated(SurfaceHolder surfaceHolder) {
  16.     try {
  17.         camera.setPreviewDisplay(surfaceHolder);
  18.         camera.startPreview();
  19.     } catch (IOException e) {
  20.         e.printStackTrace();
  21.     }
  22. }
  23. @Override
  24. public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int w, int h) {
  25. }
  26. @Override
  27. public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
  28.     camera.release();
  29. }
复制代码
下面是使用TextureView预览数据的方式:
  
  1.     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);    }
  2.   //------ 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)。
我们可以配置数据回调的格式:
  
  1. Camera.Parameters parameters = camera.getParameters();parameters.setPreviewFormat(ImageFormat.NV21);camera.setParameters(parameters);
复制代码
通过setPreviewCallback方法监听预览的回调:
  
  1. camera.setPreviewCallback(new Camera.PreviewCallback() {
  2.     @Override
  3.     public void onPreviewFrame(byte[] bytes, Camera camera) {
  4.     }
  5. });
复制代码
这里面的Bytes的数据就是NV21格式的数据。
在后面的文章中,会对这些数据进行处理,来满足相关的需求场景。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表