mediacodec 相关问题
1.问题描述:在设置编码器帧率之后,发现把编码后的裸流(h264)存文件后播放是设置的帧率不一致,没有效果。
private MediaFormat initLowFrameEncodeFormat(String mime, int width, int height) {
MediaFormat format = MediaFormat.createVideoFormat(mime, width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, 2*1000*1000);
format.setInteger(MediaFormat.KEY_FRAME_RATE, 1);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Flexible);
return format;
}
解决方法: 裸流设置帧率是没有效果的,需要把视频流(h264)经mediamuxer放入mp4中才有效果,并且需编码的时候正确设置时间戳,
例如 1fps 的视频时间戳间隔为1s, 刚好1秒是1帧数据。
mTrackIndex = mMediaMuxer.addTrack(outputFormat);
mMediaMuxer.start();
2.问题描述:在设置编码器并开始(start)之后,第一次编码可以正常通过,第二次编码卡住了,两次都在同一个初始化的编码器,没有断开重新开始。
解决方法: 在偶然的调试中才发现,初始化编码器并开始后,往queue里面放数据的时候(queueInputBuffer)时间戳一定要大于上一次放的数据,
要不然就会stuck在dequeueOutputBuffer,导致不能继续编解码,当然还有一个办法就是每一组数据的编码完成后,停止编码器,对新的需要编码的数据重新开始一个编码器,
还有个更好的办法其实在每次完成编解码后调用codec.flush(),清理掉缓存,相当与回到初始状态。