Android: как включить FLASHLIGHT с помощью WEBRTC android io.pristine.libjingle:11139

Великие разработчики. Я использую библиотеку webRTC io.pristine.libjingle:11139 для видеозвонков. Все идет хорошо, теперь я просто хочу включить FLASHLIGHT, я исследовал почти все вопросы, связанные с FLASHLIGHT, где я обнаружил, что FLASHLIGHT - это функция камеры, поэтому для включения FLASHLIGHT нужно идти с объектом CAMERA, Теперь я застрял здесь, потому что я использую библиотеку, она не позволяет мне получить доступ к объекту камеры, уже открытому. Так как же включить фонарик, не используя камеру, потому что камера уже используется библиотекой webrtc? Есть ли какая-либо другая последняя библиотека, которая позволяет получить доступ к объекту камеры libjingle для webrtc для Android?

Мне нужна помощь, это действительно как вызов.

С уважением, Дхарма

2 ответа

Сегодня я столкнулся с этой проблемой и нигде не нашел решения, поэтому я хотел поделиться своим решением, хотя уже довольно поздно после того, как вопрос был задан. В основном есть два варианта: изменить исходный код и скомпилировать библиотеку webrtc самостоятельно или более простое решение - немного переопределить функциональность библиотеки. Я должен сказать, что я использую последнюю готовую библиотеку прямо из репозитория Google, поэтому моя библиотека libjingle может немного отличаться.

implementation 'org.webrtc:google-webrtc:1.0.28262'

Теперь перейдем к самому коду. Создать пакетorg.webrtc чтобы иметь доступ к частным классам и интерфейсам пакета, которые необходимо реализовать или изменить.

Первый из них interface CameraSession. Экземпляр этого интерфейса обрабатывает доступ к камере Android. Итак, я создалclass FlaslightCameraSession implements CameraSession скопировав код из class Camera1Session и добавляем функцию включения / выключения фонарика следующим образом.

    void setFlashlightActive(boolean isActive) {
        Camera.Parameters params = camera.getParameters();

        if (isActive) {
            params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        } else {
            params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        }

        camera.setParameters(params);
    }

Следующим шагом является изменение VideoCapturer привык получать VideoFrameс камеры. Для этого я просто сделалclass FlashlightCameraCapturer путем расширения webrtc class Camera1Capturer и добавлена ​​простая модификация для управления фонариком.

    @Override
    protected void createCameraSession(CameraSession.CreateSessionCallback createSessionCallback, CameraSession.Events events, Context applicationContext, SurfaceTextureHelper surfaceTextureHelper, String cameraName, int width, int height, int framerate) {
        CameraSession.CreateSessionCallback myCallback = new CameraSession.CreateSessionCallback() {
            @Override
            public void onDone(CameraSession cameraSession) {
                FlashlightCameraCapturer.this.cameraSession = (FlashlightCameraSession) cameraSession;
                createSessionCallback.onDone(cameraSession);
            }

            @Override
            public void onFailure(CameraSession.FailureType failureType, String s) {
                createSessionCallback.onFailure(failureType, s);
            }
        };

        FlashlightCameraSession.create(myCallback, events, captureToTexture, applicationContext, surfaceTextureHelper, Camera1Enumerator.getCameraIndex(cameraName), width, height, framerate);
    }

    public void turnOnFlashlight() {
        cameraSession.setFlashlightActive(true);
    }

    public void turnOffFlashlight() {
        cameraSession.setFlashlightActive(false);
    }

Последний шаг - изменить CameraEnumerator. В частности, вам нужно переопределить функцию createCapturer, чтобы создать экземпляр нашего модифицированного захватчика. Так что я продлилclass Camera1Enumerator чтобы переопределить эту функцию следующим образом.

    @Override
    public CameraVideoCapturer createCapturer(String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
        return new FlashlightCameraCapturer(deviceName, eventsHandler, true);
    }

Теперь вы можете просто использовать свой новый модифицированный перечислитель камер, чтобы получить экземпляр устройства захвата камеры, который может управлять фонариком.

Надеюсь это поможет:)

Чтобы скомпрометировать ответ @Dzerjrin, я наконец реализовал функциональность фонарика в рабочем Android-приложении на основе WebRTC.

Прежде всего, я использовал Gradle-зависимость библиотеки WebRTC;

      implementation 'org.webrtc:google-webrtc:1.0.32006'

Как было предложено, для доступа к частным классам пакета нам нужно создать пакет org.webrtc

Затем нам нужно создать три класса FlashlightCameraCapturer, а также FlaslightCameraSession.

Основная хитрость для этой функции заключается в использовании созданного CameraNumerator в вашем существующем классе VideoChat, как показано ниже; Тогда вы можете использовать фонарик. В приведенном ниже сценарии FlashlightCameraNumerator использовался.

       private fun createCameraCapturer(enumerator: FlashlightCameraNumerator): FlashlightCameraCapturer? {
        val deviceNames = enumerator.deviceNames
        if (expertOfTheCall) {
            // First, try to find front facing camera
            Logging.d(RtcAppConstant.TAG, "Looking for front facing cameras.")
            for (i in deviceNames.indices) {
                val deviceName = deviceNames[i]
                if (enumerator.isFrontFacing(deviceName)) {
                    Logging.d(RtcAppConstant.TAG, "Creating front facing camera capturer.")
                    val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
                    cameraDeviceId = i
                    cameraDeviceName = deviceName
                    if (videoCapturer != null) {
                        return videoCapturer
                    }
                }
            }

            // Front facing camera not found, try something else
            Logging.d(RtcAppConstant.TAG, "Looking for other cameras.")
            for (i in deviceNames.indices) {
                val deviceName = deviceNames[i]
                if (!enumerator.isFrontFacing(deviceName)) {
                    Logging.d(RtcAppConstant.TAG, "Creating other camera capturer.")
                    val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
                    cameraDeviceId = i
                    cameraDeviceName = deviceName
                    if (videoCapturer != null) {
                        return videoCapturer
                    }
                }
            }
        } else {
            // First, try to find back camera
            Logging.d(RtcAppConstant.TAG, "Looking for other cameras.")
            for (i in deviceNames.indices) {
                val deviceName = deviceNames[i]
                if (!enumerator.isFrontFacing(deviceName)) {
                    Logging.d(RtcAppConstant.TAG, "Creating other camera capturer.")
                    val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
                    cameraDeviceId = i
                    cameraDeviceName = deviceName
                    if (videoCapturer != null) {
                        return videoCapturer
                    }
                }
            }

            // Back camera not found, try something else
            Logging.d(RtcAppConstant.TAG, "Looking for front facing cameras.")
            for (i in deviceNames.indices) {
                val deviceName = deviceNames[i]
                if (enumerator.isFrontFacing(deviceName)) {
                    Logging.d(RtcAppConstant.TAG, "Creating front facing camera capturer.")
                    val videoCapturer: FlashlightCameraCapturer? = enumerator.createCapturer(deviceName, null) as FlashlightCameraCapturer?
                    cameraDeviceId = i
                    cameraDeviceName = deviceName
                    if (videoCapturer != null) {
                        return videoCapturer
                    }
                }
            }
        }
        return null
    }
Другие вопросы по тегам