如何将MediaCodec的输出缓冲区转换为OpenCV Mat?

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

我正在开发一个应用程序,它可以读取视频文件并在处理每一帧(例如颜色转换)时播放。由于我是 Android 和媒体处理的新手,我无法配置如何做到这一点。

目前,我正在尝试使用 MediaCodec API 检索帧(图像),并使用 OpenCV 处理每个帧。 但是,我陷入了将输出缓冲区(ByteBuffer)转换为 OpenCV mat 的困境。

我该怎么做?或者,如果你们知道制作此类应用程序的更好方法,请给我建议。即使是一点小建议也将不胜感激。

android opencv media android-mediacodec
1个回答
0
投票

MediaCodec
输出的图像(视频帧)通常表示为平面或半平面
YCbCr
(通常称为 YUV)数据的缓冲区。

AFAIK OpenCV 不直接支持这些格式。因此,您需要将数据转换为另一种格式(例如 RGBA 或灰度)。您可以将 JavaCamera2Frame 的实现作为起点(它假设相机图像格式)。

请注意,您需要检查图像的实际格式(例如

YUV_420_888
YUV_422_888
YUV_444_888
)并应用适当的颜色转换。

另一种方法是使用 SurfaceTexture 和 OpenGL ES 在 GPU 上进行转换,然后将其读回为 RGBA 数据。但这需要编写更多代码。

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