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