Android平台H264硬编码遇到的坑

最近工作中需要集成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可用,在这个回调中,我们尽可能的创建出自己的线程将数据处理掉,不要在原回调的线程中处理(如果处理的慢,可能导致硬编解码器同时不再输出数据)。

你可能感兴趣的:(Android平台H264硬编码遇到的坑)