Как конфертировать из yv12 в yuv420p

В кадре предварительного просмотра камеры я получаю данные в формате yv12 на стороне Android. Мне нужно конвертировать его в YUV420P на стороне jni. Как мне это сделать? Как я прочитал из многих источников в формате YUV420P, сначала появляется сэмпл, после которого идут сэмплы. за образцами следует v образец. Формат yv12 аналогичен формату YUV420P за исключением того, что сэмплы u и v отображаются в обратном порядке, что означает, что за сэмплами y следуют v, а затем сэмплы u. Помня об этом, я использовал следующий код подкачки для получения данных YUV420P из формата данных yv12 перед кодированием.

avpicture_fill((AVPicture*)outframe, (uint8_t*)camData, codecCtx->pix_fmt, codecCtx->width, codecCtx->height);

uint8_t * buf_store = outframe->data[1];
outframe->data[1]=outframe->data[2];
outframe->data[2]=buf_store;

Но это не похоже на работу. Как мне настроить свой код?

1 ответ

Не используйте avpicture_fill. Я реализовал в моем приложении, как это и работает нормально



picture->linesize[0] = frameWidth;
picture->linesize[1] = frameWidth/2;
picture->linesize[2] = frameWidth/2;

picture->data[0] = camData;
picture->data[1] = camData + picture->linesize[0]*frameHeight+picture->linesize[1]*frameHeight/2;
picture->data[2] = camData + picture->linesize[0]*frameHeight;

Может быть вам понадобится такой способ:

  //yv12 to yuv420p  
  public  static void swapYV12toI420(final byte[] yv12bytes, final byte[] i420bytes, int width, int height) {
        int size = width * height;
        int part = size / 4;
        System.arraycopy(yv12bytes, 0, i420bytes, 0, size);
        System.arraycopy(yv12bytes, size + part, i420bytes, size, part);
        System.arraycopy(yv12bytes, size, i420bytes, size + part, part);
    }

Для каждого пакета данных YV12, который вы получили, переключитесь на i420.

Другие вопросы по тегам