短视频系统,获取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的的图像并保存实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现