当前位置: 首页 > 面试题库 >

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

韶宏邈
2023-03-14
问题内容

我需要一种在录制视频的同时在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中删除所有参数,但TORCH-MODE仍会被相机接受

因此,我仍然可以使用相机,但是它不会听我说的任何内容。(这是Camera.unlock()的目的)

编辑:

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

编辑2:

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

编辑3:

最后一个选择是,如果我能以某种方式获得指向CameraHardwareInterface的指针。从外观上看,这是设备特定的接口,可能不包括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.setAudhtml" target="_blank">ioEncoder(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动作调用该方法时,即使在录制过程中,我也可以更改闪光模式。只需注意正确锁定相机即可。在录制过程中,如果媒体记录仪要求锁定,则无需再次锁定/解锁摄像机。它甚至不起作用。已在具有Android
4.1.2版的Samsung Galaxy S3上进行了测试。希望这种方法有所帮助。



 类似资料:
  • 本文向大家介绍IOS打开系统相机的闪光灯,包括了IOS打开系统相机的闪光灯的使用技巧和注意事项,需要的朋友参考一下 IOS有两种的拍照和视频的方式: 1.直接使用UIImagePickerController,这个类提供了一个简单便捷的拍照与选择图片库里图片的功能。 2.另一种是通过AVFoundation.framework框架完全自定义拍照的界面和选择图片库界面。我只做了第一种,就先给大家介绍

  • ap.chooseVideo(OPTION | maxDuration, CALLBACK) 录制或从手机相册中选择视频。可直接传入一个数字作为 OPTION.maxDuration 参数。 OPTION 参数说明 名称 类型 必选 描述 maxDuration Number 否 最大录制时长,单位秒,默认60s sourceType String Array 否 相册选取或者拍照,默认 ['ca

  • 我们可以在录制视频时重置mediaRecorder中的所有值吗?我尝试在录制视频时使用。但行不通。我不知道有没有可能。如果有可能,请任何参考将不胜感激。 我读过这篇文章,也读过谷歌开发者,开发者中的mediaRecorder。但任何参考文献都没有提到我的问题。 编辑: 感谢您宝贵的时间。

  • 因此,我使用了以下代码: 而我的问题: 一个叫做appsrc的视频文件!自动视频转换!omxh264enc!matroskamux!创建filesink location=test2.mkv sync=false(而不是test2.mkv),并且它为空。同样的问题被纠正了,并且在下面的线程中似乎可以工作,对我来说没有任何影响:用VideoWriter从OpenCV打开一个GStreamer管道 n

  • 我正在尝试开发一个应用程序,允许我在录制视频时绘制视频,然后将录制的视频和视频保存在一个mp4文件中供以后使用。另外,我想使用camera2库,特别是我需要我的应用程序在高于API 21的设备上运行,我总是避免使用不推荐的库。 我尝试了很多方法,包括FFmpeg,其中我放置了TextureView的覆盖层。getBitmap()(来自摄影机)和从画布获取的位图。它工作正常,但由于它的功能很慢,视频

  • 我正在寻找安卓摄像头LED闪光灯的帮助,以改变它的强度,像这个应用程序。 我已经检查了以下链接,但我没有得到确切的结果从它。 可以更改Android设备的LED强度吗? 如何在Android中以编程方式打开相机闪光灯? http://code.google.com/p/droidled/source/checkout http://code.google.com/p/simpleed/source