gpt4 book ai didi

Android 在两个进程之间共享 SurfaceTexture

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:30:57 34 4
gpt4 key购买 nike

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

我想创建一个带有 TextureView 的 Activity,并从一个单独的服务更新它的 SurfaceTexture。

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

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

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

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

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

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

原因是我有一个单独的进程调用私有(private) api,需要 SurfaceTexture 来流式传输一些内容,并且这个进程是通过应用程序的 aidl 访问的。

谢谢

最佳答案

系统支持做你想做的事,但我不知道现在的公共(public)API是否可以。

确保我们在同一页面上的一些背景...

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

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

您可以将从 SurfaceView 或 SurfaceTexture 获得的 Surface 传递给产生输出的对象,例如相机预览或 MediaCodec 解码器。在引擎盖下,这些通过 IPC 将 Surface 传递到 mediaserver 进程。随着帧的产生,图形缓冲区通过引用传递给消费者。 SurfaceFlinger 显示它从 SurfaceView 获得的帧,SurfaceTexture 只是将它们转换为纹理。

因此,您要做的是在应用程序中创建一个 SurfaceTexture,为其构造一个 Surface,然后将该 Surface 传递给您的服务。您的服务会生成帧并将它们写入 Surface,Surface 会通过 IPC 将它们发送给您应用中的 SurfaceTexture 使用者,后者会将它们转换为 GLES 纹理。

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

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

有关系统工作方式的更多详细信息,请参阅 architecture doc .

关于Android 在两个进程之间共享 SurfaceTexture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33222621/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com