【发布时间】:2019-07-28 06:03:17
【问题描述】:
据我所知,MediaCodec 在YUV420 中返回图像的输出缓冲区,然后您可以随意处理它...但在我的情况下,我需要将YUV420 转换为BGR ,这是相当昂贵的转换。
所以,问题是是否可以立即(无需转换)从MediaCodec 获得BGR?
我现在的代码
uint8_t *buf = AMediaCodec_getOutputBuffer(m_data.codec, static_cast<size_t>(status), /*bufsize*/nullptr);
cv::Mat YUVframe(cv::Size(m_frameSize.width, static_cast<int>(m_frameSize.height * 1.5)), CV_8UC1, buf);
cv::Mat colImg(m_frameSize, CV_8UC3);
cv::cvtColor(YUVframe, colImg, CV_YUV420sp2BGR, 3);
auto dataSize = colImg.rows * colImg.cols * colImg.channels();
imageData.assign(colImg.data, colImg.data + dataSize);
所以,你可以在这里看到
cv::Mat YUVframe(cv::Size(m_frameSize.width, static_cast<int>(m_frameSize.height * 1.5)), CV_8UC1, buf);
我从编解码器缓冲区获取YUVframe,然后在这里
cv::cvtColor(YUVframe, colImg, CV_YUV420sp2BGR, 3);
我进行转换
转换需要很长时间。对我来说,性能至关重要。
【问题讨论】:
标签: android android-mediacodec