我需要一种方式来控制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的黑客,但这里是我知道的:
- Camera.unlock()是土生土长的方法,所以我不能真正看到它锁定我的方式背后的机制
- Camera.Parameter有一个包含其所有参数的HashMap
- Camera.setParameters(Parameters)接受HashMap,将其转换为字符串,并将其传递给本地方法
- 我可以消除所有参数,但从HashMap中的割炬模式和相机仍然会接受它
所以,我仍然可以访问相机,但它不会听我讲的任何东西。 (这是一种Camera.unlock()的目的)
编辑:
检查本机代码后,我可以看到,在我的CameraService.cpp到Camera.setParameters电话(参数)被拒绝,因为我的进程ID与摄像机服务记录的进程ID不匹配。所以看起来这是我的障碍。
EDIT2:
这样看来,所述MediaPlayerService是主服务,拍摄摄像机的控制当视频正在记录。我不知道这是否可行,但如果我可以在我自己的过程中以某种方式启动该服务,我应该可以跳过Camera.unlock()调用。
EDIT3:
最后一个选择是,如果我可以某种方式得到的指针CameraHardwareInterface。从外观上看,这是一个设备特定的接口,可能不包含PID检查。这个问题的主要问题是唯一可以找到它的指针位于CameraService中,并且CameraService不在说话。
Edit4:(几个月后)
在这一点上,我不认为这是可以做到什么,我本来想。我不想删除有人会回答的问题,但我不积极寻求答案。 (虽然接收到有效的答案会很棒。)
我真的不明白为什么你会认为这是可能的。我希望视频录制可以完全控制摄像机。这需要特殊的编码才能让其他东西同时控制相机。 – 2012-10-16 01:08:40
我完全同意,在这一点上我不认为这是可能的,但我现在只是在这个问题上离开这个问题,而不会有人奇迹般地找到方法。 – thepenguin77 2012-11-03 01:27:07