2014-11-03 4 views
1

EDIT: Я столкнулся с этим libyuv, который преобразует NV21 в I420, но я действительно не понимаю, как его назвать.NV21 to I420 in android

// 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 слоя и превращение его в неподписанные символ *, как показано ниже

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

Я проверил это obtain yuv420 in ios, в котором объясняется, как получить все необходимые параметры для вызова libyuv :: NV12ToI420.

Может кто-нибудь объяснить мне, как этого добиться?

Я захват кадров байты [] из камеры через предварительный обратный вызов ниже

@Override 
     public void onPreviewFrame(byte[] frameData, Camera camera) { 

В frameData я получаю в формате NV21 и я пытаюсь преобразовать NV21 в I420.

+0

Почему вам нужно конвертировать в I420? Что ты пытаешься сделать? – fadden

+0

работает над приложением для видеоконференций, а серверу нужен формат I420. Когда я передаю NV21 с Android, он выглядит искаженным на сервере. – zenith

+0

Нравится? http://stackoverflow.com/questions/13703596/mediacodec-and-camera-colorspaces-dont-match – fadden

ответ

0

Я не мог приступить к работе с методом, который я опубликовал в вопросе, он все время рушился.

Но благодаря Петру я нашел это преобразование NV21ToI420, и оно отлично сработало для меня.

Просто ему нужны указатели NV21 и I420.

unsigned char* yuvPtr; //NV21 data 
unsigned char* I420 = new unsigned char[sourceWidth*sourceHeight*1.5]; //destination I420 pointer where the converted yuv will be stored 
NV21toI420(yuvPtr, I420, sourceWidth, sourceHeight); 

Вот и все ....

+0

404 вашей ссылки – gordonpro