2016-01-04 5 views
4

Я работаю над приложением для видеосвязи pjsip. Я хочу переключить камеру предварительного просмотра в текущий вызов.Переключение камеры спереди назад в pjsip android

Вот код, который я пытаюсь.

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.

Я не могу переключить камеру, используя вышеуказанный код.

Если есть какой-либо другой способ, пожалуйста, направляйте меня к нему.

+0

Я считаю, что вы должны использовать один экземпляр PjCamera и только вызывать SwitchDevice (0) или SwitchDevice (1). Но в вашем коде есть еще одна потенциальная проблема: передняя или задняя камера может не поддерживать размер ** (w, h) **. –

+0

@AlexCohn не могли бы вы помочь мне получить экземпляр PjCamera, я вроде как нелегко его получить. Было бы очень приятно, если бы вы могли вставить фрагмент кода здесь – Manoj

+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, но он также может аварийно завершить работу или выйти из строя.

+0

не работал для меня, попробовал выше фрагмент. :-( – Manoj

+0

Что именно не сработало? –

+0

Предположим переключить камеру спереди назад. Но это не сработало. – Manoj

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(); 
    } 
Смежные вопросы