有没有办法向Android设备询问它支持的编码音频和视频编解码器?
我发现设备不支持某些列为必需的编解码器 http://developer.android.com/guide/appendix/media-formats.html 并且似乎有设备支持未在其中列出的其他编解码器。
答案 0 :(得分:7)
这对你来说很有意思:
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()
会告诉您编解码器的标题/名称。
答案 1 :(得分:4)
有没有办法向Android设备询问它支持的编码音频和视频编解码器?
我真的希望有,但至少没有,至少通过ICS。
Jelly Bean提供MediaCodec
课程。虽然它没有“给我一个支持的编解码器列表”,但它确实有createEncoderByType()
,您传入MIME类型。据推测,如果不支持您想要的MIME类型,那将抛出RuntimeException
或返回null
。而且我不能保证只是因为MediaCodec
报告编码器可用,保证可以使用,例如MediaRecorder
。
答案 2 :(得分:1)
最简单的方法是使用
MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos
它返回您设备上可用的所有编码器和解码器的数组 like this image。
然后,您可以使用 filter
查询您正在寻找的特定编码器和解码器。例如:
MediaCodecList(MediaCodecList.ALL_CODECS).codecInfos.filter {
it.isEncoder && it.supportedTypes[0].startsWith("video")
}
这将返回所有可用的视频编码器。
答案 3 :(得分:0)
以下是基于乔森回答的更新代码,该代码用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
}