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.
Почему вам нужно конвертировать в I420? Что ты пытаешься сделать? – fadden
работает над приложением для видеоконференций, а серверу нужен формат I420. Когда я передаю NV21 с Android, он выглядит искаженным на сервере. – zenith
Нравится? http://stackoverflow.com/questions/13703596/mediacodec-and-camera-colorspaces-dont-match – fadden