android encode mediacodec

android - MediaCodec getInputImage devuelve null en algunos dispositivos



encode (1)

Quiero codificar usando MediaCodec configurando el formato de color en COLOR_FormatYUV420Flexible . Mi búfer de entrada es yuv420p. Cuando ingreso un búfer de esta manera:

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

Pero algunos dispositivos se colorean mal. Así que intento esto:

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

Lleno el búfer a los canales YUV. Funciona en algunos dispositivos. Pero moto X pro y huawei P7 se vuelven nulos al llamar a getInputImage. La documentación dice que la imagen no contiene datos en bruto. Pero también menciona que COLOR_FormatYUV420Flexible es compatible desde API 21. Por lo tanto, ¿cómo debo solucionar esto?


getInputImage documentación de getInputImage dice:

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

o no un ByteBuffer que contiene una imagen en bruto. Podría significar que la imagen no admite el formato de color. El hecho de que COLOR_FormatYUV420Flexible esté disponible desde 21, no significa que todos los códecs admitan este formato.

Si absolutamente tiene que usar getInputImage, entonces intente:

  • COLOR_FormatYUV420Planar
  • COLOR_FormatYUV420SemiPlanar
  • un codec diferente que puede manejar COLOR_FormatYUV420Flexible