【发布时间】:2016-06-07 18:00:45
【问题描述】:
我正在尝试了解表面对表面方法如何与 MediaCodec 配合使用。在仅 ByteBuffer 的方法中,解码的数据放置在 OutputBuffers 中。可以手动处理这些未编码的数据,然后将其传递给 Encoder 的 InputBuffers。
如果我们看一个来自 Android MediaCodec CTS 的示例,它使用表面到表面的方法在解码器和编码器之间传递数据,我们将解码器配置为将解码后的数据输出到名为 outputSurface 的表面上,我们配置用于在称为 inputSurface 的 Surface 上接收数据的编码器。
在文档中,在Encoder的配置中createInputSurface和这个surface的使用是这样描述的:
createInputSurface():请求 Surface 用作编码器的输入,代替输入缓冲区。
换句话说,这在 CTS 示例中的 ByteBuffers 声明中可见:编码器没有 InputBuffers。你有:
- DecoderInputBuffers(从 MediaExtractor 接收视频轨道样本)
- DecoderOutputBuffers(输出拉取解码的 yuv 帧)
- 什么都没有。 (嗯...输入表面。)
- EncoderOutputBuffers(输出以拉取重新编码的内容以传递给复用器)
您无需在 Encoder InputBuffers 中排队数据,而是使用以下代码行:
outputSurface.awaitNewImage();
outputSurface.drawImage();
inputSurface.setPresentationTime(videoDecoderOutputBufferInfo.presentationTimeUs * 1000);
inputSurface.swapBuffers();
Decoder 的 ouputSurface 内容是如何传递给 Encoder 的 inputSurface 的?幕后具体发生了什么?
【问题讨论】:
标签: android android-mediacodec surface