我正在使用Camera2 api制作Android应用。
我希望能够在前后摄像头之间切换,但无论我如何尝试实现它,都需要花费大量的时间。
根据我的理解,你不能同时打开两个摄像头(我也试过了),所以你必须在打开第二个之前停止第一个。
问题是我需要1.5秒才能停止第一台摄像机。
例如,Snapchat如何设法在几百毫秒内交换相机?
我使用的代码是来自谷歌的camera2basic,可以在这里找到:
我添加了一种停止相机的简单方法:
public void stopCamera(){
Log.i("yoyo","Stopcamera() begin");
mCameraDevice.close();
//stopBackgroundThread();
Log.i("yoyo","Stopcamera() end");
}
Android监视器:
08-01 15:13: 01.478 10020-10020 / com.example.android.camera2basic I / yoyo: Stopcamera()开始 08-01 15:13: 02.852 10020-10020 / com.example.android.camera2basic I / yoyo: Stopcamera()结束 08-01 15:13:02.853 10020-10020 / com.example.android.camera2basic I / Choreographer:跳过81帧!应用程序可能在其主线程上做了太多工作。 08-01 15:13:02.855 10020-10207 / com.example.android.camera2basic I / yoyo: Cameradevice - onClosed()回调运行
-UPDATE 07 aug 2017 -
看起来camera2 api的关闭时间比旧的相机api要长。
我尝试使用旧的相机api,我达到了与Snapchat / instagram相同的速度,所以我猜他们正在使用旧的相机api。
答案 0 :(得分:0)
您应该能够同时运行两个捕获会话。你甚至可以同时拥有"预览"在UI上同时。
这是你要做的事情:
cameraManager.openCamera("1", ...)
cameraManager.openCamera("2", ...)
cameraDevice1.createCaptureSession(surface1, ...)
cameraDevice1.createCaptureSession(surface2, ...)
captureSession.setRepeatingRequest(...)
。正如您所注意到的那样,从#34;刮擦"切换相机会产生巨大的开销。如果您只想一次显示一个预览。您仍然可以为每个摄像头调用openCamera()
,为每个摄像头调用createCaptureRequest
,并使用setRepeatingRequest
或stopRepeating
来控制captureSession实际处理帧的时间。
希望这有帮助!
答案 1 :(得分:0)
William Guedes
以下是您必须做的事情:
创建设备1(即后置摄像头) cameraManager.openCamera(“1”,...)
创建设备2(即前置摄像头)cameraManager.openCamera(“2”,...)
我在下面写了一些简单的代码,用于使用manager.openCamera()打开两个摄像头。
虽然监视器只记录“摄像机0 onOpened()回调”,但我认为这样你只能打开一台摄像机吗?
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("yoyo", "onCreate() begin");
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
String[] cameraIdList = manager.getCameraIdList();
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 123);
return;
}
manager.openCamera(cameraIdList[0], new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
Log.e("yoyo", "camera 0 onOpened() callback");
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int i) {
}
}, null);
manager.openCamera(cameraIdList[1], new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice cameraDevice) {
Log.e("yoyo", "camera 1 onOpened() callback");
}
@Override
public void onDisconnected(@NonNull CameraDevice cameraDevice) {
}
@Override
public void onError(@NonNull CameraDevice cameraDevice, int i) {
}
}, null);
}catch (CameraAccessException e) {e.printStackTrace();}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 123) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
// close the app
Toast.makeText(this, "Sorry!!!, you can't use this app without granting permission", Toast.LENGTH_LONG).show();
finish();
}
}
}
}