Android MediaCodec 输出格式:GLES 外部纹理 (YUV/NV12) 到 GLES 纹理 (RGB)

2024-02-21

我目前正在尝试在 Android 上开发一个视频播放器,但在颜色格式方面遇到了困难。

Context:我通过以下标准组合提取和解码视频媒体提取器/媒体编解码器。因为我需要提取的帧可用作 OpenGLES 纹理 (RGB),我设置了我的解码器(媒体编解码器)以便它提供外部 GLES 纹理(GL_TEXTURE_EXTERNAL_OES)通过 SurfaceTexture。我知道我的硬件解码器输出的数据位于NV12 (YUV420 半平面)格式,我需要通过渲染将其转换为 RGB(使用片段着色器进行转换)。

MediaCodec ---> GLES 外部纹理 (NV12)[1]---> 渲染 ---> GLES 纹理 (RGB)

我挣扎的点是:如何访问 GLES 外部纹理中包含的特定 Y、U 和 V 值([1])。我不知道 GLES 纹理内存是如何设置的,也不知道如何访问它(“texture()”和“texelFetch()”GLSL 函数除外)。

  • 有没有一种方法可以像访问简单数组(指针+偏移量)一样访问数据?
  • 是不是我想太多了?
  • 做任一Surface or 表面纹理照顾转换? (我不这么认为)
  • 做任一Surface or 表面纹理填充 GLES 外部纹理时更改数据的内存布局([1])所以可以通过 GLES 纹理访问函数来访问组件?

是的,我想说你想太多了。您是否测试过并遇到了可以描述的实际问题,或者到目前为止这只是理论上的?

即使原始解码器本身输出 NV12,当您通过SufaceTexture- 然后你就可以将它作为任何 RGB 纹理来访问。由于纹理的物理内存布局是隐藏的,因此您实际上并不知道在获取纹理之前它是否实际上一次全部转换,或者纹理访问器是否在每次采样时进行即时转换。据我所知,实现可以自由地以任何这些方式完成,并且有关如何完成的实现细节根本无法通过公共 API 观察到。

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

Android MediaCodec 输出格式:GLES 外部纹理 (YUV/NV12) 到 GLES 纹理 (RGB) 的相关文章

  • 未捕获的 ReferenceError: myFunction 未在 null:1 处定义 Web 视图中的 Android 异常

    我正在从活动中调用 javascript 函数 但我得到了Uncaught ReferenceError myFunction is not defined at null 1错误 这是我的文件 MainActivity java pack
  • 使用 android 将图像上传到 Flickr

    我需要将 Flickr 与 android 集成 我已完成身份验证 我需要将图像上传到 flickr 但我不知道如何执行相同操作 我参考文件 http www flickr com services api upload api html
  • 如何创建没有标题的DialogFragment?

    我正在创建一个 DialogFragment 来显示一些有关我的应用程序的帮助消息 除了一件事之外 一切都工作正常 窗口顶部有一条黑色条纹 显示 DialogFragment 我认为它是为标题保留的 我不想使用它 这是特别痛苦的 因为我的自
  • 从ndk中的不同线程调用java方法

    我正在尝试使用 android 的 NDK 从 C 中的独立线程调用 java 静态方法 到目前为止我已经 JNIEnv env AttachJava jclass cls2 env gt FindClass com actvt showd
  • 将 React Native 应用程序嵌入到现有的 ios/android 应用程序中

    我需要知道是否可以在现有的 ios android 应用程序中 嵌入 一个 React Native 应用程序 而不共享 React Native 应用程序代码 我们目前有一个 React Native 应用程序 它使用一些插件依赖项 并被
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count
  • Gradle 构建过程失败

    我的项目正在成功构建 突然我在 Android studio 中收到以下错误 无法找到方法 org gradle api publish maven internal publication MavenPublicationInternal
  • MyGestureDetector 扩展了 SimpleOnGestureListener

    我正在实现一个扩展 SimpleOnGestureListener 的 MyGestureDetector 我从以下机构借了课程 http www codeshogun com blog tag view flipper http www
  • Ionic 4:硬件后退按钮重新加载应用程序

    从事项目并陷入问题 硬件后退按钮重新加载应用程序 我在此应用程序中使用 Angular Router 我退出应用程序的代码 ionViewDidEnter this subscription this platform backButton
  • 如何以编程方式关闭画中画

    我在使用画中画模式时遇到了这个问题 当从 PIP 本身以外的其他位置再次打开 Activity 时 我想关闭 PIP 画中画 不是来自关闭按钮 我想要与 youtube 相同的场景 即当用户单击 PIP 画中画 时 它会打开相同的活动 但是
  • android gradle插件-离线安装

    我必须在离线电脑上安装 android gradle 插件 通过谷歌搜索 我了解到我可以通过本地 Maven 存储库来做到这一点 但从不成功的尝试和所有关于这个问题的质量保证中我知道这并不简单 我从来没有和maven一起工作过 有经验的人可
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • 如何在捆绑中存储稀疏数组

    我有一个SparseArray
  • 通知管理器所需的权限

    我正在尝试使用以下命令将振铃器设置为静音且请勿打扰优先级 AudioManager myAudioMgr AudioManager context getSystemService Context AUDIO SERVICE Notific
  • 谷歌地图URL中参数的含义是什么

    我正在 Android 上使用 Webkit 浏览器 我想在以下 URL 中获得一个红色 A 符号
  • 调用外部应用程序

    如何从我的应用程序调用外部应用程序 例如 我需要打电话Shazam 应用程序 来自我的应用程序 我可以在应用程序的包名称中看到logcat 这对任何目的都有用吗 特别是对于 Shazam 以下代码有效 Intent intent new I
  • AsyncTask的并行执行

    An 异步任务单击时执行 List
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐