我今天遇到了这个问题,但在任何地方都没有找到解决方案,所以我想分享我的解决方案,尽管在提出问题之后已经很晚了。基本上有两种选择:修改源代码并自己编译 webrtc 库,或者更简单的解决方案 - 稍微覆盖库的功能。我不得不说我使用的是直接来自 Google 存储库的最新预建库,所以我的 libjingle 库可能有点不同。
implementation 'org.webrtc:google-webrtc:1.0.28262'
现在,到代码本身。创建一个包org.webrtc,以便能够访问您需要实现或修改的包私有类和接口。
首先是interface CameraSession。此接口的实例处理对 android 的 Camera 的访问。所以我通过从class Camera1Session 复制粘贴代码创建了class FlaslightCameraSession implements CameraSession,并添加了一个打开/关闭手电筒的功能,如下所示。
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用来获取摄像头的VideoFrames。为此,我通过扩展 webrtc 的 class Camera1Capturer 简单地创建了一个 class FlashlightCameraCapturer,并添加了简单的修改来控制手电筒。
@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);
}
现在您可以简单地使用新修改的相机枚举器来获取可以控制手电筒的相机捕捉器实例。
希望这会有所帮助:)