Android在两个进程之间共享SurfaceTexture

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(

是否可以在两个流程(例如活动和服务)之间共享SurfaceTexture

我想创建一个带有TextureView的活动,并从单独的服务更新其SurfaceTexture

到目前为止,我正在使用生成的OpenGL纹理(通过glGenTextures)创建一个SurfaceTexture,然后将此表面纹理设置为我的TextureView:

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访问纹理,但我认为这不会跨过程工作


有关系统工作方式的更多详细信息,请参见。

酷谢谢您的解释,我确实想知道是否使用曲面视图是我唯一的选择,您确认了这一点。