13

有没有办法询问 Android 设备它支持哪些音频和视频编解码器进行编码?

我发现不支持 http://developer.android.com/guide/appendix/media-formats.html中列出的某些编解码器的设备, 并且似乎有些设备支持未列出的其他编解码器。

4

4 回答 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()例如告诉您编解码器的标题/名称。

于 2014-10-27T14:08:27.673 回答
4

有没有办法询问 Android 设备它支持哪些音频和视频编解码器进行编码?

我真的希望有,但没有,至少通过 ICS。

Jelly Bean 提供一门MediaCodec课程。虽然它没有“给我支持的编解码器列表”,但它确实有createEncoderByType(),您可以在其中传入 MIME 类型。据推测,如果不支持您想要的 MIME 类型,这将抛出RuntimeException 或返回。null而且我不能保证仅仅因为MediaCodec报告编码器可用就可以保证它可以工作,例如,MediaRecorder.

于 2012-08-03T10:53:34.897 回答
1

最简单的方法是使用

MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos

它返回一个包含您设备上可用的所有编码器和解码器的数组,例如此图像

然后,您可以使用filter查询您正在寻找的特定编码器和解码器。例如:

MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos.filter {
    it.isEncoder && it.supportedTypes[0].startsWith("video")
}

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

于 2021-07-30T13:16:50.120 回答
1

这是基于 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
}
于 2020-12-07T04:34:54.070 回答