如何在Android 4.1和4.2上获得MediaCodec支持的colorFormats?

时间:2014-08-05 06:12:05

标签: android mediacodec

在Android 4.1及更高版本上,我打算获取特定colorFormats支持的MediaCodec列表。

Android 4.3及更高版本提供了一个API(public MediaCodecInfo getCodecInfo ())来获取与MediaCodecInfo的特定实例相关联的MediaCodec。此外,我可以在此MediaCodecInfo对象上调用getCapabilitiesForType,该对象将获取我关联的MediaCodecInfo.CodecCapabilities对象,我在其上调用API colorFormats以获取颜色格式列表对于我的MediaCodec对象。

现在,我无法在Android 4.1和4.2上执行上述调用序列,因为在API级别18中添加了MediaCodec API getCodecInfo()

有人可以建议我如何在Android 4.1和4.2上获得相同的OR任何其他方法来获取颜色格式列表。

2 个答案:

答案 0 :(得分:2)

对于Android 4.1和4.2,您需要使用MediaCodecList类来迭代可用的编解码器 - 您将获得与MediaCodecInfo提供相同信息的getCodecInfo()确实

如果您使用getCodecInfo()(或getName())创建了编解码器,则需要createEncoderByType(或createDecoderByType)的唯一情况,在这种情况下您不会知道你实际处理的编解码器。至少在AOSP中,这两个函数都只返回MediaCodecList中与提供的MIME类型匹配的第一个编解码器。 (有些制造商当然可以对此进行定制,但我认为没有太多理由。)

因此 - 在4.1和4.2上 - 而不是使用createEncoderByType,手动遍历MediaCodecList中的编解码器并选择与您的MIME类型匹配的第一个编解码器,并获取其中的信息和功能。

所以,简单地说 - 如果你现在有这个代码:

MediaCodec codec = MediaCodec.createEncoderByType(mimeType);
MediaCodecInfo info = codec.getCodecInfo();

然后支持4.1和4.2的等效版本是:

MediaCodecInfo info = null;
for (int i = 0; i < MediaCodecList.getCodecCount() && info == null; i++) {
    MediaCodecInfo curInfo = MediaCodecList.getCodecInfoAt(i);
    if (!curInfo.isEncoder())
        continue;
    String[] types = curInfo.getSupportedTypes();
    for (int j = 0; j < types.length; j++)
        if (types[j].equals(mimeType))
            info = curInfo;
}
MediaCodec codec = MediaCodec.createByCodecName(info.getName());

答案 1 :(得分:1)

事实证明,有一种优雅的方法可以使用特定的MediaCodec实例支持的颜色格式,适用于Android 4.1及更高版本。同样的解释如下:

在执行dequeueOutputBuffer时,请注意错误代码:MediaCodec.INFO_OUTPUT_FORMAT_CHANGED。收到此错误代码后,请在编解码器上调用getOutputFormat,然后使用字符串KEY_COLOR_FORMAT在收到的getInteger对象上调用MediaFormat以获取颜色格式。