FFmpeg与MediaCodec 简单总结

由于工作及学习的原因,需要研究移动端的多媒体视频编辑,自然也就接触到了FFmpeg以及MediaCodec。作为一种阶段性的总结,记录一下自己对于FFmpeg以及MediaCodec的一些经验。后面也会写一些例如带MediaCodec的FFmpeg的编译以及FFmpeg的使用或一些源码分析之类的…

对于FFmpeg于MediaCodec,首先最重要的问题是:FFmpeg是什么,MediaCodec是什么,各自有什么样的优缺点。

FFmpeg:FFmpeg本质上可以看做是媒体处理工具的集合,包含了很多的媒体文件处理工具,例如媒体文件格式解析工具、编解码器等,这些工具实际上就是一个个的库,而FFmpeg的命令行程序实际上就是对这些库的一种包装,在调用命令行程序时也是通过底下的这些库来完成操作。这些库有的是编译时可选的,而且FFmpeg也支持一些外部的库,例如x264、MediaCodec。FFmpeg由于提供了很多的编解码器,而且它的媒体操作也很丰富,所以可以支持非常多的媒体类型,同时很多的处理功能也已经由FFmpeg提供,使用者只需要去调用即可,所以不少的编辑处理功能可以相对简单地完成开发。缺点就是如果通过其自带的软编解码来完成移动端上的任务的话效率会比较低。

MediaCodec:MediaCodec提供的功能就相对单一,它基本上只用来完成编解码相关的功能。以整个视频转码流程举例,大致需要几个步骤:解封装->解码->滤镜处理等操作->编码->封装,MediaCodec只提供编解码功能,而其它的功能则需要其它组件,如MediaExtractor以及MediaMuxer来完成。但是MediaCodec在编解码时提供硬件编解码功能,其好处是非常明显的,效率很高,且CPU占用大幅降低。说实话如果不使用硬件编解码的话,很多的转码过程的时长实在长得是令人无法忍受,放到APP上简直就是无法使用的功能。毕竟一段很短的视频,转码要好几分钟,发烫还严重,体验肯定是不行的。MediaCodec的缺点就是一定程度上会依赖于设备,由于MediaCodec的硬解码实际上是由厂商所提供的,同时安卓设备的硬件相互之间差异很大,所以在硬解码实现上自然也有所差别,就导致了一样的程序,一些设备上可以正常跑,而在另一些设备上则可能会出问题,此时就需要自行提供兼容性上的支持。

作一个简单的比喻:FFmpeg就像一个工具箱,而MediaCodec就像一类功能强大,但是使用范围相对受限且不够灵活的工具。

有几个需要注意的点:
1.FFmpeg也有对MediaCodec的支持,在编译出合适的库后,可以通过FFmpeg的api来调用MediaCodec,但只能使用解码功能。
2.MediaCodec并非只代表硬编解码,它事实上可以看做是一种服务,厂商将自己的编解码方案预先注册于服务中,而用户在需要时再通过服务去调用相应的编解码器来完成任务。MediaCodec支持硬件编解码以及软件编解码,可以自行选择需要使用的编解码器。
3.FFmpeg在使用MediaCodec时,使用的方式和JAVA调用是类似的,FFmpeg会通过JNI的callXXmethod去调用MediaCodec的方法,这个过程其实和JAVA中的调用没有区别,但是FFmpeg通过封装MediaCodec的操作,使得MediaCodec可以按照FFmpeg的编解码流程进行调用。

你可能感兴趣的:(音视频处理,MediaCodec)