解码器的输出表面如何传递到编码器的输入表面?

2024-01-04

我试图了解表面到表面的方法如何与 MediaCodec 配合使用。在仅使用 ByteBuffer 的方法中,解码后的数据放置在 OutputBuffer 中。这些非编码数据可以手动处理,然后传递到编码器的输入缓冲区。

如果我们看一个 Android 的例子媒体编解码器 CTS https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java使用表面到表面的方法在解码器和编码器之间传递数据,我们配置解码器将解码后的数据输出到称为outputSurface的Surface上,并配置编码器以接收称为inputSurface的Surface上的数据。

在文档中,createInputSurface 以及该表面在编码器配置中的使用描述如下:

createInputSurface():请求 Surface 用作编码器的输入,代替输入缓冲区。

换句话说,这在 ByteBuffers 声明中的 CTS 示例中可见:编码器没有 InputBuffers。你有:

  • DecoderInputBuffers(从 MediaExtractor 接收视频轨道样本)
  • DecoderOutputBuffers(输出以拉解码的 yuv 帧)
  • 没有什么。 (嗯......输入表面。)
  • EncoderOutputBuffers(输出以拉动重新编码的内容以传递给复用器)

您无需将数据排队到编码器输入缓冲区中,而是使用以下代码行:

outputSurface.awaitNewImage();
outputSurface.drawImage();
inputSurface.setPresentationTime(videoDecoderOutputBufferInfo.presentationTimeUs * 1000);
inputSurface.swapBuffers();

Decoder的ouputSurface内容是如何传递到Encoder的inputSurface的?幕后具体发生了什么?


解码器/编码器的输出/输入Surface分别是一个特别配置的(任何一个物理上连续的 or reserved等)一块专门用于硬件的内存(例如,GPUs、硬件(加速)编解码器)或软件模块可以以最适合性能需求的方式使用(通过使用硬件加速、DMA 等功能)。

更具体地说,例如在当前上下文中,解码器的输出 Surface 由SurfaceTexture,这样它就可以用在OpenGL environment用作external在将纹理渲染到 Surface 上之前进行任何类型的处理,编码器可以从中读取和编码以创建最终的视频帧。

并非巧合的是,OpenGL 只能渲染到这样的Surface.

So the decoder充当provider原始视频帧的表面纹理) the carrier, OpenGL the medium将其呈现给编码器input Surface哪一个是目的地对于(要编码的)视频帧。

为了进一步满足您的好奇心,请检查使用 MediaCodec 编辑帧和编码 https://stackoverflow.com/questions/34932623/editing-frames-and-encoding-with-mediacodec更多细节。

[Edit]

您可以检查子项目grafika 连续相机 https://github.com/google/grafika/blob/master/src/com/android/grafika/ContinuousCaptureActivity.java or 显示+捕捉相机 https://github.com/google/grafika/blob/master/src/com/android/grafika/CameraCaptureActivity.java,当前将相机帧(馈送到 SurfaceTexture)渲染到视频(和显示器)。因此,本质上,唯一的变化是 MediaCodec 将帧传送到 SurfaceTexture,而不是相机。

谷歌CTS解码编辑编码测试 https://android.googlesource.com/platform/cts/+/kitkat-release/tests/tests/media/src/android/media/cts/DecodeEditEncodeTest.java完全相同,可以作为参考,以使学习曲线更加平滑。

从最基本的开始,正如 fadden 指出的那样,使用Android 图形教程 https://source.android.com/devices/graphics/architecture.html

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

解码器的输出表面如何传递到编码器的输入表面? 的相关文章

  • Firebase 管理 SDK Android

    在 Android 中初始化 Firebase Admin SDK 的代码 Override protected void onCreate Bundle savedInstanceState super onCreate savedIns
  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • 导航组件重复 NavArgs 的问题

    我有一个片段 class SomeFragment private val args by navArgs
  • 为什么将函数参数声明为最终的?

    我目前正在阅读 Sams 出版的 24 小时自学 Android 应用程序开发 一书 我对 Java Android 或其他方面还比较陌生 我对 ActionScript 3 有非常扎实的背景 它与 Java 有足够的相似之处 因此该语言本
  • 如何从 SQLite 获取记录总数

    我正在尝试从 Sqlite DB 获取行的总数 以下是我想要做的代码片段 我不知道我在这里做错了什么 public static int getTotalCount Context context Cursor c null try c g
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 从 Firebase 数据库填充微调器

    public class MainActivity extends AppCompatActivity DatabaseReference reference Spinner areaSpinner ArrayList
  • Android相机意图:如何获取全尺寸照片?

    我正在使用意图来启动相机 Intent cameraIntent new Intent android provider MediaStore ACTION IMAGE CAPTURE getParent startActivityForR
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐