MediaCodec getInputImage возвращает значение null на некоторых устройствах

Я хочу кодировать с помощью MediaCodec, установив цветовой формат COLOR_FormatYUV420Flexible. Мой входной буфер - yuv420p. Когда я ввожу буфер следующим образом:

    int inputBufferIndex = mEncoder.dequeueInputBuffer(-1);
    mCurrentBufferIndex = inputBufferIndex;
    if (inputBufferIndex >= 0) {
        ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
        //if(VERBOSE)
            Log.i(TAG,"pos:"+inputBuffer.position()+"\tlimit:"+inputBuffer.limit());
        inputBuffer.clear();
        return inputBuffer;
    }

Но некоторые устройства получают неправильный цвет. Итак, я пробую это:

    int inputBufferIndex = mEncoder.dequeueInputBuffer(-1);
    mCurrentBufferIndex = inputBufferIndex;
    if (inputBufferIndex >= 0) {
        Image img = mEncoder.getInputImage(inputBufferIndex);
        if(img==null)
            return null;
        //mCurrentInputPlanes = img.getPlanes();
        ByteBuffer buffers[]={img.getPlanes()[0].getBuffer(),
                img.getPlanes()[1].getBuffer(),
                img.getPlanes()[2].getBuffer()};

Я заполняю буфер для каналов YUV. Он работает на некоторых устройствах. Но moto X pro и huawei P7 получают null при вызове getInputImage. В документации говорится, что изображение не содержит необработанных данных. Но также упоминается, что COLOR_FormatYUV420Flexible поддерживается, начиная с API 21. Итак, как мне это исправить.


person ene    schedule 16.06.2016    source источник
comment
Я получаю это на многих устройствах Galaxy Note3 и Galaxy Tab 4 10.1, какая-либо дополнительная информация от кого-либо?   -  person FTLRalph    schedule 28.09.2016
comment
@FTLRalph Не могли бы вы опубликовать полный пример кода? Из вопроса не понятно, как данные YUV копируются во входной буфер. Кроме того, не могли бы вы опубликовать пример закодированного видео, которое показывает проблему? Неправильный цвет звучит как проблема с шагом или отступом, но мне нужно больше информации для отладки.   -  person Alex I    schedule 03.10.2016
comment
Вы проверяли, поддерживается ли COLOR_FormatYUV420Flexible? по этой ссылке: stackoverflow.com/questions/30857610/   -  person user1796260    schedule 08.08.2017


Ответы (1)


getInputImage документация говорит:

     * @return the input image, or null if the index is not a
     * dequeued input buffer, or not a ByteBuffer that contains a
     * raw image.

или не ByteBuffer, содержащий необработанное изображение. может означать, что изображение не поддерживает цветовой формат. То, что COLOR_FormatYUV420Flexible доступен с 21 года, не означает, что все кодеки поддерживают этот формат.

Если вам абсолютно необходимо использовать getInputImage, попробуйте:

  • COLOR_FormatYUV420Planar
  • COLOR_FormatYUV420SemiPlanar
  • другой кодек, который может обрабатывать COLOR_FormatYUV420Flexible
person Pnemonic    schedule 19.02.2018