获取Android设备支持的编解码器

13

请查看以下文章: https://medium.com/@takusemba/decoders-encoders-on-android-77f199194d58 - LOKESH KUMAR PEDDA
4个回答

9

这可能对您很有趣:

 private static MediaCodecInfo selectCodec(String mimeType) {
     int numCodecs = MediaCodecList.getCodecCount();
     for (int i = 0; i < numCodecs; i++) {
         MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);

         if (!codecInfo.isEncoder()) {
             continue;
         }

         String[] types = codecInfo.getSupportedTypes();
         for (int j = 0; j < types.length; j++) {
             if (types[j].equalsIgnoreCase(mimeType)) {
                 return codecInfo;
             }
         }
     }
     return null;
 }

您可以在这里找到它。 如您所见,使用MediaCodecList.getCodecCount();,您可以获取已安装编解码器的数量。 使用MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);,您可以获取列表中特定编解码器的详细信息。例如,codecInfo.getName()将告诉您该编解码器的标题/名称。


4
有没有一种方式可以询问Android设备支持哪些音频和视频编解码器?
很遗憾,至少在ICS之前没有这种方法。
Jelly Bean提供了一个MediaCodec类。虽然它没有“给我一个受支持的编解码器列表”,但它确实有createEncoderByType()函数,您需要传递一个MIME类型。 假定,如果您所需的MIME类型不受支持,那么它将抛出RuntimeException或返回null。 我不能保证仅因为MediaCodec报告编码器可用即可保证它能够从MediaRecorder等应用程序中正常工作。

2
而MediaCodec具有与MediaRecorder不同的编解码器常量集。 - Marcus Wolschon

3
最简单的方法是使用
MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos

它返回一个包含所有可用于您设备的编码器和解码器的数组,就像这张图片一样。

image

然后,您可以使用filter来查询您正在寻找的特定编码器和解码器。例如:
MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos.filter {
    it.isEncoder && it.supportedTypes[0].startsWith("video")
}

这将返回所有可用的视频编码器。

3

这是一份基于Jonson答案的更新代码,使用Kotlin编写,不使用已被弃用的方法:

 fun getCodecForMimeType(mimeType: String): MediaCodecInfo? {
    val mediaCodecList = MediaCodecList(MediaCodecList.REGULAR_CODECS)
    val codecInfos = mediaCodecList.codecInfos
    for (i in codecInfos.indices) {
        val codecInfo = codecInfos[i]
        
        if (!codecInfo.isEncoder) {
            continue
        }
        
        val types = codecInfo.supportedTypes
        for (j in types.indices) {
            if (types[j].equals(mimeType, ignoreCase = true)) {
                return codecInfo
            }
        }
    }
    
    return null
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接