- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是否可以在两个进程之间共享 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/
在 onPause 中,我使用 mTextureView.getSurfaceTexture() 将 surfaceTexture 存储到类变量 mTextureViewSurface 在 onRes
我可以渲染 YUVI420框架上 GLSurfaceView使用 openGL,但我的要求是在 SurfaceTexture 上渲染帧. 基本上我想为 SurfaceTexture 制作框架不像渲染到
只是一个简单的问题:我使用的着色器允许视频作为来自 SurfaceTexture 的 GL_TEXTURE_EXTERNAL_OES,但现在我想修改它以接受来自两个不同 SurfaceTexture
我是这里和 android 的新手 :)我有一个 android 应用程序,它正在从相机接收帧并尝试处理它们(也使用 OpenCv 查找特定颜色)。我使用 SurfaceTexture setPrev
我正在使用 Exoplayer 和 GL SurfaceTexture(来自 TextureView)来显示视频。我在视频播放中重复使用相同的表面。 我释放播放器并实例化一个新播放器。第二次显示 Su
是否可以在两个进程之间共享 SurfaceTexture,例如 Activity 和 Service? 我想创建一个带有 TextureView 的 Activity,并从一个单独的服务更新它的 Su
我想在通过 setPreviewTexture 连接到 Camera 的 SurfaceTexture 上绘图。我可以通过 SurfaceTextureListener 获取 SurfaceTextu
我正在使用 SurfaceTexture 绘制相机预览,需要知道纹理的大小 + 过程中发生的情况。 假设设备支持的相机预览尺寸为: 1280 720、1024 576、960 720、800 600、
我正在我的应用程序中实现 SurfaceTexture.OnFrameAvailableListener 接口(interface),因此我可以将视频帧用作 OpenGL 纹理。一切都按应有的方式设置
当我将视频解码到表面时,我想将我想要的帧保存为位图/jpeg 文件。我不想在屏幕上绘图,只想将 SurfaceTexture 的内容保存为图像文件。 最佳答案 你必须渲染纹理。 如果它是普通纹理,并且
是否可以使用 MediaCodec API 解密和解码数据? 我想解密和解码由 Widevine 或其他 DRM 机制加密的数据。 我想尝试的基本事情是 我使用从 SurfaceTexure 创建的
实际上我正在尝试在不显示预览的情况下拍照。为此,我想出了 SurfaceTexture,但我想知道表面纹理中的 texName 是什么以及它的用途是什么? //c is camera instance
我正在执行需要双 channel 渲染的视频效果(纹理需要通过多个着色器程序)。将 SurfaceTexture 附加到构造函数中传递的 GL_TEXTURE_EXTERNAL_OES 似乎不是解决方
更新:问题是关于 Camera2 当在 SurfaceTexture 上绘制相机预览时,我试图找出谁应用了旋转变换。 当从相机请求预览尺寸时,您总是会得到宽度大于高度的对(因为横向是拍照时的通常方向)
SurfaceTexture 是否在手动创建时默认附加到 GLContext?如果是,怎么办? 这是一个示例,我正在尝试创建自己的 SurfaceTexture 并将其设置为 TextureView:
我从 Grafika 示例开始,我想用 GlRenderView 渲染相机预览。我的问题是如何修改从 surfacetexture 获得的变换矩阵,以便像使用设备前置摄像头一样获得镜像视频预览: mD
我想在类似于 this answer 的设置中创建一个带有我可以管理的 OpenGL 纹理的 SurfaceTexture . (此处引用:) Create a texture through Ope
我想将相机预览 SurfaceTexture 与一些覆盖纹理混合。我正在使用这些着色器进行处理: private final String vss = "attribute vec2 vPositio
我正在使用带有 TextureView 子级的 ListView。 TextureView 使用 MediaPlayer 播放视频。当 TextureView 被回收时,最后一帧保留在表面上,直到下一
我想使用 Android 3.0 在 XOOM 上将视频播放到 OpenGL 纹理中。我在 API 11 中添加的 goole 开发人员文档中遇到了 SurfaceTexture http://dev
我是一名优秀的程序员,十分优秀!