短视频系统,获取camera的的图像并保存

短视频系统,获取camera的的图像并保存实现的相关代码

要想保存camera中的图像就要用到ImageReader

ImageReader中有surface,将这个surface设置到

CaptureRequest和CameraCaptureSession中。

ImageReader的创建

 

1
 public static @NonNull ImageReader newInstance(<br>            @IntRange(from = 1) int width,<br>            @IntRange(from = 1) int height,<br>            @Format             int format,<br>            @IntRange(from = 1) int maxImages)

创建imagerader我们需要的参数

width:我们要读取图片的宽

height  我们要读取图片的高

format 我们要读取图片的格式 ,特别要注意不支持ImageFormat.NV21。我们可以从源码中看到

 

1
  protected ImageReader(int width, int height, int format, int maxImages, long usage) {<br>       <br>         .......<br>        if (format == ImageFormat.NV21) {<br>            throw new IllegalArgumentException(<br>                    "NV21 format is not supported");<br>        }<br>    .......<br>}

maxImages 表示我们最多可以同时从ImageRader中获取多少张图片。获取的越多,需要的buffer也就越多。所以这里要注意。

我们知道camera可以支持很多分辨率,那么我们就从camera当中,找到我们支持的宽高

所以就有了下面的代码

从camera中获取宽高的方法

 

1
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(backCameraId);<br>            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);<br>            Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)), new CompareSizesByArea());

创建ImageRader

 

1
<br> mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),<br>                    ImageFormat.YUV_420_888, 2);<br>            width = largest.getWidth();<br>            height = largest.getHeight();

获取到宽高后我们创建ImageRader设置到CameraCaptureSession

 

1
 OutputConfiguration outputConfiguration = new OutputConfiguration(binding.surfaceView.getHolder().getSurface());<br>            OutputConfiguration imageReaderOutputConfiguration = new OutputConfiguration(mImageReader.getSurface());<br>            List<OutputConfiguration> outputs = new ArrayList<>();<br>            outputs.add(outputConfiguration);<br>            outputs.add(imageReaderOutputConfiguration);<br>            SessionConfiguration sessionConfiguration<br>                    = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR,<br>                    outputs,<br>                    mExecutorService,<br>                    new CameraCaptureSession.StateCallback() {<br>                        @Override<br>                        public void onConfigured(@NonNull CameraCaptureSession session) {<br>                            <br>                        }<br> <br>                        @Override<br>                        public void onConfigureFailed(@NonNull CameraCaptureSession session) {<br> <br>                        }<br>                    }<br>            );<br> <br>            mCamera.createCaptureSession(sessionConfiguration);

 

 我们将ImageReader设置到CaptureRequest

 

 

1
    private void record() {<br>        try {<br>            Log.e("CameraActivity", "record");<br>            i = 0;<br>            File file = new File(savePicPath);<br>            DirUtil.deleteDir(file);<br>            final CaptureRequest.Builder builder<br>                    = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);<br>            builder.addTarget(binding.surfaceView.getHolder().getSurface());<br>            builder.addTarget(mImageReader.getSurface());<br>            OutputConfiguration outputConfiguration = new OutputConfiguration(binding.surfaceView.getHolder().getSurface());<br>            OutputConfiguration imageReaderOutputConfiguration = new OutputConfiguration(mImageReader.getSurface());<br>            List<OutputConfiguration> outputs = new ArrayList<>();<br>            outputs.add(outputConfiguration);<br>            outputs.add(imageReaderOutputConfiguration);<br>            SessionConfiguration sessionConfiguration<br>                    = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR,<br>                    outputs,<br>                    mExecutorService,<br>                    new CameraCaptureSession.StateCallback() {<br>                        @Override<br>                        public void onConfigured(@NonNull CameraCaptureSession session) {<br> <br>                        }<br> <br>                        @Override<br>                        public void onConfigureFailed(@NonNull CameraCaptureSession session) {<br> <br>                        }<br>                    }<br>            );<br> <br>            mCamera.createCaptureSession(sessionConfiguration);<br> <br>        } catch (Exception e) {<br> <br>        }<br> <br>    }

 

以上就是短视频系统,获取camera的的图像并保存实现的相关代码, 更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示