CameraX自定义Surface渲染预览无回调且无法正常工作的问题求助
CameraX自定义Surface渲染预览无回调且无法正常工作的问题求助
问题描述
我在Android中使用CameraX组件,根据官方文档可以通过Preview.setSurfaceProvider()设置渲染界面,但我不想使用PreviewView组件,而是想把相机预览渲染到自己自定义的Surface上。试了很多方法都没成功,希望大家能帮忙,谢谢!
自定义Surface的实现(Activity代码)
我通过GL纹理创建了自定义的Surface,具体代码如下:
Surface mPreviewSurfaces; private int textureIds = 0; public boolean InitTexture() { // 通过GL创建OES纹理ID int videoTextureId = FBOUtils.createOESTextureID(); textureIds = videoTextureId; if (mSurfaceTexture != null) { mSurfaceTexture.release(); } mSurfaceTexture = new SurfaceTexture(textureIds); TextureListenser listenser = new TextureListenser(); mSurfaceTexture.setDefaultBufferSize(1280, 720); mSurfaceTexture.setOnFrameAvailableListener(null); mSurfaceTexture.setOnFrameAvailableListener(listenser); mPreviewSurfaces = new Surface(mSurfaceTexture); return true; }
CameraX的配置与启动(Service代码)
我创建了一个Service来配置并启动CameraX,首先构建Preview实例:
Preview.Builder builder = new Preview.Builder(); builder.setTargetRotation(Surface.ROTATION_90); builder.setResolutionSelector(resolutionSelector); _PreviewUseCase = builder.build();
接着为Preview设置自定义的SurfaceProvider:
Surface mSurface = CameraXApp.get_Surface(); _PreviewUseCase.setSurfaceProvider(request -> { Size resolution = request.getResolution(); Log.d("Camera", "Requested resolution: " + resolution.getWidth() + "x" + resolution.getHeight()); if (mSurface != null && mSurface.isValid()) { Log.d("Camera", "surface....."); } assert mSurface != null; request.provideSurface( mSurface, ContextCompat.getMainExecutor(mActivity), result -> { Log.d(TAG, "surface complete"); } ); }); _CameraProvider.bindToLifecycle(/* lifecycleOwner= */ (LifecycleOwner)mActivity, _CurrentCameraSelector, _PreviewUseCase);
当前遇到的问题
程序能够正常运行,日志中可以看到Requested resolution和surface.....的输出,但surface complete的日志完全没有打印,也无法通过result获取到回调结果。之前使用_PreviewUseCase.setSurfaceProvider(R.id.PreviewView)时,预览是可以正常显示的,实在找不到问题所在,希望大家能给我一些排查方向或提示!
备注:内容来源于stack exchange,提问作者duan danny
相关产品推荐
相关产品推荐

