自从Cisco 宣布旗下的H264 Codec开源为OpenH264,并且替所有OpenH264的使用者支付了H264的专利费,WebRTC也随即对h264进行了支持, 在Android平台, 软编用 OpenH264, 软解用FFMPGE, 硬编硬解用 MediaCodec. 在android和iOs中软编软解默认是禁止的,要想启用需要把OpenH264和FFMPGE编译进来,这样就会大大增加库的大小,况且软编软解比较费cpu,耗电量和发热都会增加,使用软编软解的好处是编解码不依赖于硬件,不存在设备适配问题。硬件编解码能够解决软编软解的痛处,但是存在设备适配问题,因为不同的设备使用的硬解码器不同,可能会导致编码失败及解码失败。以android为例,由于android厂商众多,使用的cpu芯片更是繁多,同一芯片厂商不同型号实现的硬解码器也有不同,这样就造成适配很困难,况且h264不是google推荐使用的编解码器(毕竟不是亲生的),所以在适配方面存在很多问题。
android中硬编码实现在MediaCodecVideoEncoder.java中,硬解码实现在MediaCodecVideoDecoder.java中,下面逐个分析
来看一下如何创建编码器:
boolean initEncode(VideoCodecType type, int profile, int width, int height, int kbps, int fps,
boolean useSurface) {
...
EncoderProperties properties = null;
String mime = null;
int keyFrameIntervalSec = 0;
boolean configureH264HighProfile = false;
if (type == VideoCodecType.VIDEO_CODEC_VP8) {
mime = VP8_MIME_TYPE;
properties = findHwEncoder(
VP8_MIME_TYPE, vp8HwList(), useSurface ? supportedSurfaceColorList : supportedColorList);
keyFrameIntervalSec = 100;
} else if (type == VideoCodecType.VIDEO_CODEC_VP9) {
mime = VP9_MIME_TYPE;
properties = findHwEncoder(
VP9_MIME_TYPE, vp9HwList, useSurface ? supportedSurfaceColorList : supportedColorList);
keyFrameIntervalSec = 100;
} else if (type =