【问题标题】:Switching camera from front to back in pjsip android在pjsip android中从前到后切换相机
【发布时间】:2023-03-05 09:57:02
【问题描述】:

我正在开发 pjsip 视频通话应用程序。我想在通话中切换预览摄像头。

这是我正在尝试的代码。

private void switchCamera(boolean isFront) {
        try {
            int w = (int) SipCallService.currentCall.vidPrev.getVideoWindow()
                    .getInfo().getSize().getW();
            int h = (int) SipCallService.currentCall.vidPrev.getVideoWindow()
                    .getInfo().getSize().getH();
            if (isFront) {
                PjCamera camera = new PjCamera(0, w, h, 0, 0, 0,
                        mSurfaceCapture);
                camera.SwitchDevice(0);
            } else {
                PjCamera camera = new PjCamera(0, w, h, 0, 0, 0,
                        mSurfaceCapture);
                camera.SwitchDevice(1);
            }

        } catch (Exception e) {
            e.printStackTrace();
            showToast("Error while switching camera");
        }
    }

PjCamera 是 pjsip 提供的类。

我无法使用上述代码切换相机。

如果有其他方法,请指导我。

【问题讨论】:

  • 我相信你应该使用一个 PjCamera 实例并且只调用 SwitchDevice(0) 或 SwitchDevice(1)。但是在您的代码中还有另一个潜在问题:前置或后置摄像头可能不支持尺寸 (w,h)
  • @AlexCohn 你能帮我获取 PjCamera 的实例吗,我很难得到它。如果能在这里贴个代码sn-p就好了
  • 您好,我也在寻找相同的解决方案,到目前为止运气好吗?

标签: android android-camera surfaceview sip pjsip


【解决方案1】:

我使用此代码在前后摄像头之间切换。

    int cameraId = isFront? 1 :2;

    CallVidSetStreamParam callVidSetStreamParam = new CallVidSetStreamParam();
    callVidSetStreamParam.setCapDev(cameraId);
    try {
        sipCall.vidSetStream(pjsua_call_vid_strm_op.PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV, callVidSetStreamParam);
        result = true;
    } catch (Exception e) {
        e.printStackTrace();
    }

【讨论】:

  • 当我使用 pjsua_call_set_vid_strm 来改变 cap_dev。在切换相机期间需要大量时间并阻止所有连接。
【解决方案2】:

我从未使用过 pjsip 库,但通过查看他们的 source code,您的方法可以这样重写:

public class PjsipActivity extends Activity {

    PjCamera pjCamera;
    …
    void switchCamera(boolean isFront) {
        if (pjCamera == null) {
            int w = (int) SipCallService.currentCall.vidPrev.getVideoWindow()
                .getInfo().getSize().getW();
            int h = (int) SipCallService.currentCall.vidPrev.getVideoWindow()
                .getInfo().getSize().getH();
            pjCamera = new PjCamera(0, w, h, 0, 0, 0, mSurfaceCapture);
        }

        CameraInfo ci = new CameraInfo();
        for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
            Camera.getCameraInfo(i, ci);
            if (isFront && ci.facing == CameraInfo.CAMERA_FACING_FRONT ||
                !isFront && ci.facing == CameraInfo.CAMERA_FACING_BACK) {
                if (pjCamera.SwitchDevice(i) == 0) {
                    return;
                }
            }
        }
        showToast("Error while switching camera");
    }
}

请注意,此 sn-p 不解决预览大小问题。据我判断,PjCamera 不支持动态更改宽度和高度。视频窗口的大小可能应该在会话建立之前在两个对等点之间单独协商。如果前置摄像头或后置摄像头不支持此预览尺寸,SwitchDevice() 很可能会失败并返回代码 -30,但它也可能会崩溃或静默失败。

【讨论】:

  • 假设将相机从前切换到后。但它没有用。
  • 有什么症状?你得到吐司了吗?实时预览是否闪烁? LogCat 中是否有错误消息?
  • 我在 logcat 中没有得到任何东西。我什至没有看到错误吐司。所以基本上什么都没发生。
  • 你知道 sn-p 不会编译;我的代码中有错字。
  • 是的,我纠正了那个错字并尝试了。它没有效果。我在日志猫中什么都没有。没有崩溃
【解决方案3】:

这是在 PJSIP Android 前置摄像头 ID=1 中切换摄像头的最佳方法;后置摄像头 ID=2(在这种情况下仅支持这些 ID)。

 try {

    CallVidSetStreamParam callVidSetStreamParam = new CallVidSetStreamParam();
    callVidSetStreamParam.setCapDev(cameraId);
    currentCall.vidSetStream(pjsua_call_vid_strm_op.PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV, callVidSetStreamParam);

    } catch (Exception e) {
        e.printStackTrace();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 2015-05-04
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多