下面列出了android.media.MediaCodecList# ALL_CODECS 实例代码,或者点击链接到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()]);
}
@SuppressWarnings("nullness:initialization.fields.uninitialized")
public MediaCodecListCompatV21(boolean includeSecure, boolean includeTunneling) {
codecKind =
includeSecure || includeTunneling
? MediaCodecList.ALL_CODECS
: MediaCodecList.REGULAR_CODECS;
}
@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();
}
/**
* 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;
}
public MediaCodecListCompatV21(boolean includeSecure) {
codecKind = includeSecure ? MediaCodecList.ALL_CODECS : MediaCodecList.REGULAR_CODECS;
}
public MediaCodecListCompatV21(boolean includeSecure) {
codecKind = includeSecure ? MediaCodecList.ALL_CODECS : MediaCodecList.REGULAR_CODECS;
}
public MediaCodecListCompatV21(boolean includeSecure) {
codecKind = includeSecure ? MediaCodecList.ALL_CODECS : MediaCodecList.REGULAR_CODECS;
}
public MediaCodecListCompatV21(boolean includeSecure, boolean includeTunneling) {
codecKind =
includeSecure || includeTunneling
? MediaCodecList.ALL_CODECS
: MediaCodecList.REGULAR_CODECS;
}
public MediaCodecListCompatV21(boolean includeSecure, boolean includeTunneling) {
codecKind =
includeSecure || includeTunneling
? MediaCodecList.ALL_CODECS
: MediaCodecList.REGULAR_CODECS;
}