gpt4 book ai didi

java - 录制视频时启用相机闪光灯

转载 作者:IT老高 更新时间:2023-10-28 12:51:56 25 4
gpt4 key购买 nike

我需要一种在 Android 设备录制视频时控制相机闪光灯的方法。我正在制作一个频闪灯应用程序,使用闪烁的频闪灯拍摄视频将能够记录高速移动的物体,例如风扇叶片。

只能通过启动视频预览并在相机参数中设置 FLASH_MODE_TORCH 来启用闪光灯。看起来像这样:

Camera c = Camera.open();
Camera.Parameters p = c.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(p);
c.startPreview();

预览开始后,我可以来回翻转该参数以打开和关闭灯。在我尝试录制视频之前,这很有效。麻烦的是,为了把摄像头交给MediaRecorder,我首先要解锁它。

MediaRecorder m = new MediaRecorder();
c.unlock(); // the killer
m.setCamera(c);

解锁后,我无法再更改相机参数,因此无法更改闪光灯状态。

我不知道是否真的可以这样做,因为我不是最擅长 java-hacking,但这是我所知道的:

  • Camera.unlock() 是 native 方法,因此我无法真正看到它锁定我的方式背后的机制
  • Camera.Parameter 有一个包含其所有参数的 HashMap
  • Camera.setParameters(Parameters) 获取 HashMap,将其转换为字符串,并将其传递给本地方法
  • 我可以从 HashMap 中消除除 TORCH-MODE 之外的所有参数,Camera 仍然会接受它

所以,我仍然可以访问相机,但它不会听我告诉它的任何内容。 (这就是 Camera.unlock() 的目的)

编辑:

检查 native 代码后,我可以在 CameraService.cpp 中看到我对 Camera.setParameters(Parameters) 的调用被拒绝,因为我的进程 ID 与相机服务记录的进程 ID 不匹配。所以这似乎是我的障碍。

编辑2:

似乎 MediaPlayerService是在录制视频时控制摄像机的主要服务。我不知道这是否可能,但如果我能以某种方式在我自己的进程中启动该服务,我应该能够跳过 Camera.unlock() 调用。

编辑3:

如果我能以某种方式获得指向 CameraHardwareInterface 的指针,最后一个选择是。从外观上看,这是一个特定于设备的接口(interface),可能不包括 PID 检查。不过,主要问题是我唯一能找到指向它的指针的地方是在 CameraService 中,而 CameraService 没有说话。

Edit4:(几个月后)

在这一点上,我认为不可能做到我最初想要的。我不想在有人回答的情况下删除该问题,但我并没有积极寻求答案。 (不过,收到一个有效的答案会很棒。)

最佳答案

我遇到了类似的问题。用户应该能够在录制过程中根据光线情况更改闪光模式以满足他们的需要。经过一些调查研究,我得出了以下解决方案:

我假设您已经设置了适当的 SurfaceView 和 SurfaceHolder 及其必要的回调。我做的第一件事是提供这段代码(未声明的变量是全局变量):

public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();

parameters = camera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);

camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
camera.startPreview();

recorder = new MediaRecorder();
} catch (IOException e) {
e.printStackTrace();
}
}

我的下一步是初始化和准备录音机:

private void initialize() {
camera.unlock();

recorder.setCamera(camera);
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setVideoFrameRate(20);
recorder.setOutputFile(filePath);

try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
finish();
} catch (IOException e) {
e.printStackTrace();
finish();
}
}

需要注意的是,camera.unlock() 必须在媒体记录器的整个初始化过程之前调用。也就是说,还要注意每个 set 属性的正确顺序,否则在调用 prepare() 或 start() 时会出现 IllegalStateException。说到录音,我就是这么做的。这通常由 View 元素触发:

public void record(View view) {
if (recording) {
recorder.stop();

//TODO: do stuff....

recording = false;
} else {
recording = true;

initialize();
recorder.start();
}
}

所以现在,我终于可以正常录制了。但是那个闪光灯是怎么回事?最后但并非最不重要的一点是,幕后的魔法来了:

public void flash(View view) {
if(!recording) {
camera.lock();
}

parameters.setFlashMode(parameters.getFlashMode().equals(Parameters.FLASH_MODE_TORCH) ? Parameters.FLASH_MODE_OFF : Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);

if(!recording) {
camera.unlock();
}
}

每次我通过 onClick 操作调用该方法时,我都可以更改 flash 模式,即使在录制期间也是如此。只需注意正确锁定相机即可。一旦在录制过程中媒体记录器获得锁定,您就不必再次锁定/解锁相机。它甚至不起作用。这是在带有 Android 版本 4.1.2 的三星 Galaxy S3 上测试的。希望这种方法有所帮助。

关于java - 录制视频时启用相机闪光灯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com