最近工作中需要集成Android平台的H264硬编解码,下面总结下使用中遇到的坑:
I帧请求
在编码第一帧时,需要设置I帧请求。
如果不小心每次都请求I帧,会导致编码器数据输出的码率过高。
编解码支持格式
在使用前一定要关心硬编解码器支持的格式,可能会出现设置的格式不支持,导致输出的格式不是自己需要的格式。可以使用下面的代码获取支持列表
//编码器
MediaCodec mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
int[] colorful = mediaCodec.getCodecInfo().getCapabilitiesForType("video/avc").colorFormats;
//解码器
MediaCodec mediaCodec = MediaCodec.createDecoderByType(MIME_TYPE);
int[] colorful = mediaCodec.getCodecInfo().getCapabilitiesForType("video/avc").colorFormats;
解码器的输出长宽
在有的硬解码器上发现1920*1080
的H264码流,输出宽高为1920*1088
,这部分原因应该为mod 16导致。遇到这种情况,需要对数据进行相应的处理。
这部分数据可以通过输出格式变化的回调函数onOutputFormatChanged
来确定。
编解码数据获取
编解码器的输出,都是通过回调告知我们队列中的哪个buffer
可用,在这个回调中,我们尽可能的创建出自己的线程将数据处理掉,不要在原回调的线程中处理(如果处理的慢,可能导致硬编解码器同时不再输出数据)。