分享

Android在两个进程之间共享SurfaceTexture

 印度阿三17 2019-05-19

是否可以在两个进程之间共享SurfaceTexture,例如Activity和Service?

我想用TextureView创建一个Activity,并从一个单独的Service更新它的SurfaceTexture.

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

mSurfaceTexture = new SurfaceTexture(texture_id);
mTextureView.setSurfaceTexture(mSurfaceTexture);

在活动上显示此SurfaceTexture的相机预览正常工作:

mCamera = Camera.open();
mCamera.setPreviewTexture(mTextureView.getSurfaceTexture());
mCamera.startPreview();

我想做同样的事情,但是从一个单独的服务,将texture_id传递给它,类似于:

mCamera = Camera.open();
mCamera.setPreviewTexture(new SurfaceTexture(texture_id));
mCamera.startPreview();

原因是我有一个单独的进程调用私有api,需要SurfaceTexture来传输一些内容,并且可以通过应用程序中的aidl访问此进程.

谢谢

解决方法:

系统支持执行您想要的操作,但我不知道是否可以使用当前的公共API.

一些背景,以确保我们在同一页…

Surface是生产者 – 消费者对的生产者.使用SurfaceTexture,应用程序可以访问两端.渲染到SurfaceTexture曲面的任何内容都将转换为OpenGL ES“外部”纹理.

媒体和显示API的工作方式是让消费者创建对,然后将Surface交给应用程序.这就是为什么,如果你创建一个SurfaceView,你不能使用Surface,直到surfaceCreated()回调触发 – BufferQueue对象由系统图形合成器(SurfaceFlinger)创建,生产者端通过Binder IPC传递给你的应用.对于MediaCodec编码器的Surface输入也是如此,它们由mediaserver进程创建.

您可以将SurfaceView或SurfaceTexture获得的Surface传递给产生输出的东西,例如Camera preview或MediaCodec解码器.在引擎盖下,这些通过IPC传递到mediaserver过程.生成帧时,图形缓冲区通过引用传递给使用者. SurfaceFlinger显示从SurfaceView获取的帧,SurfaceTexture只是将它们转换为纹理.

所以你想要做的是在app中创建一个SurfaceTexture,为它构造一个Surface,并将Surface传递给你的服务.您的服务会生成帧并将它们写入Surface,这会将它们通过IPC发送到您应用中的SurfaceTexture消费者,这会将它们转换为GLES纹理.

我没有尝试通过AIDL传递Surface,所以我不知道它是否真的有效.

在进程之间传递纹理ID将不起作用.如果在创建第二个上下文时将第一个上下文作为参数传递,则可以从两个不同的EGLContex中访问一个纹理,但我不认为这可能会跨进程工作.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多