在pjsip android中从前到后切换相机

时间:2016-01-04 14:42:26

标签: android android-camera surfaceview sip pjsip

我正在研究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提供的课程。

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

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

3 个答案:

答案 0 :(得分:0)

我从未使用过 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");
    }
}

请注意,此代码段不能解决预览尺寸问题。据我所知,PjCamera不支持动态改变宽度和高度。视频窗口的大小应该在会话建立之前分别在两个对等体之间协商。如果前置摄像头或后置摄像头不支持此预览尺寸,SwitchDevice()很可能会因返回代码 -30 而失败,但它也可能会无声地崩溃或失败。< / p>

答案 1 :(得分:0)

我使用此代码在前/后相机之间切换。

    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();
    }

答案 2 :(得分:0)

这是在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();
    }