Медиакодек - от YUV_YV12 до YUV420SP / NV21 - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь разработать приложение для Android, которое кодирует массив opencv матов с разрешением 1200x1200 4-канальных изображений в видео mp4 с помощью медиа-кодека Android.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь использовать эмулятор (который использует цветной формат YUV420P - я использую преобразование OpenCV COLOR_BGRA2YUV_I420), цвет вывода видео совпадает с массивом изображений, но на реальных устройствах AndroidВывод цвета совершенно другой, поэтому я отладил и обнаружил, что цветовой формат моих устройств на Android - YUV420SP.Поскольку нет встроенных функций opencv для преобразования RGBA / BGRA в YUV420SP, я преобразовал изображение в YUV_YV12, а затем в YUV420SP / NV21, используя приведенный ниже код

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

        byte[] output = input;

        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;
    }

Но все же я столкнулся с той же проблемой.

Это оригинальное изображение RGBA This is the Original RGBA Picture

Это изображение с видео This one is the output of video

ОБНОВЛЕНИЕ:

После замены U и V enter image description here

...