Android 安卓:如何使用WEBRTC安卓io打开手电筒。质朴。歌词:11139
伟大的开发者。 我正在使用io.pristine.libjingle:11139的webRTC库进行视频通话。 一切都很顺利,现在我只想打开手电筒,我研究了几乎所有与手电筒相关的问题,发现手电筒是相机的一个功能,所以打开手电筒必须与相机对象相匹配。 现在我卡在这里,因为我正在使用库,它不允许我访问已打开的摄影机对象。 既然webrtc库已经在使用摄像头,那么如何在不使用摄像头的情况下打开手电筒呢? 是否有其他最新的库允许访问android版webrtc的libjingle的摄像头对象 我需要帮助,这真是个挑战 问候,,Android 安卓:如何使用WEBRTC安卓io打开手电筒。质朴。歌词:11139,android,camera,webrtc,flashlight,libjingle,Android,Camera,Webrtc,Flashlight,Libjingle,伟大的开发者。 我正在使用io.pristine.libjingle:11139的webRTC库进行视频通话。 一切都很顺利,现在我只想打开手电筒,我研究了几乎所有与手电筒相关的问题,发现手电筒是相机的一个功能,所以打开手电筒必须与相机对象相匹配。 现在我卡在这里,因为我正在使用库,它不允许我访问已打开的摄影机对象。 既然webrtc库已经在使用摄像头,那么如何在不使用摄像头的情况下打开手电筒呢? 是否有其他最新的库允许访问android版webrtc的libjingle的摄像头对象 我需要帮助
达摩我今天面对这个问题,但还没有找到解决方案,所以我想分享我的解决方案,尽管问这个问题已经很晚了。基本上有两种选择:自己修改源代码和编译webrtc库,或者更简单的解决方案——稍微覆盖库的功能。我不得不说,我使用的是直接从谷歌存储库中获得的最新预建库,所以我的libjingle库可能有点不同
implementation 'org.webrtc:google-webrtc:1.0.28262'
现在,到代码本身。创建一个包org.webrtc
,以便能够访问需要实现或修改的包私有类和接口
首先是接口摄像机会话
。此接口的实例处理对android摄像头的访问。因此,我创建了class CameraSession,通过从class Camera1Session
复制粘贴代码并添加一个打开/关闭手电筒的函数来实现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);
}
@Override
public CameraVideoCapturer createCapturer(String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
return new FlashlightCameraCapturer(deviceName, eventsHandler, true);
}
下一步是修改用于获取摄像机视频帧的VideoCapturer
。为此,我通过扩展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函数来创建修改后的capturer实例。因此,我扩展了类Camera1Enumerator
以覆盖此函数,如下所示
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);
}
@Override
public CameraVideoCapturer createCapturer(String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
return new FlashlightCameraCapturer(deviceName, eventsHandler, true);
}
现在,您可以简单地使用新修改的摄影机枚举器来获取可以控制手电筒的摄影机捕捉器实例
@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);
}
希望这有帮助:)不,我读过这个问题,我无法访问摄影机对象,但是它已经被我的应用程序中的webrtc库使用。@Amit Vaghela你能给我看一下这个问题,这样我就可以得到答案吗?这将是非常有帮助的。上面的链接对你不起作用吗?亲爱的Amit,我使用的是webrtc库,它打开了cam,但没有公开提供,所以我不能在已经打开的摄像头上设置任何内容。你知道WEBRTC吗?请你分享完整的源代码或任何链接,我已经遵循了所有这些步骤。但无法打开闪光灯。