我正在使用MediaCodec API从一组位图中编码视频。
由于最低项目API为22,因此我使用COLOR_FormatYUV420Flexible来获取合适的编码器。
问题是一些用户报告说输出的视频结果是黑白的,而不是彩色的。
使用以下算法将被推入编码器的位图转换为YUV。 我最好的猜测是,在受影响的设备中,编码器可能期望使用特定的YUV格式。
问题是,如何找到编码器期望的YUV格式?而且,不是通用的YUV格式适用于所有设备吗?
用于将位图转换为YUV的算法:
void toYuv(const uint32_t* argb, int8_t* yuv, const uint32_t width, const uint32_t height)
{
int32_t index_y = 0;
int32_t index_uv = width * height;
int32_t index = 0;
for (int j = 0; j < height; j++)
{
for (int i = 0; i < width; i++)
{
const int R = (argb[index] & 0x0000FF) >> 0;
const int G = (argb[index] & 0xFF00) >> 8;
const int B = (argb[index] & 0xFF0000) >> 16;
const int Y = ((((R * 77) + (G * 150)) + (B * 29)) + 128) >> 8;
const int U = (((((R * 127) - (G * 106)) - (B * 21)) + 128) >> 8) + 128;
const int V = (((((R * -43) - (G * 84)) + (B * 127)) + 128) >> 8) + 128;
yuv[index_y++] = static_cast<int8_t>((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));
if (((j % 2) == 0) && ((index % 2) == 0))
{
yuv[index_uv++] = static_cast<int8_t>((V < 0) ? 0 : ((V > 255) ? 255 : V));
yuv[index_uv++] = static_cast<int8_t>((U < 0) ? 0 : ((U > 255) ? 255 : U));
}
index++;
}
}
}