나는 표면이 렌더링 할 MediaCodec 디코더에 연결된 ImageReader를 사용하고 있습니다.AImageReader에서 가져온 이미지의 원시 데이터 가져 오기
AMediaCodec *videoDecoder = nullptr;
ANativeWindow* surface = nullptr;
AImageReader* imageReader = nullptr;
AImageReader_ImageListener* imageListener = nullptr;
if ((videoDecoder = AMediaCodec_createDecoderByType(mime)))
{
if (AImageReader_new(mWidth, mHeight, AIMAGE_FORMAT_YUV_420_888, 2, &imageReader) == AMEDIA_OK)
{
if (AImageReader_getWindow(imageReader, &surface) == AMEDIA_OK)
{
if (AMediaCodec_configure(videoDecoder, mediaFormat, surface, NULL, 0) == AMEDIA_OK)
{
int32_t outputFormat{};
AMediaFormat_getInt32(AMediaCodec_getOutputFormat(videoDecoder), AMEDIAFORMAT_KEY_COLOR_FORMAT, &outputFormat);
imageListener = new AImageReader_ImageListener();
imageListener->onImageAvailable = &onImageAvailableCallback;
AImageReader_setImageListener(imageReader, imageListener);
if (AMediaCodec_start(videoDecoder) == AMEDIA_OK)
{
configCompleted = true;
}
else
{
TRACE("ImporterMP4Android", 0, "Failed to Start Video Decoder");
}
}
else
{
TRACE("ImporterMP4Android", 0, "Failed to Configure Video Decoder");
}
}
else
{
TRACE("ImporterMP4Android", 0, "Failed to Fetch Surface owned by the ImageReader");
}
}
else
{
TRACE("ImporterMP4Android", 0, "Failed to Create ImageReader");
}
}
else
{
TRACE("ImporterMP4Android", 0, "Failed to Create Decoder");
}
onImageAvailableCallback
이 기압과 같습니다
void onImageAvailableCallback(void *context, AImageReader *reader)
{
int32_t format;
media_status_t status = AImageReader_getFormat (reader, &format);
AImage *image;
status = AImageReader_acquireLatestImage(reader, &image);
status = AImage_getFormat(image, &format);
// TODO: copy *raw data somewhere for downstream processing
AImage_delete(image);
}
, 내가 추가 처리를 위해 ImageReader
에서 획득 한 Image
의 원시 데이터를 복사 할. Image 클래스에서 제공하는 인터페이스를 사용하면 평면 수를 쿼리하고 개별 평면 데이터를 가져올 수 있지만 전체 프레임을 한 번에 잡아내는 데 관심이 있습니다. 내가 이것을 어떻게 성취 할 수 있을지에 대한 제안? 요컨대