Android MediaCodec';Camera2会话不支持的永久输入表面?

Android MediaCodec';Camera2会话不支持的永久输入表面?,android,android-camera2,android-mediacodec,Android,Android Camera2,Android Mediacodec,我正在编写一个Android应用程序,它支持保存原始/JPEG格式,同时录制视频。创建CameraCaptureSession时,我尝试通过4个曲面:预览、2xImageSaver和1xPersistentiInputSurface由MediaCodec\createPersistentiInputSurface创建。通过使用持久输入曲面,我打算避免两次捕获之间的停顿 创建会话时失败,原因是: W/CameraDevice-JV-0: Stream configuration failed du

我正在编写一个Android应用程序,它支持保存原始/JPEG格式,同时录制视频。创建
CameraCaptureSession
时,我尝试通过4个曲面:预览、2x
ImageSaver
和1x
PersistentiInputSurface
MediaCodec\createPersistentiInputSurface
创建。通过使用持久输入曲面,我打算避免两次捕获之间的停顿

创建会话时失败,原因是:

W/CameraDevice-JV-0: Stream configuration failed due to: endConfigure:380: Camera 0: Unsupported set of inputs/outputs provided
Session 0: Failed to create capture session; configuration failed
我已尝试取出所有其他曲面,只留下
PersistentInputSurface
,但仍然失败

@覆盖
恢复时公开作废(){
super.onResume();
//其他一些设置。。。
if(persistentRecorderSurface==null){
persistentRecorderSurface=MediaCodec.createPersistentInputSurface();
}
startBackgroundThread();
startCamera();
if(mPreviewView.isAvailable()){
配置转换(mPreviewView.getWidth(),mPreviewView.getHeight());
}否则{
mPreviewView.setSurfaceTextureListener(mSurfaceTextureListener);
}
if(mOrientationListener!=null&&mOrientationListener.CanDetectorOrientation()){
MorentationListener.enable();
}
}
private void createCameraPreviewsionLocked(){
试一试{
SurfaceTexture纹理=mPreviewView.getSurfaceTexture();
setDefaultBufferSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());
表面=新表面(纹理);
mPreviewRequestBuilder=mBackCameraDevice.createCaptureRequest(
CameraDevice.模板(预览);
mPreviewRequestBuilder.addTarget(曲面);
mBackCameraDevice.createCaptureSession(Arrays.asList(
表面,
mJpegImageReader.get().getSurface(),
mRAWImageReader.get().getSurface(),
持久性cordersurface
),新的CameraCaptureSession.StateCallback(){
@凌驾
未配置公共void(CameraCaptureSession会话){
已同步(mCameraStateLock){
如果(mBackCameraDevice==null){
返回;
}
试一试{
Setup3ControlsLocked(mPreviewRequestBuilder);
session.setRepeatingRequest(mPreviewRequestBuilder.build(),
mPreCaptureCallback,mBackgroundHandler);
mState=CameraStates.PREVIEW;
}捕获(CameraAccessException |非法状态异常e){
e、 printStackTrace();
返回;
}
mSession=会话;
}
}
@凌驾
配置文件的公共无效(CameraCaptureSession){
showToast(“未能配置摄像头”);
}
},mBackgroundHandler);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}

在要确认的错误行之前查看系统日志行会很有帮助,但很可能:

在创建相机捕获会话之前,您需要将persistentRecorderSurface实际绑定到or,并对其调用prepare()

否则,在持久曲面的另一端实际上什么都没有,相机也无法分辨需要什么分辨率或其他设置


还请记住,根据摄像头支持的硬件级别和功能,您可以从摄像头获得多少并发输出是有限制的。不幸的是,目前没有要求设备必须支持您的输出组合(预览、录制、JPEG、原始),因此很可能许多或所有设备仍会给您一个错误。

谢谢,@Eddy Talvala。这解决了我的问题。尽管
prepare()
有太多的先决条件。例如,在用户按下“开始”按钮之前,无法确定方向提示。然而,当启动应用程序时,我被迫
prepare()
使用
MediaRecorder
,否则
persistentInputSurface
无法创建摄像头会话。另外,我将
ImageSaver
MediaRecorder
分开,因为它们会在不同的设备上产生意外的行为。