EDIT: я наткнулся на этот libyuv, который выполняет преобразование NV21 в I420, но я действительно не понимаю, как это назвать.
// Convert NV21 to I420. Same as NV12 but u and v pointers swapped.
LIBYUV_API
int NV21ToI420(const uint8* src_y, int src_stride_y,
const uint8* src_vu, int src_stride_vu,
uint8* dst_y, int dst_stride_y,
uint8* dst_u, int dst_stride_u,
uint8* dst_v, int dst_stride_v,
int width, int height)
Я передаю байт [] NV21, полученный из обратного вызова камеры, на слой jni и преобразовываю его в беззнаковый char *, как показано ниже.
int yuvBufLen = env->GetArrayLength(yuvNV21);
unsigned char* yuvNV21Buf = new unsigned char[yuvBufLen];
env->GetByteArrayRegion(yuvNV21, 0, yuvBufLen,reinterpret_cast<jbyte*>(yuvNV21Buf));
Теперь мне непонятно, как мне получить разные параметры, необходимые для вызова функции libyuv NV21ToI420. Что представляет собой каждый из следующих параметров и как их получить из имеющегося у меня unsigned char* yuvNV21Buf ??
const uint8* src_y,
int src_stride_y,
const uint8* src_vu,
int src_stride_vu,
uint8* dst_y,
int dst_stride_y,
uint8* dst_u,
int dst_stride_u ,
uint8* dst_v,
int dst_stride_v
Я проверил это получить yuv420 в ios, в котором объясняется, как получить все необходимые параметры для вызова libyuv::NV12ToI420.
Может кто-нибудь объяснить мне, как этого добиться??
Я захватываю байт кадра [] с камеры с помощью обратного вызова предварительного просмотра ниже
@Override
public void onPreviewFrame(byte[] frameData, Camera camera) {
FrameData, который я получаю, находится в формате NV21, и я пытаюсь преобразовать NV21 в I420.