【问题标题】:Android Twilio Video - get camera streamAndroid Twilio Video - 获取相机流
【发布时间】:2016-11-29 05:05:39
【问题描述】:

我目前正在使用 Twilio Video API 开发应用程序:https://www.twilio.com/video 它仍处于测试阶段,但在大多数情况下工作得很好。也许还有一种方法可以解决我的问题。

对于我的应用,我需要切换摄像头并打开后置摄像头的灯。第一个很容易用 Twilio 完成,但第二个我没有相机对象来控制相机灯光。有没有办法获取相机对象?或者我可以自己创建相机对象,然后将其传递给 Twilio?或者有其他方法可以开灯吗?

我的相机预览代码。在示例中,我使用CameraCapturer 将相机预览放入视图中:

cameraCapturer = CameraCapturer.create(MyActivity.this, CameraCapturer.CameraSource.CAMERA_SOURCE_FRONT_CAMERA, capturerErrorListener());
startPreview();

和预览:

private void startPreview() {
    if (cameraCapturer != null) {
        cameraCapturer.startPreview(previewFrameLayout);
    }
}

【问题讨论】:

    标签: android video android-camera twilio twilio-api


    【解决方案1】:

    此处是 Twilio 开发人员宣传员。您是对的,当前版本的 SDK 不允许您像自己创建相机对象那样控制相机捕捉器。

    我们已经意识到这一点,并且正在开发一个新版本,您将能够做到这一点。

    暂时我建议还是尝试手动创建自己的相机对象,这样你就可以打开背光了,我认为只要你不调用预览,你不应该结束有冲突。

    我想像这样(未经测试)的东西会起作用。

    private void turnOnFlash() {
        Camera camera = Camera.open();
        Camera.Parameters params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
    }
    

    将此添加到您的 AndroidManifest。

    <permission android:name="android.permission.FLASHLIGHT"
            android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
            android:protectionLevel="normal" />
    

    然后你会在你调用 startPreview() 的地方调用那个方法。

    这个解决方案暂时应该可以让您继续前进,但是您将来可以传递自己的相机对象,所以如果这暂时不是一个紧迫的功能,我会等待更新版本。

    希望对你有帮助

    【讨论】:

    • 谢谢,这在启动 CameraCapturer 之前调用时有效。可悲的是,在我的场景中,我必须在视频通话期间打开和关闭灯(通过 websocket 连接切换命令)。暂停并重新开始预览是可以的,但现在 CameraCapturer 让相机处于暂停状态,我自己拿到相机时会收到 java.lang.RuntimeException: Fail to connect to camera service
    • @Marcos Placona 对此有何更新?现在是否可以在使用 WebRTC 流时打开手电筒?
    • @EnricoCasini 来自 Twilio 的 Aaron 非常棒,可以为这个用例创建一个新示例。你可以在他们的 Github 上看到它:github.com/twilio/video-quickstart-android/tree/master/…
    • 嗨 Placona,根据 Casini 的要求,是否可以在正在进行的视频中打开手电筒。如果我们实现,手电筒会打开,但相机实例发生了变化。
    • 你看过上面 Aaron 的例子吗?
    【解决方案2】:

    你应该创建这个:

    private boolean flashOn = false;
    
    private final CameraParameterUpdater flashToggler = new CameraParameterUpdater() {
        @Override public void apply(Camera.Parameters parameters) {
            if (parameters.getFlashMode() != null) {
                String flashMode = flashOn ?
                        Camera.Parameters.FLASH_MODE_OFF :
                        Camera.Parameters.FLASH_MODE_TORCH;
                parameters.setFlashMode(flashMode);
                flashOn = !flashOn;
            } else {
                Toast.makeText(*context*,
                        R.string.flash_not_supported,
                        Toast.LENGTH_LONG).show();
            }
        }
    };
    

    在可以访问 CameraCapturerCompat(Twilio 示例中的名称)对象的类中设置这个和下面的 func

    public void setFlashOn(boolean state) {
        flashOn = !state;
    
        cameraCapturerCompat.updateCameraParameters(flashToggler);
    }
    

    然后在您的 CameraCapturerCompat 类上:

    public void updateCameraParameters(CameraParameterUpdater flashToggler) {
        if (usingCamera1()) { 
            camera1Capturer.updateCameraParameters(flashToggler);
        }
    }
    

    【讨论】:

      【解决方案3】:

      现在在他们的 Github 页面上有来自 Twilio 的官方示例:exampleAdvancedCameraCapturer

      您可以在AdvancedCameraCapturerActivity.java 中查看切换的工作原理

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多