【问题标题】:Get supported Codec for Android device获取适用于 Android 设备的支持编解码器
【发布时间】:2012-08-03 07:48:27
【问题描述】:

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

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

【问题讨论】:

标签: android codec mediarecorder


【解决方案1】:

这对你来说可能很有趣:

 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;
 }

找到它here。如您所见,您使用MediaCodecList.getCodecCount(); 获得了已安装编解码器的数量。使用MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);,您可以从列表中获得有关特定编解码器的信息。 codecInfo.getName() 例如告诉你编解码器的标题/名称。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • MediaCodec 有一组与 MediaRecorder 不同的编解码器常量。
    【解决方案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
    }
    

    【讨论】:

      【解决方案4】:

      最简单的方法是使用

      MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos
      

      它返回您设备上可用的所有编码器和解码器的数组like this image

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多