Android MediaCodec 的 getOutputImage() 返回只读图像

问题描述 投票:0回答:1

我有一个视频播放器,它使用

MediaCodec
将帧渲染到表面,就像 here 所建议的那样,并且它可以工作。我需要对帧进行一些处理并在渲染它们之前更改它们的像素。但 getOutputImage() 返回只读图像。那么我怎样才能改变像素数据呢?

安卓。媒体。 Image getOutputImage( int index ) 返回一个 出列输出缓冲区索引的只读 Image 对象 包含原始视频帧。调用该方法后,任何 先前为相同输出返回的 ByteBuffer 或 Image 对象 必须不再使用索引。

这是我的片段:

                Image image = codec.getOutputImage(outputBufferIndex);
                if (image != null) {
                    applyCustomProcessing(image);
                    image.close();
                }

                SurfaceRenderer surfaceRenderer = (SurfaceRenderer) renderer;
                surfaceRenderer.render(mediacodec, outputBufferIndex, presentationTime);
android image-processing video video-streaming android-mediacodec
1个回答
0
投票

视频帧通常具有不太方便图像处理的格式(YCbCr颜色空间、平面或半平面内存布局、色度子采样)。

通常您会首先将其转换为 RGB 图像。

您可以手动完成。搜索:“将 YUV 转换为 RGB”。请注意,您需要处理多种可能的输入格式。这也比较慢。

另一种方法是使用 SurfaceTexture 和 OpenGL ES 在 GPU 上进行处理。在这种情况下,颜色转换会自动发生,并且您会获得性能提升。但这需要编写一些设置代码并在 OpenGL 中实现图像处理算法。

© www.soinside.com 2019 - 2024. All rights reserved.