我正在研究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提供的课程。
我无法使用上述代码切换相机。
如果还有其他方法,请指导我。
答案 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();
}