gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:44 25 4
gpt4 key购买 nike

我正在尝试了解表面对表面方法如何与 MediaCodec 配合使用。在仅使用 ByteBuffer 的方法中,解码后的数据放在 OutputBuffers 中。这种非编码数据可以手动处理,然后传递给编码器的 InputBuffers。

如果我们看一个来自 Android 的例子 MediaCodec CTS使用表面到表面的方法在解码器和编码器之间传递数据,我们将解码器配置为将解码后的数据输出到称为 outputSurface 的表面上,并将编码器配置为在称为 inputSurface 的表面上接收数据。

在文档中,createInputSurface 和这个表面在编码器配置中的用法是这样描述的:

createInputSurface(): Requests a Surface to use as the input to an encoder, in place of input buffers.

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

  • DecoderInputBuffers(从 MediaExtractor 接收视频轨道样本)
  • DecoderOutputBuffers(输出以拉取已解码的 yuv 帧)
  • 没有。 (好吧……输入表面。)
  • EncoderOutputBuffers(将重新编码的内容输出到 muxer)

您没有在编码器 InputBuffers 中排队数据,而是使用以下代码行:

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

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

最佳答案

解码器/编码器的输出/输入表面分别是一个特殊配置(物理连续保留等)专用硬件(例如,GPU、硬件(加速)编解码器)或软件模块可以以最适合性能需求的方式使用的一 block 内存(通过使用硬件加速、DMA 等功能等)。

更具体地说,例如在当前上下文中,解码器的输出 Surface 由 SurfaceTexture 支持,因此它可以在 OpenGL 环境 中用作一个外部纹理,用于在表面上渲染之前进行任何类型的处理,编码器可以从中读取和编码以创建最终视频帧。

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

因此,解码器充当原始视频帧的提供者表面(纹理)载体 , OpenGL medium 将其渲染到编码器的输入 Surface 这是目的地 用于(待编码的)视频帧。

为了进一步满足您的好奇心,请检查 Editing frames and encoding with MediaCodec了解更多详情。

[编辑]

您可以在grafika中查看子项目Continuous CameraShow + capture camera ,当前将相机帧(馈送到 SurfaceTexture)渲染到视频(和显示)。所以本质上,唯一的变化是 MediaCodec 将帧馈送到 SurfaceTexture 而不是 Camera。

谷歌 CTS DecodeEditEncodeTest完全相同,可以作为引用,使学习曲线更平滑。

从最基础的开始,正如 fadden 指出的那样使用 Android graphics tutorials

关于android - 解码器的输出表面如何传递到编码器的输入表面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35619223/

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