[英]Android Camera2 api, Swap cameras quickly on the go
我正在使用Camera2 API开发一个Android应用。
我希望能够在前置和后置摄像头之间进行切换,但是无论我如何尝试实现,都需要花费大量时间。
根据我的理解,您无法一次打开两个摄像机(我也尝试过),因此您必须先停止第一个摄像机再打开第二个摄像机。
问题是我花了1.5秒停止了第一台相机。
例如,手套如何在几百毫秒内设法更换相机?
我使用的代码是Google的camera2basic,可以在这里找到:
我添加了一种简单的方法来停止摄像头:
public void stopCamera(){
Log.i("yoyo","Stopcamera() begin");
mCameraDevice.close();
//stopBackgroundThread();
Log.i("yoyo","Stopcamera() end");
}
Android Monitor:
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()回调正在运行
-更新2017年8月7日-
似乎camera2 api所需的关闭时间比旧的api更长。
我尝试使用旧的相机api,但达到了snapchat / instagram相同的速度,所以我猜他们正在使用旧的相机api。
您应该能够同时运行两个捕获会话。 您甚至可以同时在UI上同时拥有两个“预览”。
这是您要做的:
cameraManager.openCamera("1", ...)
创建设备1(即后置摄像头cameraManager.openCamera("1", ...)
cameraManager.openCamera("2", ...)
cameraDevice1.createCaptureSession(surface1, ...)
cameraDevice1.createCaptureSession(surface2, ...)
captureSession.setRepeatingRequest(...)
。 正如您所注意到的,从“临时”切换摄像头会有巨大的开销。 如果您只想一次显示一个预览。 您仍然可以为每个摄像机调用openCamera()
为每个摄像机调用createCaptureRequest
,并使用setRepeatingRequest
或stopRepeating
来控制何时捕获stopRepeating
实际在处理帧。
希望这可以帮助!
威廉·格德斯
这是您要做的:
使用cameraManager.openCamera(“ 1”,...)创建设备1(即后置摄像头)
创建设备2(即前置摄像头)cameraManager.openCamera(“ 2”,...)
我在下面编写了一些简单的代码,用于使用manager.openCamera()打开两个摄像机。
监视器仅记录“ camera 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();
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.