我有一个视频播放器,它使用
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);
视频帧通常具有不太方便图像处理的格式(YCbCr颜色空间、平面或半平面内存布局、色度子采样)。
通常您会首先将其转换为 RGB 图像。
您可以手动完成。搜索:“将 YUV 转换为 RGB”。请注意,您需要处理多种可能的输入格式。这也比较慢。
另一种方法是使用 SurfaceTexture 和 OpenGL ES 在 GPU 上进行处理。在这种情况下,颜色转换会自动发生,并且您会获得性能提升。但这需要编写一些设置代码并在 OpenGL 中实现图像处理算法。