2017-02-02 9 views
1

Как вы можете конвертировать:Преобразовать YV12 в NV21 (YUV YCrCb 4: 2: 0)

YV12 (FOOURCC код: 0x32315659)
к
NV21 код (FOURCC: 0x3132564E)
(YCrCb 4: 2: 0 Planar)

Это общие форматы обработки видео для Android, но вы не являетесь примером онлайн-конвертации между ними. (Для Вас пойти в RGB, то и далее, но можно предположить, что будет неэффективным.)

В идеале в C# или Java, но может преобразовывать код из любого другого ...

вход является байт [], а ширина и высота известны.

Я пытался следить за Wikipedia Article, но не могу заставить его функционировать чисто.

Для функции bounty: функция принимает байт [] и выводит байт [] в другом формате.

+0

На этой странице https://msdn.microsoft.com/en-us/library/windows/hardware/ff538197(v=vs.85).aspx Я m, идущий вниз по линии, что мне нужно сохранить образцы Y, и переместить образцы Cr и Cb из одного за другим, чередовать с примерами Cr, затем Cb, повторяющимися? ... – Jethro

+0

Или найдите код для перехода от YV12 к NV12 , а затем от NV12 до NV21 .. – Jethro

+1

Попробуйте использовать [ffmpeg] (https://ffmpeg.org/) (вы можете использовать результат 'ffmpeg' в качестве ссылки). – Rotem

ответ

3

Это мое взятие на себя. Это все еще непроверенный, но здесь это идет:

YV12 8 бит Y плоскость с последующим 8 бит 2x2 субдискретизированных V и U плоскостей. Таким образом, один кадр будет иметь полный размер Y-плоскости, следующий за плоскостями V и U 1/4-го размера.

NV21 8-битовая плоскость Y, за которой следует чередуемая плоскость V/U с 2x2 подвыборкой. Таким образом, один кадр будет иметь полный размер Y-плоскости, следующий за V и U в 8-битовых блоках.

Так здесь идет код

public static byte[] YV12toNV21(final byte[] input, 
           final byte[] output, final int width, final int height) { 

    final int size = width * height; 
    final int quarter = size/4; 
    final int vPosition = size; // This is where V starts 
    final int uPosition = size + quarter; // This is where U starts 

    System.arraycopy(input, 0, output, 0, size); // Y is same 

    for (int i = 0; i < quarter; i++) { 
     output[size + i*2 ] = input[vPosition + i]; // For NV21, V first 
     output[size + i*2 + 1] = input[uPosition + i]; // For Nv21, U second 
    } 
    return output; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^