На самом деле, это может быть сделано в Java с незначительными накладными расходами.

API camera2 мы получаем объект Image форматаYUV_420_888, Затем мы используем следующую функцию для преобразования вNV21:

private static byte[] YUV_420_888toNV21(Image image) {
    byte[] nv21;
    ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
    ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
    ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();

    int ySize = yBuffer.remaining();
    int uSize = uBuffer.remaining();
    int vSize = vBuffer.remaining();

    nv21 = new byte[ySize + uSize + vSize];

    //U and V are swapped
    yBuffer.get(nv21, 0, ySize);
    vBuffer.get(nv21, ySize, vSize);
    uBuffer.get(nv21, ySize + vSize, uSize);

    return nv21;
}

Пока эта функция отлично работает сcameraCaptureSessions.setRepeatingRequestмы получаем ошибку сегментации при дальнейшей обработке (на стороне JNI) при вызовеcameraCaptureSessions.capture, Оба запрашивают формат YUV_420_888 через ImageReader.

Почему результат отличается для обоих вызовов функций, в то время как запрашиваемый тип одинаков?

Обновить: Как уже упоминалось в комментариях, я получаю это поведение из-за разного размера изображения (гораздо больший размер для запроса захвата). Но наши дальнейшие операции обработки на стороне JNI одинаковы для обоих запросов и не зависят от размеров изображения (только от соотношения сторон, которое в обоих случаях одинаково).

Ответы на вопрос(1)

Ваш ответ на вопрос