android camera使用ISO值录制视频

android camera使用ISO值录制视频

我的应用是使用自定义camera对着一个led灯箱录制视频,该led灯的频率是1000HZ,同时我使用高ISO值录像,最终想要的效果如下图,屏幕中会出现明显黑色条纹
这里写图片描述
要达到这样的效果,要对camera的参数进行以下设置:【代码1】

p.setSceneMode(Camera.Parameters.SCENE_MODE_AUTO);
p.setAntibanding(Camera.Parameters.ANTIBANDING_AUTO);
p.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTUR
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用AndroidCamera2 API来录制15秒的视频。以下是一个简单的示例代码,可以帮助你开始录制视频: 1. 在你的AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 在你的布局文件中添加一个SurfaceView元素用于预览视频: ```xml <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 在你的Activity或Fragment中,获取SurfaceView并设置它的回调: ```java private SurfaceView surfaceView; private SurfaceHolder surfaceHolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surfaceView); surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(surfaceHolderCallback); } private SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // 初始化Camera initializeCamera(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 当SurfaceView尺寸发生变化时,更新Camera参数 updateCameraParameters(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 释放Camera资源 releaseCamera(); } }; ``` 4. 初始化Camera设置参数: ```java private CameraDevice camera; private CameraCaptureSession captureSession; private CaptureRequest.Builder previewRequestBuilder; private Size previewSize; private void initializeCamera() { CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { // 获取后置摄像头 String cameraId = cameraManager.getCameraIdList()[0]; CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); previewSize = map.getOutputSizes(SurfaceTexture.class)[0]; // 打开Camera if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) { cameraManager.openCamera(cameraId, cameraStateCallback, null); } } catch (CameraAccessException e) { e.printStackTrace(); } } private CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { MainActivity.this.camera = camera; // 开始预览 startPreview(); } @Override public void onDisconnected(CameraDevice camera) { camera.close(); MainActivity.this.camera = null; } @Override public void onError(CameraDevice camera, int error) { camera.close(); MainActivity.this.camera = null; } }; private void startPreview() { try { SurfaceTexture texture = surfaceHolder.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); Surface surface = new Surface(texture); previewRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewRequestBuilder.addTarget(surface); List<Surface> surfaces = new ArrayList<>(); surfaces.add(surface); camera.createCaptureSession(surfaces, captureSessionStateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private CameraCaptureSession.StateCallback captureSessionStateCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { captureSession = session; try { previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); CaptureRequest previewRequest = previewRequestBuilder.build(); captureSession.setRepeatingRequest(previewRequest, null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { session.close(); captureSession = null; } }; private void updateCameraParameters() { if (camera == null) { return; } try { // 获取最佳预览尺寸 CameraCharacteristics characteristics = camera.getCameraCharacteristics(camera.getId()); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] supportedSizes = map.getOutputSizes(SurfaceTexture.class); Size optimalSize = getOptimalPreviewSize(supportedSizes, surfaceView.getWidth(), surfaceView.getHeight()); // 更新预览尺寸 if (!previewSize.equals(optimalSize)) { previewSize = optimalSize; updatePreview(); } } catch (CameraAccessException e) { e.printStackTrace(); } } private void updatePreview() { if (camera == null) { return; } try { // 停止当前预览 captureSession.stopRepeating(); captureSession.abortCaptures(); // 更新预览大小 SurfaceTexture texture = surfaceHolder.getSurfaceTexture(); texture.setDefaultBufferSize(previewSize.getWidth(), previewSize.getHeight()); // 创建新的预览请求 Surface surface = new Surface(texture); previewRequestBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewRequestBuilder.addTarget(surface); List<Surface> surfaces = new ArrayList<>(); surfaces.add(surface); camera.createCaptureSession(surfaces, captureSessionStateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private Size getOptimalPreviewSize(Size[] sizes, int width, int height) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) height / width; if (sizes == null) { return null; } Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = height; for (Size size : sizes) { double ratio = (double) size.getWidth() / size.getHeight(); if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) { continue; } if (Math.abs(size.getHeight() - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.getHeight() - targetHeight); } } if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Size size : sizes) { if (Math.abs(size.getHeight() - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.getHeight() - targetHeight); } } } return optimalSize; } ``` 5. 在你的Activity或Fragment中实现录制视频的逻辑: ```java private MediaRecorder mediaRecorder; private File outputFile; private void startRecording() { try { // 创建输出文件 outputFile = new File(getExternalFilesDir(null), "video.mp4"); // 创建MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); mediaRecorder.setVideoSize(previewSize.getWidth(), previewSize.getHeight()); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setOutputFile(outputFile.getAbsolutePath()); // 配置MediaRecorder mediaRecorder.prepare(); mediaRecorder.start(); // 录制15秒后停止 new Handler().postDelayed(new Runnable() { @Override public void run() { stopRecording(); } }, 15000); } catch (IOException e) { e.printStackTrace(); } } private void stopRecording() { if (mediaRecorder != null) { mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; // 停止预览 if (camera != null) { captureSession.close(); captureSession = null; camera.close(); camera = null; } // 播放录制视频 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(outputFile.getAbsolutePath())); intent.setDataAndType(Uri.parse(outputFile.getAbsolutePath()), "video/*"); startActivity(intent); } } ``` 6. 最后,在你的Activity或Fragment中添加一个按钮来启动录制: ```java public void onRecordButtonClicked(View view) { startRecording(); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值