Android音视频开发系列-MediaCodecList介绍

前言

了解多媒体文件解析提取视频文件之后,实现音视频播放的第二步就是对多媒体数据流的解码。但解码之前还需要知道当前设备所支持哪些编解码器,因为安卓设备存在碎片化情况不同设备配置不同所搭载芯片也不一样因此能够支持编解码能力也不一样。安卓设备提供编解码器和硬件有很大关系,虽然大部分手机对常用格式音视频资源格式都支持,但也不排除一些特殊音视频资源格式需要去做兼容。

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

打印获取到设备支持的编解码器如下所示: image.png

在此之前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库关联,多媒体开发核心部分还是在底层上!

image.png

  • 实例化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);

image.png

链接:https://juejin.cn/post/7091093290174873637
作者:JulyYu

最后

想要进击Android音视频开发的朋友,音视频行业存在较高的资源门槛与技术壁垒。主要包括:软件定义的实时音视频传输网络(Real-time Network, RTN),基于UDP的协议层优化,以及弱网传输保障策略。在实际应用中, RTC与CDN技术的融合,衍生出实时互动直播、超低延时直播两大技术路径。

对于目前想要转型音视频开发的Android程序员来说,是否掌握这些技术成为了关键点。

在这里为了帮助你系统地学习音视频技术,这里给大家推荐一套学习路线,相信可以给大家提供一些帮助。

音视频系列教学视频+《音视频精编源码解析》电子书+《Android音视频开发进阶指南》电子书可以在这里扫码免费领取哦~

第1章 Android音视频硬解码篇

在这里插入图片描述

第2章 使用OpenGL渲染视频画面篇

在这里插入图片描述

第3章Android FFmpeg音视频解码篇

在这里插入图片描述

第4章 直播系统聊天技术

在这里插入图片描述

第5章 阿里IM技术分享

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值