the*_*n77 28 c++ java android process android-camera
我需要一种方法来控制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()的目的)
编辑:
检查本机代码后,我可以看到在CameraService.cpp中,我对Camera.setParameters(Parameters)的调用被拒绝,因为我的进程ID与摄像头服务记录的进程ID不匹配.所以这似乎是我的障碍.
EDIT2:
看起来MediaPlayerService是在录制视频时控制摄像机的主要服务.我不知道是否可能,但如果我能以某种方式在我自己的进程中启动该服务,我应该能够跳过Camera.unlock()调用.
EDIT3:
最后一个选择是,如果我能以某种方式获得指向CameraHardwareInterface的指针.从它的外观来看,这是一个特定于设备的接口,可能不包括PID检查.这个问题的主要问题是我能找到指针的唯一地方是在CameraService中,CameraService没有说话.
编辑4 :(几个月后)
在这一点上,我认为不可能做我原本想要的.我不想删除有人确实回答的问题,但我并没有积极寻求答案.(虽然,收到有效答案会很棒.)
fje*_*fje 14
我遇到了类似的问题.用户应该能够在录制期间更改闪光模式,以根据光线情况满足他们的需求.经过一些调查研究后,我得出以下解决方案:
我假设您已经设置了适当的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();
}
}
Run Code Online (Sandbox Code Playgroud)
我的下一步是初始化和准备录音机:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,必须在媒体记录器的整个初始化过程之前调用camera.unlock().这也说明了每个set属性的正确顺序,否则在调用prepare()或start()时会出现IllegalStateException.谈到录音,我这样做.这通常由视图元素触发:
public void record(View view) {
if (recording) {
recorder.stop();
//TODO: do stuff....
recording = false;
} else {
recording = true;
initialize();
recorder.start();
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在,我终于可以正确记录了.那闪光灯是什么?最后但同样重要的是,幕后的魔力来了:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
每次我通过onClick动作调用该方法时,即使在录制过程中也可以更改闪光模式.只需要妥善锁定相机即可.一旦在录制过程中由媒体记录器获取锁定,您就不必再次锁定/解锁摄像机.它甚至不起作用.这是在Android-Version 4.1.2的三星Galaxy S3上测试的.希望这种方法有所帮助
| 归档时间: |
|
| 查看次数: |
5994 次 |
| 最近记录: |