【问题标题】:Android WebRTC: switch camera back & front issue with NullPointerException in Camera2Enumerator.convertSizesAndroid WebRTC:在 Camera2Enumerator.convertSizes 中使用 NullPointerException 切换摄像头前后问题
【发布时间】:2020-09-24 17:03:38
【问题描述】:

基于示例项目,我在我的应用程序中实现了用于视频通话的 webrtc。除了切换摄像头外,一切正常。

在视频通话中,默认摄像头在前面。如果我第一次切换相机正面 --> 背面 --> 正面,它可以工作。

但如果我再次从前到后切换摄像头,Camera2Enumerator 中出现以下异常:

java.lang.NullPointerException: Attempt to get length of null array
    at org.webrtc.Camera2Enumerator.convertSizes(Camera2Enumerator.java:234)
    at org.webrtc.Camera2Enumerator.getSupportedSizes(Camera2Enumerator.java:147)
    at org.webrtc.Camera2Session.findCaptureFormat(Camera2Session.java:325)
    at org.webrtc.Camera2Session.start(Camera2Session.java:313)
    at org.webrtc.Camera2Session.<init>(Camera2Session.java:296)
    at org.webrtc.Camera2Session.create(Camera2Session.java:274)
    at org.webrtc.Camera2Capturer.createCameraSession(Camera2Capturer.java:35)
    at org.webrtc.CameraCapturer$5.run(CameraCapturer.java:270)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:237)
    at android.os.HandlerThread.run(HandlerThread.java:67)

为了切换摄像头,我使用示例项目中的代码如下:

private void switchCameraInternal() {
    if (videoCapturer instanceof CameraVideoCapturer) {
        if (!isVideoCallEnabled() || isError) {
            Log.e(TAG,
                    "Failed to switch camera. Video: " + isVideoCallEnabled() + ". Error : " + isError);
            return; // No video is sent or only one camera is available or error happened.
        }
        Log.d(TAG, "Switch camera");
        CameraVideoCapturer cameraVideoCapturer = (CameraVideoCapturer) videoCapturer;
        cameraVideoCapturer.switchCamera(null);
    } else {
        Log.d(TAG, "Will not switch camera, video caputurer is not a camera");
    }
}

另外,我注意到在“CameraVideoCapture”界面中,还有另一个switchCamera 用于特定的相机ID。但是,我不能调用这个函数,这个函数标记为未定义。

void switchCamera(CameraSwitchHandler switchEventsHandler, String cameraName);

于是我查看了实现上述接口的CameraCapturer类,但它并没有实现这个。所以我认为在示例项目中使用默认switchCamera作为上述代码只有一种选择。

这段代码有什么问题吗?非常感谢您的帮助。

【问题讨论】:

  • 我开始遇到同样的崩溃。我想问一下你找到解决办法了吗?
  • @BakiKocak 我升级Android版本后,这个bug似乎自行解决了。
  • 同样的问题,到目前为止,仅在我测试过的 5 种不同设备中的 Galaxy Note 10+ 上出现。您在哪台设备上遇到过这个问题,您将它升级到了哪个 Android 版本?
  • @user1032613 我已经使用 WebRTC v1.0.32006 在带有 Android 10 的 S10 和带有 Android 11 的 Pixel 4 上进行了测试
  • 我也有同样的问题。有人有解决办法吗?

标签: android webrtc


【解决方案1】:

这是 Camera2 api 的问题。即使设备支持 Camera2,我也使用 camera1 api 解决了这个问题

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 2020-10-04
  • 2016-12-31
  • 2020-11-14
  • 2020-07-23
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多