我遇到了一些设置高速视频捕获请求的问题。我打算在Nexus 6P上以120 FPS的速度进行捕获。由于我不打算将此应用部署到任何其他手机上,所以我将最低API设置为23。
我还没有完全理解如何使我的捕获请求起作用。目前,我正在尽力更改谷歌样例中的Camera2Video示例代码。链接到Google样例 以下是所有相关代码:
我没有问题更新预览的代码。不幸的是,我遇到了困难,不知道如何给setRepeatingBurst设置我的捕获请求。我知道构造函数与示例的setRepeatingRequest不同。因此,我需要找到一种方式将我的surfaces,CONTROL_MODE请求和TARGET_FPS_RANGE请求传递给setRepeatingBurst。
任何帮助我弄清如何使其正确工作的建议都将非常有用。我在网上没有找到太多帮助,StackOverflow中也没有提到任何高速捕获功能的文章。我的最大问题是尝试理解createConstrainedHighSpeedCaptureSession如何提供CameraConstrainedHighSpeedCaptureSession会话,以便我可以使用createHighSpeedRequestList。
我还没有完全理解如何使我的捕获请求起作用。目前,我正在尽力更改谷歌样例中的Camera2Video示例代码。链接到Google样例 以下是所有相关代码:
private void startPreview() {
if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
return;
}
try {
setUpMediaRecorder();
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
List<Surface> surfaces = new ArrayList<Surface>();
Surface previewSurface = new Surface(texture);
surfaces.add(previewSurface);
mPreviewBuilder.addTarget(previewSurface);
Surface recorderSurface = mMediaRecorder.getSurface();
surfaces.add(recorderSurface);
mPreviewBuilder.addTarget(recorderSurface);
mCameraDevice.createConstrainedHighSpeedCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
//mCameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
//mPreviewSession = cameraCaptureSession;
mPreviewSession2 = cameraCaptureSession;
updatePreview();
}
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
Activity activity = getActivity();
if (null != activity) {
Toast.makeText(activity, "Failed", Toast.LENGTH_SHORT).show();
}
}
}, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Update the camera preview. {@link #startPreview()} needs to be called in advance.
*/
private void updatePreview() {
if (null == mCameraDevice) {
return;
}
try {
setUpCaptureRequestBuilder(mPreviewBuilder);
HandlerThread thread = new HandlerThread("CameraPreview");
thread.start();
mPreviewBuilder2 = mPreviewSession2.createHighSpeedRequestList(mPreviewBuilder.build());
//mPreviewBuilder2 =
//mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);
mPreviewSession.setRepeatingBurst(mPreviewBuilder2, null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch(Exception e){
e.printStackTrace();
}
}
private void setUpCaptureRequestBuilder(CaptureRequest.Builder builder) {
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
Range<Integer> fpsRange = Range.create(120, 120);
builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
}
我没有问题更新预览的代码。不幸的是,我遇到了困难,不知道如何给setRepeatingBurst设置我的捕获请求。我知道构造函数与示例的setRepeatingRequest不同。因此,我需要找到一种方式将我的surfaces,CONTROL_MODE请求和TARGET_FPS_RANGE请求传递给setRepeatingBurst。
/**
* Camera preview.
*/
private CaptureRequest.Builder mPreviewBuilder;
List<CaptureRequest> mPreviewBuilder2;
/**
* A reference to the current {@link android.hardware.camera2.CameraCaptureSession} for
* preview.
*/
private CameraCaptureSession mPreviewSession;
private CameraConstrainedHighSpeedCaptureSession mPreviewSession2;
任何帮助我弄清如何使其正确工作的建议都将非常有用。我在网上没有找到太多帮助,StackOverflow中也没有提到任何高速捕获功能的文章。我的最大问题是尝试理解createConstrainedHighSpeedCaptureSession如何提供CameraConstrainedHighSpeedCaptureSession会话,以便我可以使用createHighSpeedRequestList。