MediaCodec и Camera: цветовые пространства не совпадают

Я пытался заставить кодирование H264 работать с входом, снятым камерой на планшете Android, используя новый низкоуровневыйMediaCodec, С этим я столкнулся с некоторыми трудностями, поскольку MediaCodecAPI плохо документирован, но янаконец-то у меня есть работа.

настройте камеру следующим образом:

        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewFormat(ImageFormat.YV12); // 
        parameters.setPreviewFpsRange(4000,60000);
        parameters.setPreviewSize(640, 480);            
        mCamera.setParameters(parameters);

Что касается кодирования, яm создание экземпляра объекта MediaCodec следующим образом:

    mediaCodec = MediaCodec.createEncoderByType("video/avc");
    MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 640, 480);
    mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
    mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
    mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
            MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar); // 
    mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
    mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    mediaCodec.start();

Конечная цель - создать RTP-поток (и переписываться по Skype), но пока я только транслирую необработанный H264 прямо на мой рабочий стол. Там я использую следующий GStreamer-pipe, чтобы показать результат:

gst-launch udpsrc port=5555 ! video/x-h264,width=640,height=480,framerate=15/1 ! ffdec_h264 ! autovideosink

Все работает хорошо, кроме цветов. Мне нужно установить 2 цветовых формата на компьютере: один для предварительного просмотра камеры (строка помечена как) и один для объекта MediaCodec (помеченный как)

Определить приемлемые значения для линий я использовалparameters.getSupportedPreviewFormats(), Исходя из этого, я знаю, что единственные поддерживаемые форматы на камереImageFormat.NV21 а такжеImageFormat.YV2.

ЗаЯ извлекMediaCodecInfo.CodecCapabilities-объект для типавидео / АВК, являясь целочисленными значениями 19 (соответствующимиMediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar и 2130708361 (который нет соответствуют любому значениюMediaCodecInfo.CodecCapabilities).

Любое другое значение, кроме указанного выше, приводит к сбою.

Объединение этих настроек дает разные результаты, которые япокажу ниже. Вот'Снимок экрана на Android (то есть "реальный» цвета): Вот результаты, показанные Gstreamer:

 = NV21, = COLOR_FormatYUV420Planar

 = NV21, = 2130708361

 = YV2, = COLOR_FormatYUV420Planar

 = YV2, = 2130708361

Как видно, ни один из них не удовлетворяет. YV2-цветовое пространство выглядит наиболее перспективным, но похоже, что красный (Cr) и синий (Cb) инвертированы. Я полагаю, что NV21 выглядит чересстрочнымм не специалист в этой области).

Так как цель состоит в том, чтобы общаться со Skype, я полагаю, что я не долженизменить декодер (то есть команду Gstreamer), верно? Это нужно решить в Android и если да, то как? Или это может быть решено путем добавления определенной информации полезной нагрузки RTP? Любое другое предложение?

Ответы на вопрос(4)

Ваш ответ на вопрос