下面列出了android.media.MediaCodecList# getCodecInfos ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* select the first codec that match a specific MIME type
*
* @param mimeType
* @return null if no codec matched
*/
private static MediaCodecInfo selectVideoCodec(final String mimeType) {
Log.v(TAG, "selectVideoCodec:");
// get the list of available codecs
MediaCodecList list = new MediaCodecList(MediaCodecList.ALL_CODECS);
MediaCodecInfo[] codecInfos = list.getCodecInfos();
final int numCodecs = codecInfos.length;
for (int i = 0; i < numCodecs; i++) {
final MediaCodecInfo codecInfo = codecInfos[i];
if (!codecInfo.isEncoder()) { // skipp decoder
continue;
}
// select first codec that match a specific MIME type and color format
final String[] types = codecInfo.getSupportedTypes();
for (int j = 0; j < types.length; j++) {
if (types[j].equalsIgnoreCase(mimeType)) {
Log.i(TAG, "codec:" + codecInfo.getName() + ",MIME=" + types[j]);
final int format = selectColorFormat(codecInfo, mimeType);
if (format > 0) {
return codecInfo;
}
}
}
}
return null;
}
/**
* Find an encoder supported specified MIME type
*
* @return Returns empty array if not found any encoder supported specified MIME type
*/
public static MediaCodecInfo[] findEncodersByType(String mimeType) {
MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
List<MediaCodecInfo> infos = new ArrayList<>();
for (MediaCodecInfo info : codecList.getCodecInfos()) {
if (!info.isEncoder()) {
continue;
}
try {
MediaCodecInfo.CodecCapabilities cap = info.getCapabilitiesForType(mimeType);
if (cap == null) continue;
} catch (IllegalArgumentException e) {
// unsupported
continue;
}
infos.add(info);
}
return infos.toArray(new MediaCodecInfo[infos.size()]);
}
@NonNull
public static String getAvcDecoderCapabilities(@NonNull Context context) {
StringBuilder codecListStr = new StringBuilder();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
for (MediaCodecInfo mediaCodecInfo: mediaCodecList.getCodecInfos()) {
String codecName = mediaCodecInfo.getName().toLowerCase(Locale.ROOT); {
if ((codecName.contains(TYPE_AVC) || codecName.contains(TYPE_H264)) && codecName.contains(TYPE_DECODER)) {
codecListStr.append(printCodecCapabilities(context, mediaCodecInfo));
}
}
}
}
return codecListStr.toString();
}
/**
* Find an encoder supported specified MIME type
*
* @return Returns empty array if not found any encoder supported specified MIME type
*/
public static MediaCodecInfo[] findEncodersByType(String mimeType) {
MediaCodecList codecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
List<MediaCodecInfo> infos = new ArrayList<>();
for (MediaCodecInfo info : codecList.getCodecInfos()) {
if (!info.isEncoder()) {
continue;
}
try {
MediaCodecInfo.CodecCapabilities cap = info.getCapabilitiesForType(mimeType);
if (cap == null) continue;
} catch (IllegalArgumentException e) {
// unsupported
continue;
}
infos.add(info);
}
return infos.toArray(new MediaCodecInfo[infos.size()]);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static List<String> getAvailableEncoders(int sampleRate) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaFormat format = MediaFormatFactory.createMediaFormat(MediaFormatFactory.Type.FLAC, sampleRate);
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
String encoderAsStr = mcl.findEncoderForFormat(format);
List<String> encoders = new ArrayList<>();
for (MediaCodecInfo info : mcl.getCodecInfos()) {
if (info.isEncoder()) {
if (info.getName().equals(encoderAsStr)) {
encoders.add("*** " + info.getName() + ": " + TextUtils.join(", ", info.getSupportedTypes()));
} else {
encoders.add(info.getName() + ": " + TextUtils.join(", ", info.getSupportedTypes()));
}
}
}
return encoders;
}
return Collections.emptyList();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static List<String> getAvailableEncoders(int sampleRate) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaFormat format = MediaFormatFactory.createMediaFormat(MediaFormatFactory.Type.FLAC, sampleRate);
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
String encoderAsStr = mcl.findEncoderForFormat(format);
List<String> encoders = new ArrayList<>();
for (MediaCodecInfo info : mcl.getCodecInfos()) {
if (info.isEncoder()) {
if (info.getName().equals(encoderAsStr)) {
encoders.add("*** " + info.getName() + ": " + TextUtils.join(", ", info.getSupportedTypes()));
} else {
encoders.add(info.getName() + ": " + TextUtils.join(", ", info.getSupportedTypes()));
}
}
}
return encoders;
}
return Collections.emptyList();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static List<String> getAvailableEncoders(String mime, int sampleRate) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaFormat format = MediaFormatFactory.createMediaFormat(mime, sampleRate);
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
String encoderAsStr = mcl.findEncoderForFormat(format);
List<String> encoders = new ArrayList<>();
for (MediaCodecInfo info : mcl.getCodecInfos()) {
if (info.isEncoder()) {
String name = info.getName();
String infoAsStr = name + ": " + TextUtils.join(", ", info.getSupportedTypes());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
infoAsStr += String.format(": %s/%s/%s/%s", info.isHardwareAccelerated(), info.isSoftwareOnly(), info.isAlias(), info.isVendor());
}
if (name.equals(encoderAsStr)) {
infoAsStr = '#' + infoAsStr;
}
encoders.add(infoAsStr);
}
}
return encoders;
}
return Collections.emptyList();
}
@NonNull
public static String getCodecList() {
StringBuilder codecListStr = new StringBuilder();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
for (MediaCodecInfo mediaCodecInfo: mediaCodecList.getCodecInfos()) {
codecListStr.append(mediaCodecInfo.getName());
codecListStr.append('\n');
}
}
return codecListStr.toString();
}
@NonNull
public static String getAvcEncoderCapabilities(@NonNull Context context) {
StringBuilder codecListStr = new StringBuilder();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
for (MediaCodecInfo mediaCodecInfo : mediaCodecList.getCodecInfos()) {
String codecName = mediaCodecInfo.getName().toLowerCase(Locale.ROOT);
if ((codecName.contains(TYPE_AVC) || codecName.contains(TYPE_H264)) && codecName.contains(TYPE_ENCODER)) {
codecListStr.append(printCodecCapabilities(context, mediaCodecInfo));
}
}
}
return codecListStr.toString();
}
private boolean supports(
String mime, boolean isEncoder, int profile, int level) {
MediaCodecList mcl = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
for (MediaCodecInfo info : mcl.getCodecInfos()) {
if (isEncoder != info.isEncoder()) {
continue;
}
try {
MediaCodecInfo.CodecCapabilities caps = info.getCapabilitiesForType(mime);
for (MediaCodecInfo.CodecProfileLevel pl : caps.profileLevels) {
if (pl.profile != profile) {
continue;
}
// H.263 levels are not completely ordered:
// Level45 support only implies Level10 support
if (mime.equalsIgnoreCase(MIMETYPE_VIDEO_H263)) {
if (pl.level != level && pl.level == H263Level45 && level > H263Level10) {
continue;
}
}
if (pl.level >= level) {
return true;
}
}
} catch (IllegalArgumentException e) {
Timber.e(e);
}
}
return false;
}
/**
* select the first codec that match a specific MIME type
*
* @param mimeType
* @return null if no codec matched
*/
private static MediaCodecInfo selectVideoCodec(final String mimeType) {
Log.v(TAG, "selectVideoCodec:");
// get the list of available codecs
MediaCodecList list = new MediaCodecList(MediaCodecList.ALL_CODECS);
MediaCodecInfo[] codecInfos = list.getCodecInfos();
final int numCodecs = codecInfos.length;
for (int i = 0; i < numCodecs; i++) {
final MediaCodecInfo codecInfo = codecInfos[i];
if (!codecInfo.isEncoder()) { // skipp decoder
continue;
}
// select first codec that match a specific MIME type and color format
final String[] types = codecInfo.getSupportedTypes();
for (int j = 0; j < types.length; j++) {
if (types[j].equalsIgnoreCase(mimeType)) {
Log.i(TAG, "codec:" + codecInfo.getName() + ",MIME=" + types[j]);
final int format = selectColorFormat(codecInfo, mimeType);
if (format > 0) {
return codecInfo;
}
}
}
}
return null;
}
public static List<MediaCodecInfo> getAllCodecs(boolean filterBroken) {
List<MediaCodecInfo> mediaCodecInfoList = new ArrayList<>();
if (Build.VERSION.SDK_INT >= 21) {
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
MediaCodecInfo[] mediaCodecInfos = mediaCodecList.getCodecInfos();
mediaCodecInfoList.addAll(Arrays.asList(mediaCodecInfos));
} else {
int count = MediaCodecList.getCodecCount();
for (int i = 0; i < count; i++) {
MediaCodecInfo mci = MediaCodecList.getCodecInfoAt(i);
mediaCodecInfoList.add(mci);
}
}
return filterBroken ? filterBrokenCodecs(mediaCodecInfoList) : mediaCodecInfoList;
}