前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开发一款相机APP 第十五篇: YUV流处理

从零开发一款相机APP 第十五篇: YUV流处理

作者头像
小驰随想录
发布2022-12-20 19:20:36
2840
发布2022-12-20 19:20:36
举报
文章被收录于专栏:Android Camera开发Android Camera开发
代码语言:javascript
复制
本课程内容由 @公众号:小驰笔记出品,欢迎关注公众号,获取更多交流信息~

一、如何获取实时预览流?

1)camera1 api 如何获取?

代码语言:javascript
复制
//1) 设置preview callback
Camera.setPreviewCallback(mPreviewCallback);

//2)回调数据是nv21格式yuv数据
public PreviewCallback mPreviewCallback = new PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
            }
        };

2)camera2 api如何获取?

代码语言:javascript
复制
private ImageReader mImageReader;
//1) 创建ImageReader
mImageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, MAX_REQUIRED_IMAGE_NUM);

//2) 设置数据回调监听
mImageReader.setOnImageAvailableListener(mImageReaderAvailableListener, mBackgroundHandler);

//3) 讲ImageReader 的surface设置到target
surfaces.add(mImageReader.getSurface());
mPreviewBuilder.addTarget(mImageReader.getSurface());

//4) 创建的session中,携带imageReader的surface
mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {}

代码语言:javascript
复制
// 5)回调数据中解析y、u、v 数据
private class MyImageReaderAvailableListener implements ImageReader.OnImageAvailableListener {
        private byte[] y;
        private byte[] u;
        private byte[] v;
        private ReentrantLock lock = new ReentrantLock();

        @Override
        public void onImageAvailable(ImageReader reader) {
                Image image = reader.acquireLatestImage();

               synchronized (mImageReaderLock) {

                   if (ImageFormat.YUV_420_888 == image.getFormat()) {
                        Image.Plane[] planes = image.getPlanes();

                        // 加锁确保y、u、v来源于同一个Image
                        lock.lock();

                        if (y == null) {
                            y = new byte[planes[0].getBuffer().limit() - planes[0].getBuffer().position()];
                            u = new byte[planes[1].getBuffer().limit() - planes[1].getBuffer().position()];
                            v = new byte[planes[2].getBuffer().limit() - planes[2].getBuffer().position()];
                        }

                        if (mHasSetImageReaderTarget && mPreviewListener != null && image.getPlanes()[0].getBuffer().remaining() == y.length) {
                            planes[0].getBuffer().get(y);
                            planes[1].getBuffer().get(u);
                            planes[2].getBuffer().get(v);
                        }
                        lock.unlock();
                    }
                }
                image.close();
        }
}

二、如何一边本地录像,一边后台推流?

深圳上班,

从事Android Camera相关软件开发工作,

公众号记录生活和工作的点滴,

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小驰成长圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、如何获取实时预览流?
  • 二、如何一边本地录像,一边后台推流?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档