代码之家  ›  专栏  ›  技术社区  ›  Sirop4ik

是否可以从MediaCodec获取BGR?

  •  0
  • Sirop4ik  · 技术社区  · 6 年前

    MediaCodec YUV420 然后你可以随心所欲地处理它。。。但就我而言,我需要改变信仰 在里面 BGR ,这是相当昂贵的转换。

    所以,问题是,是否有可能立即(无需转换)获得 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);
    

    转换需要很多时间。对我来说,表现至关重要。

    0 回复  |  直到 6 年前
        1
  •  2
  •   fadden    6 年前

    帧以编解码器喜欢的任何格式从MediaCodec中输出。大多数数码相机和视频编解码器使用YUV格式的帧。相机在拍摄静止图像时需要使用两种特定格式中的一种,但MediaCodec对所有人来说都是免费的。如果希望数据采用特定的格式,则必须进行转换。

    glReadPixels() ExtractMpegFramesTest .

    我们有其他的选择 依赖私有本机方法访问pbuffer的。 this this ),但除非您完全控制设备,否则使用非公共API是不明智的。

    可能有一些我没有使用过的访问pbuffer的新方法,例如使用 native hardware buffers or maybe not? ).

    推荐文章