相比于IOS健全的多媒体库,Android的多媒体库就显得非常的发育不全了,视频录制在安卓手机上是一个比较有挑战性的问题,当然我这里说的并不是那种用MediaRecorder做视频录制,那种说实话太low,很固化,灵活性为0。但是现在应用市场音视频的app比比皆是,视频录制在这类音视频应用中又是一种必须,虽然,安卓提供的音视频库是那么的“不堪”,但是,录制视频还是可行的。

抛开刚刚说的MediaRecorder不谈,一个安卓录制视频app中一共有两种不同的录制方式,但基本原理都是一样,都是通过视频的编码器将摄像头数据编码成视频文件。第一种方式叫做buffer录制,第二种是surface录制。buffer录制是将摄像头数据传递给编码器encode,然后在output出来编码出来的数据,最后写入视频文件。surface录制是将摄像头数据通过egl和opengl在编码器的surface中绘制,然后获取surface绘制的buffer,最后写入视频文件。对于音频的录制,buffer和surface方式的音频录制都一样,所以下面我只会在surface录制中讲音频录制。

可能有些小伙伴很疑惑,为什么一个app中视频录制需要两种方式都要呢?这就是因为繁杂的安卓机器问题了,虽然绝大部分手机支持两种录制,但是某些vivo/魅族手机却只支持buffer录制,当然从效率性能各方面上,surface录是比较好的,但遇到不支持的手机,也只能用buffer录制了。

视频录制分为两篇文章来说。在看这两篇文章之前,当然需要一些技术准备啦。首先需要对Android多媒体库有一些了解,其中关键的几个类是MediaCodec(编解码器),MediaMuxer(音视频合成器)等,其次需要一定OpenGL知识,然后对EGL需要一定的了解,知道它的基本使用流程(至少也要知道EGL是干什么的吧),最后录制过程中会涉及到很多线程逻辑,为了与时俱进,文章中的线程逻辑都是基于Java5的多线程模型Callable, Lock, Condititon这些类请务必要熟悉,此外摄像头Camera和GLSurfaceView/SurfaceView这些安卓基础也是必备的,这些知识都在视频录制的过程中用到。

另外的,我会在第一篇surface录制中讲述音频相关的录制,由于在buffer录制中音频录制是一样的,所以在buffer录制中就不再讲述音频的录制,只详述视频数据的录制。