初识MediaCodec
前面视频理论基础几篇篇文章已经比较详细地介绍了H264编辑码基本原理以及码流的基本结构,其中并未叙述具体编解码算法,因为对于一般的工程类开发来说,这些知识已经足矣,算法那是专门做算法的人员需要研究的。
而对于一般开发来说,已经有成熟的工具来处理编解码了,其中,MediaCodec就是Android平台中专门处理音视频硬编硬解码的利器。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。反之,编码的作用,就是将非压缩的视频/音频原始数据转为视频/音频压缩编码数据。
(虽然关于MediaCodec的文章百度一下大把,但是很多其实也就是对官网的一个翻译,本文我将尽量结合之前几篇文章中关于编解码相关的内容并将自己一些个人想法写上来,使得此MediaCodec文章非彼(百度)MediaCodec文章。
不过这样出现错误的风险也会提高哈哈,所以有什么错误也请各位指教)
首先要解释的是什么是硬编硬解码,有硬就有软,当然这里只是一种行内的约定俗成的说法,并不是真的一种很硬一种很软。一般来说:
软编软解码:使用CPU进行编码,一般是执行代码运行算法指令编码。硬编硬解码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等,一般是算法已经固化在芯片中。
一般来说,软编码会使CPU负载更重,所以性能相对比硬编要低,不过兼容性一般比硬编好,低码率下质量通常比硬编码要好一点。而硬编码一般性能比软编码好一些,但是兼容性就差一些,低码率下通常质量低于软编码的。
按照MediaCodec官网的定义,MediaCodec是Android平台提供的一个底层的音视频编解码框架,它是安卓底层多媒体基础框架的重要组成部分。
它经常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface, AudioTrack一起使用。
这里的底层是相对于上层的MediaPlayer这一类封装好的可以几个api的简单调用就能搞定一段视频从解复用、解码、播放的全过程的工具类而言的。那既然有了MediaPlayer这一类傻瓜式调用即可的工具,为啥还要MediaCodec呢?
因为我们的需求肯定不会满足于简单的播放视频,我们要根据自己的需要去定制视频,比如最常见的就是抖音那种给视频加滤镜特效,需要对视频每一帧专门进行处理。
之所以说MediaCodec是硬编解码,是因为MediaCodec就相当一个处于CPU中的遥控器,专门遥控音视频编解码芯片进行工作,而非CPU本身去进行编解码处理。大概是这样一个工作流程: