【发布时间】:2012-07-22 07:35:09
【问题描述】:
我需要一种在 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() 是本机方法,因此我无法真正看到它锁定我的方式背后的机制
- Camera.Parameter 有一个包含其所有参数的 HashMap
- Camera.setParameters(Parameters) 获取 HashMap,将其转换为字符串,并将其传递给本地方法
- 我可以从 HashMap 中消除除 TORCH-MODE 之外的所有参数,Camera 仍会接受它
所以,我仍然可以访问相机,但它不会听我告诉它的任何内容。 (这就是 Camera.unlock() 的目的)
编辑:
检查本机代码后,我可以看到在CameraService.cpp 中我对 Camera.setParameters(Parameters) 的调用被拒绝,因为我的进程 ID 与相机服务记录的进程 ID 不匹配。所以这似乎是我的障碍。
编辑2:
MediaPlayerService 似乎是在录制视频时控制摄像机的主要服务。我不知道这是否可能,但如果我能以某种方式在我自己的进程中启动该服务,我应该能够跳过 Camera.unlock() 调用。
编辑3:
如果我能以某种方式获得指向 CameraHardwareInterface 的指针,最后一个选择是。从外观上看,这是一个特定于设备的接口,可能不包括 PID 检查。不过,主要问题是我唯一能找到指向它的指针的地方是在 CameraService 中,而 CameraService 没有说话。
Edit4:(几个月后)
在这一点上,我认为不可能做到我最初想要的。我不想在有人回答的情况下删除该问题,但我并没有积极寻求答案。 (不过,收到一个有效的答案会很棒。)
【问题讨论】:
-
我真的不明白为什么你会认为这是可能的。我希望视频录制能够完全控制相机。它需要在其中进行特殊编码,以允许其他东西同时控制相机。
-
我完全同意,我认为目前也不可能,我只是在此时将问题留在这里,以防有人奇迹般地找到方法。
标签: java android c++ process android-camera