MediaCodec编码器在某些设备中产生黑白视频

时间:2019-09-10 15:19:57

标签: android video bitmap mediacodec yuv

我正在使用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++;
        }
    }
}

0 个答案:

没有答案