MediaCodec 和 TextureView 的 Z 顺序问题

2024-03-31

在我的 Android 应用程序中,我需要使用以下 Z 顺序渲染三个视图:

  1. 在底部,输出表面MediaCodec解码器覆盖整个屏幕。我有一个要求,我必须转换生成的图像MediaCodec(例如缩放)
  2. 中间有一个GLSurfaceView(或我定义的其他运行 GL 着色器的表面/视图),覆盖整个屏幕。显然,该层中的一些像素将是透明的,以便看到MediaCodec输出在下面。
  3. 最重要的是,任何其他视图 - 比如说ImageView。不确定我是否需要这些最顶层视图的透明度,也许完全不透明的矩形视图就可以 - 它们只是不会覆盖整个屏幕并且会四处移动。

看起来这是不可能的,但也许我错过了一些东西,或者有一种方法可以在较低级别上付出更多努力来做到这一点(例如 EGL 上下文或类似的东西......我目前不理解)。

我无法让它发挥作用并担心这是不可能的原因是:

  • 对于底部MediaCodec输出层(1),我必须能够转换图像。因此,我给 MediaCodec 渲染的表面必须来自TextureView
  • 为了能够透过中间的透明像素看到GLSurfaceView(2)、我得打电话GLSurfaceView.setZOrderOnTop(true)。否则 GLSurfaceView 是不透明的。
  • 但打电话GLSurfaceView.setZOrderOnTop(true)意味着没有其他视图 (3) 渲染在GLSurfaceView。例如。一个ImageView总是出现在不透明像素的后面GLSurfaceView.

看起来像打电话GLSurfaceView.setZOrderMediaOverlay(true)代替GLSurfaceView.setZOrderOnTop(true)旨在解决这个问题并促进这种类型的 Z 排序。如果是最底层的MediaCodec输出层是一个SurfaceView。但我需要它成为TextureView所以我可以改变它。和GLSurfaceView.setZOrderMediaOverlay(true)当有一个时似乎不起作用TextureView在它下面:TextureView完全被中间遮挡GLSurfaceView层而不是通过透明像素显示。

这种 Z 排序是不可能的,对吗?或者可以通过搞乱 EGL 和上下文等来完成吗?


EGL 上下文在这里并不真正相关。您的战斗是与 SurfaceFlinger 和视图系统进行的。

如果你跑adb shell dumpsys SurfaceFlinger您可以看到系统合成器知道的所有层的完整列表。如果您正在播放 320x240 的视频SurfaceView,它看起来像这样(为简洁起见,删除了几列和许多其他内容):

    type    |          source crop              |           frame           name 
------------+-----------------------------------+--------------------------------
        HWC | [    0.0,    0.0,  320.0,  240.0] | [   48,  411, 1032, 1149] SurfaceView
        HWC | [    0.0,   75.0, 1080.0, 1776.0] | [    0,   75, 1080, 1776] com.android.grafika/com.android.grafika.PlayMovieSurfaceActivity
        HWC | [    0.0,    0.0, 1080.0,   75.0] | [    0,    0, 1080,   75] StatusBar
        HWC | [    0.0,    0.0, 1080.0,  144.0] | [    0, 1776, 1080, 1920] NavigationBar
  FB TARGET | [    0.0,    0.0, 1080.0, 1920.0] | [    0,    0, 1080, 1920] HWC_FRAMEBUFFER_TARGET

这些层按 Z 顺序排列,从后到前。 SurfaceView 的表面层位于后面,应用程序 UI 层位于其之上,系统状态 + 导航栏位于所有内容之上。

应用程序视图层次结构中的所有内容都呈现在单个层上。包括TextureView。您无法控制其相对于其他硬件合成层的 Z 顺序。

SurfaceView很奇特的是,视图部分只是一个透明的占位符,而真正的操作发生在那个单独的层上,你可以控制它的 Z 顺序(一点点)。您可以将其分为三个不同的级别:

  • “媒体”(默认)
  • “媒体覆盖”
  • (应用程序用户界面在这里)
  • “面板”(ZOrderOnTop)

所以你想做的就是把你的MediaCodec默认层的输出,以及“媒体覆盖”层的 GLES 输出。你需要用SurfaceView.

从这里很难提供更好的建议,因为您描述了尝试解决方案时遇到的问题,而不是您试图解决的问题(即您正在构建什么?),但我可以提供一些建议。

首先你can缩放 SurfaceView。如果您查看上面的 dumpsys 输出,您会注意到“SurfaceView”行的源裁剪矩形为 320x240(视频的大小),目标矩形为 984x738。这是来自格拉菲卡的 https://github.com/google/grafika“播放视频 (SurfaceView)”,它调整 SurfaceView 的大小以保留视频的 4:3 宽高比。 SurfaceFlinger 负责缩放内容以匹配视图。

其次,如果您不显示受 DRM 保护的视频内容,您可以将其发送至SurfaceTexture当您渲染其他所有内容时,只需使用 GLES 渲染它即可。 (这正是TextureView确实如此,这就是为什么它需要硬件加速。)参见例如Grafika 中的“连续捕捉”。

Update:可以在以下位置找到更长的描述Android系统级图形文档 http://source.android.com/devices/graphics/architecture.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MediaCodec 和 TextureView 的 Z 顺序问题 的相关文章

  • 为什么 cordova.file.documentsDirectory 为空?

    我正在尝试使用 cordova plugin file transfer 在http ngcordova com docs plugins fileTransfer http ngcordova com docs plugins fileT
  • 处理 Android 锁屏上的音量变化?

    我想做的是 能够在 android 4 4 上的锁屏上捕获音量增大 减小按钮操作 Google Cast 设计清单 https developers google com cast docs design checklist sender
  • 使用 GoogleServices 插件时忽略 Gradle ArchivesBaseName

    我经常使用 archivesbasename 来重命名我的输出 apk 但自从使用 google services 插件后 它就被忽略了 我能做些什么来让它再次工作吗 下面附上了我完整的 build gradle 感谢您的指点 apply
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • Android向后兼容技术

    我现在在开发基于最新 API 15 ICS 的 15 项活动 Android 应用程序方面取得了进展 现在我发现应用程序的主要功能主义者即使支持 android v4 也不向后兼容 例如 1 fragment事务动画 2 将StringSe
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 导航组件参数默认值

    在导航组件中 将参数从第一个片段发送到第二个片段时 默认值不会从导航图中获取哪个集合 这是我的代码 导航图 xml
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • 无法在云控制台中启用 Maps SDK for Android

    我在云控制台中启用适用于 Android 的 Maps SDK 时遇到此问题 https console cloud google com https console cloud google com 它会抛出以下错误 附截图 我收到错误消
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • 更改 Android 中的媒体音量?

    我可以更改媒体音量吗 如何 到目前为止我用过这个 setVolumeControlStream AudioManager STREAM MUSIC 但有一个搜索栏并且想要更改媒体音量 而不是铃声音量 那么有人可以告诉我如何更改媒体音量onC
  • Android 消费品:“已经拥有该商品”,但 inventory.hasPurchase() 为 false

    我被 Google In App v3 困住了 我测试了一次没有消费的购买 例如 当应用程序在购买和消费之间崩溃时 现在我找不到出路 如果我尝试再次购买 它会显示 您已经拥有该商品 但是当我测试所有权时 它说我不拥有它 Inventory
  • Android - 多次实例化一个片段?

    我正在创建一个在 ListView 中显示数据的应用程序 数据分为两种类型 热门 收藏夹 我有一个活动和两个片段 片段根据类别显示项目列表 我为此使用了 ListView 然后我有两个fragment layouts 它们在设计上完全相同
  • 在 android 版本 7.0 上膨胀类 android.widget.DatePicker 时出错

    我想显示弹出日期选择器并且我使用此代码 Calendar mcurrentDate Calendar getInstance int mYear mcurrentDate get Calendar YEAR int mMonth mcurr
  • 使用后退按钮启动 Activity

    我正在 Android 中开发一个应用程序 我正在寻找解决方案 有一个活动 例如 A1 通过单击按钮 用户可以转到另一个活动 例如 A2 现在 一旦用户完成 A2 活动 他就会单击后退按钮 返回到上一个活动 A1 这是众所周知的事实 A1此
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 将 Crashlytics 集成到图书馆项目

    我有一个图书馆项目 自定义视图库项目 它没有任何活动 服务 我想将 Crashlytics SDK 集成到我的库中 当我尝试通过 Android Studio 的 Crashlytics 插件 工具栏中的图标 添加它时 它只是停留在 Che
  • 使用 RecyclerView.Adapter 在 onBindViewHolder() 内设置 onItemClickListener

    我有一个自定义对象 学生班 public class Student private String name private String age public String getName return name public void
  • 如何从灰度字节缓冲区图像创建位图?

    我正在尝试使用新的 Android 人脸检测移动视觉 API 来处理帧图像 所以我创建了自定义检测器来获取帧并尝试调用 getBitmap 方法 但它为空 所以我访问了帧的灰度数据 有没有办法从它或类似的图像持有者类创建位图 public
  • 如何检查设备上是否安装了文本转语音 (TTS) 的特定语言数据?

    我正在创建一个使用文本转语音的应用程序 我希望用户能够离线使用它 因此我检查设备上是否安装了 TTS 数据 以下是执行此操作的代码 Check tts data is installed Intent checkTTSIntent new

随机推荐

  • 在 Python 中迭代并从多维数组中选择特定数组

    想象一下我有这样的东西 import numpy as np arra np arange 16 reshape 2 2 4 这使 array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 我想创建一个沿着特定
  • JavaFX TextArea如何设置带有自动换行符的文本

    在我的应用程序中 我使用了两个Tabs 在第一个中我放置了一个HtmlEditor在第二个中我放置了一个TextArea HTML 选项卡是默认的 当用户创建 HTML 输入时 他可以切换到TextArea以便直接查看或更改 HTML 源代
  • Webpack 未加载 Vue 的单文件组件 CSS

    Webpack 正在编译单个文件组件 但不加载 CSS HTML 和 Vue 已正确呈现 但没有 CSS 看来是webpack配置的问题 知道出了什么问题吗 我在用着webpack dev server加载开发服务器 src index h
  • 是否有可能 - 在 Flutter Web 应用程序中插入 google AdSense?

    我尝试在我的网站上插入下一个代码 Google AdSense 但目前尚未成功 代码是 1 有一段时间我尝试了带有类似句子的 dart js js context callMethod 但是 认为它不起作用 因为我们需要展
  • Ocaml,用列表中的给定元素替换所有指定元素

    我正在编写一个 ocaml 项目 其中我有一个函数可以替换所有 在字符列表中 E 这是我的建议代码 let rec string lst change E lst match lst with gt let a E a h t if h g
  • 在 PAdES 第 4 部分的情况下,带有文档锁定的签名无效

    我遇到一个问题 我在 PAdES 第 4 部分的情况下设置了文档锁定功能 执行文档时间戳签名后签名无效 文档锁定功能的代码片段如下 PdfSigFieldLock pdfSigFieldLock new PdfSigFieldLock pd
  • 使用 PHP 发送带有 WSDL Soap 请求的 Soap 标头

    我对 SOAP 非常陌生 我正在尝试用 PHP 实现一个使用 ASP NET Web 服务的快速测试客户端 Web 服务依赖于包含授权参数的 Soap 标头 使用 WSDL 时是否可以将 auth 标头与肥皂请求一起发送 My code p
  • 拖动左上角时如何调整div大小?

    In CSS3 resize http www w3schools com cssref css3 pr resize asp 要调整大小的图标位于右下角 如何使其显示在左上角并使用户能够相应地调整大小 我发现了here http dev
  • 如何设置 AntiForgeryToken cookie 路径

    前者HtmlHelper AntiForgeryToken https msdn microsoft com en us library dd492243 28v vs 118 29 aspx方法允许人们重写string path已弃用 O
  • Android 列表视图中的卡片翻转

    我需要创建一个列表视图的视图 这应该是一个自定义列表 因为我希望列表中的每个项目都是一个图像视图 触摸时会翻转以显示详细信息 我正在根据 android 参考资料查看 Card Filp 视图 使用片段 但我觉得我错过了一些非常重要的东西
  • Python:点击字符串时从文本文件打印接下来的x行

    情况如下 我有一个 txt 文件 其中包含多次 nslookups 的结果 我想循环 tru 文件 每次遇到字符串 非权威答案 时 脚本都必须打印以下 8 行from那个位置 如果它有效 我应该在屏幕上得到所有积极的结果 首先我有以下代码
  • 获取当前日期(以毫秒为单位)(UTC)(不使用字符串)

    好吧 你可能认为这个问题已经被问过 但我认为还没有 我读过的解决方案都有这种 拼图游戏 技术 比如getUTCMonth getUTCMinutes 但由于我只想比较两个 UTC 日期之间经过的秒数 因此这不适用 众所周知 您可以通过以下方
  • AngularJs 无法在 module.run 中注入 $provide 和 $injector 服务

    我正在尝试在 angularjs 中动态定义服务 正如文档所说 provide https docs angularjs org api auto service 24provide and injector https docs angu
  • Java整数等于字符?

    如果这个问题有点简单 我很抱歉 但我有点困惑为什么我的教授会做出以下声明 请注意 read 返回一个整数值 使用 int 作为返回类型允许 read 使用 1 来指示它已到达流的末尾 您会记得在 Java 简介中 int 等于 char 这
  • 使用 ng-class 添加多个类

    警告 此线程适用于旧的 AngularJS 我们可以有多个表达式来添加多个 ng class 吗 for eg div div 如果是的话 任何人都可以举个例子来这样做 当不同的表达式求值时应用不同的类true div Hello Worl
  • Javafx 实时线程更新

    我同时使用 Javafx 和线程 我经常遇到这个问题 我制作一个按钮 然后当单击该按钮时 使用事件处理程序 我制作一个 for 循环 将按钮更改为 1 2 3 4 5 然后在每个中间延迟一秒钟 就像倒计时一样 但发生的情况是它延迟了 5 秒
  • 性能说明:预热后代码运行速度变慢

    下面的代码运行完全相同的计算 3 次 它没有做太多事情 基本上将 1 到 100m 之间的所有数字相加 前 2 个块的运行速度大约是第三个块的 10 倍 我已经运行这个测试程序超过 10 次 结果显示差异很小 如果有的话 我希望第三个块运行
  • 安装 Swashbuckle.AspNetCore 包后,Aspnet core 2.2 默认路由更改为“~/index.html”

    在我的 Asp net Core MVC 应用程序中安装 Swashbuckle AspNetCore 后 默认路由将被 index html 页面覆盖 我现在使用 的地方是将我的应用程序重定向到 index html 而不是默认的 MVC
  • 如何推断两个人之间的财产是兄弟

    我需要推断一个人是另一个人的兄弟 如果他们有同一个父亲 所以 如果我有这个 巴特有父亲荷马 丽莎有父亲荷马 Because Bart and Lisa有同一个父亲 我想推断 丽莎有弟弟巴特 有没有什么方法可以利用任何属性特征来做到这一点 使
  • MediaCodec 和 TextureView 的 Z 顺序问题

    在我的 Android 应用程序中 我需要使用以下 Z 顺序渲染三个视图 在底部 输出表面MediaCodec解码器覆盖整个屏幕 我有一个要求 我必须转换生成的图像MediaCodec 例如缩放 中间有一个GLSurfaceView 或我定