改变帧大小记录

44 篇文章 0 订阅
40 篇文章 1 订阅



我们的方法:


参考链接:地址

要调用相机并记录每一的数据,您可以使用Android相机API。以下是实现此操作的基本步骤: 1. 添加权限:您需要在AndroidManifest.xml文件中添加相机和存储权限。 2. 打开相机:使用Camera2 API或Camera API打开相机。 3. 创建预览:将相机捕获的渲染到预览视图中。 4. 记录:将相机捕获的转换为数据并保存到磁盘或内存中。 以下是一个示例代码,该代码打开相机并将每一数据保存到VideoCaptureReceiver类中: ```java public class MainActivity extends AppCompatActivity { private static final int REQUEST_CAMERA_PERMISSION_RESULT = 0; private CameraManager mCameraManager; private CameraDevice mCameraDevice; private CameraCaptureSession mCaptureSession; private Surface mSurface; // 预览视图的表面 private ImageReader mImageReader; // 捕获的图像阅读器 private VideoCaptureReceiver mCaptureReceiver; // 接收捕获的接收器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取相机管理器 mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); // 创建预览表面并设置为视图的背景 SurfaceView previewView = findViewById(R.id.preview_view); mSurface = previewView.getHolder().getSurface(); // 创建捕获图像阅读器 mImageReader = ImageReader.newInstance(640, 480, ImageFormat.YUV_420_888, 2); // 创建接收器 mCaptureReceiver = new VideoCaptureReceiver(); // 打开相机并启动预览 openCamera(CameraCharacteristics.LENS_FACING_BACK); } /** * 打开相机并启动预览 * * @param lensFacing 相机镜头方向(前置或后置) */ private void openCamera(int lensFacing) { try { // 获取可用相机列表 String[] cameraIds = mCameraManager.getCameraIdList(); for (String cameraId : cameraIds) { // 获取相机的特征 CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId); // 检查相机镜头方向是否与指定的方向匹配 if (characteristics.get(CameraCharacteristics.LENS_FACING) == lensFacing) { // 获取相机的配置 StreamConfigurationMap configMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); // 获取相机支持的最大预览尺寸 Size largestPreviewSize = Collections.max(Arrays.asList(configMap.getOutputSizes(ImageFormat.YUV_420_888)), new CompareSizesByArea()); // 配置捕获器 mImageReader.setOnImageAvailableListener(mCaptureReceiver, null); mImageReader.newInstance(largestPreviewSize.getWidth(), largestPreviewSize.getHeight(), ImageFormat.YUV_420_888, 2); // 打开相机 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION_RESULT); return; } mCameraManager.openCamera(cameraId, mCameraDeviceStateCallback, null); } } } catch (CameraAccessException e) { e.printStackTrace(); } } /** * 相机设备状态回调 */ private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { mCameraDevice = camera; startPreview(); } @Override public void onDisconnected(@NonNull CameraDevice camera) { camera.close(); mCameraDevice = null; } @Override public void onError(@NonNull CameraDevice camera, int error) { camera.close(); mCameraDevice = null; } }; /** * 启动相机预览 */ private void startPreview() { try { // 创建捕获请求 CaptureRequest.Builder captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(mSurface); captureRequestBuilder.addTarget(mImageReader.getSurface()); // 创建会话 mCameraDevice.createCaptureSession(Arrays.asList(mSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { try { mCaptureSession = session; mCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { Toast.makeText(MainActivity.this, "Failed to configure camera preview", Toast.LENGTH_SHORT).show(); } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } /** * 请求应用程序授权时调用此方法 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_CAMERA_PERMISSION_RESULT) { if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Application will not run without camera services", Toast.LENGTH_SHORT).show(); } } } /** * 比较两个大小的实用程序 */ private static class CompareSizesByArea implements Comparator<Size> { @Override public int compare(Size lhs, Size rhs) { return Long.signum((long) lhs.getWidth() * lhs.getHeight() - (long) rhs.getWidth() * rhs.getHeight()); } } /** * 视频捕获接收器 */ private class VideoCaptureReceiver implements ImageReader.OnImageAvailableListener { private FileOutputStream mVideoFileOutputStream; /** * 初始化视频捕获接收器 * 在这里你可以打开一个输出流,将视频数据保存到文件中 */ public void initialize() { // 通过文件输出流创建文件(如果您想将数据保存到磁盘) File videoFile = new File(getExternalFilesDir(null), "video.yuv"); try { mVideoFileOutputStream = new FileOutputStream(videoFile); } catch (FileNotFoundException e) { e.printStackTrace(); } } @Override public void onImageAvailable(ImageReader reader) { // 获取数据 Image image = reader.acquireNextImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); // 将数据写入文件中 try { mVideoFileOutputStream.write(bytes); } catch (IOException e) { e.printStackTrace(); } // 释放图像资源 image.close(); } /** * 关闭视频捕获接收器 * 在这里你可以关闭输出流,停止捕获视频 */ public void close() { try { mVideoFileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 当应用程序停止时调用此方法 */ @Override protected void onStop() { super.onStop(); // 关闭相机 if (mCameraDevice != null) { mCameraDevice.close(); mCameraDevice = null; } // 关闭视频捕获接收器 if (mCaptureReceiver != null) { mCaptureReceiver.close(); mCaptureReceiver = null; } } } ``` 在上面的代码中,我们实现了VideoCaptureReceiver类来接收每一数据,并将其保存到文件中。您可以根据您的需求修改该类来存储数据到内存,发表网络请求等。另外,请注意,我们在onCreate()方法中注册了接收器和预览表面,并在打开相机后创建了捕获器会话。在onStop()方法中,我们关闭了相机和接收器,并释放了与之关联的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值