相关疑难解决方法(0)

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

我需要一种方法来控制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();
Run Code Online (Sandbox Code Playgroud)

预览开始后,我可以来回翻转该参数以打开和关闭灯光.这很有效,直到我尝试录制视频.麻烦的是,为了将相机送到MediaRecorder,我首先必须解锁它.

MediaRecorder m = new MediaRecorder();
c.unlock();     // the killer
m.setCamera(c);
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以,我仍然可以访问相机,但它不会听我说的任何东西.(这是Camera.unlock()的目的)

编辑:

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

EDIT2:

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

EDIT3:

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

编辑4 :(几个月后)

在这一点上,我认为不可能做我原本想要的.我不想删除有人确实回答的问题,但我并没有积极寻求答案.(虽然,收到有效答案会很棒.)

c++ java android process android-camera

28
推荐指数
1
解决办法
5994
查看次数

标签 统计

android ×1

android-camera ×1

c++ ×1

java ×1

process ×1