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

Posted

技术标签:

【中文标题】在pjsip android中从前到后切换相机【英文标题】:Switching camera from front to back in pjsip android 【发布时间】:2016-04-08 05:04:45 【问题描述】:

我正在开发 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就好了 您好,我也在寻找相同的解决方案,到目前为止运气好吗? 【参考方案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();
    

【讨论】:

以上是关于在pjsip android中从前到后切换相机的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中,是不是可以更改相机(从前到后)并仍然继续录制?

无法使用 webrtc MediaDevices 在反应应用程序中切换摄像头(从前到后)

使用 AVFoundation 切换相机时显示红色状态栏

切换相机后音频/视频不同步

如何限制插件在android / cordova中切换后置/后置摄像头

Wowza/WebRTC - 如何在相机翻转时重新协商视频格式