在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任何其他方法来获取颜色格式列表。
答案 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
以获取颜色格式。