使用MediaCodec对相h机数据进行编码,存储为h264文件之后发现播放的视频长度与实际相比或变长或变短(跟机型有关高端手机会变长)。
尝试在初始化时改变帧率:mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mFrameRate);
或者在编码时对presentationTimeUs时间戳做调整:mMediaCodec.queueInputBuffer(int index, int offset, int size, long presentationTimeUs, int flags)都不能解决。
经查发现原因及解决方案如下:
原因:
https://stackoverflow.com/questions/36114808/android-setting-presentation-time-of-mediacodec
这是stackoverflow上的解释,简单来说由于输出的是纯H264的文件,是没有时间戳概念的,就是一堆流文件,所以如果手机配置低的话,由于编码时间过长(大于两次帧刷新间隔的话),会导致很多帧数据丢掉,所以最终的流文件播放出来就会短。反之高端手机由于处理时间短而且相机帧率又高的话就会导致播放时间变长。
解决方案:
1、使用MediaMuxer即混合器进行时间戳对齐;
2、把每一帧相机数据都存储在一个池子里,每帧都不遗漏,编码时每次去池子里取;这样的缺点是,由于时间差会导致池子里数据会越来越多,在点击“录制结束”时池子中的很多数据其实还没取完,即编码要在录制结束操作之后很长时间才完成。