Android在两个进程之间共享SurfaceTexture
是否可以在两个流程(例如活动和服务)之间共享SurfaceTexture 我想创建一个带有TextureView的活动,并从单独的服务更新其SurfaceTexture 到目前为止,我正在使用生成的OpenGL纹理(通过glGenTextures)创建一个SurfaceTexture,然后将此表面纹理设置为我的TextureView:Android在两个进程之间共享SurfaceTexture,android,android-service,aidl,textureview,Android,Android Service,Aidl,Textureview,是否可以在两个流程(例如活动和服务)之间共享SurfaceTexture 我想创建一个带有TextureView的活动,并从单独的服务更新其SurfaceTexture 到目前为止,我正在使用生成的OpenGL纹理(通过glGenTextures)创建一个SurfaceTexture,然后将此表面纹理设置为我的TextureView: mSurfaceTexture = new SurfaceTexture(texture_id); mTextureView.setSurfaceTexture(
mSurfaceTexture = new SurfaceTexture(texture_id);
mTextureView.setSurfaceTexture(mSurfaceTexture);
在“活动”上显示此SurfaceTexture的摄影机预览效果良好:
mCamera = Camera.open();
mCamera.setPreviewTexture(mTextureView.getSurfaceTexture());
mCamera.startPreview();
我也希望这样做,但是从一个单独的服务,将纹理id传递给它,类似于:
mCamera = Camera.open();
mCamera.setPreviewTexture(new SurfaceTexture(texture_id));
mCamera.startPreview();
原因是我有一个单独的进程调用一个私有api,它需要一个SurfaceTexture来流式传输一些内容,这个进程是通过应用程序的aidl访问的
谢谢系统支持您想做什么就做什么,但我不知道使用当前的公共API是否可行 一些背景,以确保我们在同一页上 曲面是生产者-消费者对的生产者侧。通过SurfaceTexture,应用程序可以访问两端。渲染到SurfaceTexture曲面的任何内容都将转换为OpenGL ES“外部”纹理 媒体和显示API的工作方式是让消费者创建一对,然后将表面交给应用程序。这就是为什么,如果您创建了SurfaceView,则在触发
surfaceCreated()
回调之前,您无法使用该曲面——BufferQueue对象由系统图形合成器(SurfaceFlinger)创建,并且生产者端通过绑定器IPC传递到您的应用程序。通过mediaserver
过程创建的MediaCodec编码器的表面输入也是如此
您可以将从SurfaceView或SurfaceTexture获得的曲面传递到生成输出的对象,例如摄影机预览或MediaCodec解码器。在引擎盖下,这些通过IPC将表面传递到mediaserver
进程。当产生帧时,图形缓冲区通过引用传递给使用者。SurfaceFlinger显示它从SurfaceView获得的帧,SurfaceTexture只是将它们转换为纹理
因此,您要做的是在应用程序中创建一个SurfaceTexture,为其构建一个曲面,然后将该曲面传递给您的服务。您的服务将生成帧并将其写入Surface,然后通过IPC将其发送到应用程序中的SurfaceTexture使用者,后者将其转换为纹理
我还没有尝试通过AIDL通过曲面,所以我不知道它是否真的有效
在进程之间传递纹理ID将不起作用。如果在创建第二个EGLContext时将第一个上下文作为参数传递,则可以从两个不同的EGLContext访问纹理,但我认为这不会跨过程工作
有关系统工作方式的更多详细信息,请参见。酷谢谢您的解释,我确实想知道是否使用曲面视图是我唯一的选择,您确认了这一点。