前言
了解多媒体文件解析提取视频文件之后,实现音视频播放的第二步就是对多媒体数据流的解码。但解码之前还需要知道当前设备所支持哪些编解码器,因为安卓设备存在碎片化情况不同设备配置不同所搭载芯片也不一样因此能够支持编解码能力也不一样。安卓设备提供编解码器和硬件有很大关系,虽然大部分手机对常用格式音视频资源格式都支持,但也不排除一些特殊音视频资源格式需要去做兼容。
MediaCodecList
MediaCodecList
以枚举设备支持的编解码名字、支持格式类型等。不同设备支持类型还是存在很大差异,例如设备若是使用了联发科芯片,提供的解码器会是以OMX.MTK
开头。
获取支持编解码
在使用MediaCodec
创建解码器之前还需要确认设备是否支持需要音视频资源解码格式。同样Android
开发中也提供了查看设备所支持的所有编解码器工具MediaCodecList
。通过该类可以遍历设备支持的所有编解码器,在这里采用MediaCodecList.REGULAR_CODECS
去获取编解码器会比较安全能够保障所支持编解码器是标准和稳定的(但也不能百分百保障音视频开发坑还是蛮多的)。遍历获取到MediaCodecInfo
就能查看该Codec
通过getSupportedTypes()
知道支持的格式以及是通过isEncoder()
方法知道编码器还是解码器。
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
MediaCodecInfo[] mediaCodecIndies = mediaCodecList.getCodecInfos();
for (int i = 0; i < mediaCodecIndies.length; i++) {
MediaCodecInfo codecInfo = mediaCodecIndies[i];
MediaLogUtils.printI("CodecInfoInstance codecInfo " + codecInfo.getName() + " isEncoder " + codecInfo.isEncoder() + " " + printSupportedTypes(codecInfo.getSupportedTypes()));
mMediaCodecIndies.add(codecInfo);
}
打印获取到设备支持的编解码器如下所示: 在此之前MediaExtactor
可以加载到音视频资源轨道信息并且通过mediaFormat.getString(MediaFormat.KEY_MIME)
获取到格式。然后将需要解码格式入参去遍历缓存编解码器集合查询设备是否支持该音视频资源格式。
public MediaCodecInfo selectDeCodec(String mimeType){
for(MediaCodecInfo codecInfo : mMediaCodecIndies){
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;
}
其他小Tips
通常以
OMX.google
开头是软件编解码器通常以
OMX.[xxxx]
开头是硬件编解码器MediaCodecList
同样是和JNI层的media_jni库关联,多媒体开发核心部分还是在底层上!
- 实例化
MediaCodecList
就已经从底层去获取到所有支持的编解码器。
public MediaCodecList(int kind) {
initCodecList();
if (kind == REGULAR_CODECS) {
mCodecInfos = sRegularCodecInfos;
} else {
mCodecInfos = sAllCodecInfos;
}
}
private static native final int native_getCodecCount();
static native final MediaCodecInfo.CodecCapabilities
getCodecCapabilities(int index, String type);
链接:https://juejin.cn/post/7091093290174873637
作者:JulyYu