我在我的项目中使用MediaCodec对摄像头中的视频进行编码。出于某些原因,我需要将KEY_I_FRAME_INTERVAL设置为0,这意味着录制的mp4视频中的每一帧都将是关键帧(关键帧包含整个图像,而不仅仅是与前一帧的增量差异)。
现在我遇到了问题:在nexus10、nexus7、小米redmi 2、华硕zenphone5、galaxy a5上一切正常。但联想vibe s1仅在关键帧间隔等于1秒的情况下进行录制。无论在mediaFormat中设置了什么值,我在mediaCodec.configure()中都使用了什么值。我试着设置0,1,5,10,但视频中的关键帧总是每30帧。
有什么办法解决这个问题吗?
更多信息,这里是我的mediaCodec编码器的设置:
videoCodec = MediaCodec.createEncoderByType(MIME_VIDEO_CODEC_H264);
MediaFormat videoFormat = MediaFormat.createVideoFormat(MIME_VIDEO_CODEC_H264, 1280, 720);
videoFormat.setInteger(MediaFormat.KEY_BIT_RATE, 3800000);
videoFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
videoFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
videoFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 0);
videoCodec.configure(videoFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
//using input surface to get input data from camera
inputSurface = new CodecInputSurface(videoCodec.createInputSurface());
videoCodec.start();发布于 2021-05-15 18:02:47
这个答案是迟来的,是基于观点的,但可能会有所帮助。
至于安卓中的许多其他事情,我认为这个KEY_I_FRAME_INTERVAL对编码器来说是一种“友好的建议”,而不是一种严格的设置。此API背后可能有数百个硬件编码器实现,一些更“僵化”的硬件编码器实现可能无法使用此设置,这可能就是您遇到问题的设备的情况。不过,这纯粹是一种猜测。
如果您的问题是在编码流中增加I帧频率,您可以考虑定期向MediaCodec实例提交PARAMETER_KEY_REQUEST_SYNC_FRAME设置。如果编码器能够使用除了I帧之间的“零秒”和“一秒”间隔之外的其他中间模式,这可能是实现更频繁的I帧(虽然不一定是它们的精确频率)的一种方式。
同样值得注意的是,自Android7.1以来,KEY_I_FRAME_INTERVAL接受浮点值。
发布于 2017-05-10 19:05:42
在渲染到编解码器之前,您应该对每一帧使用请求同步。
https://stackoverflow.com/questions/35134253
复制相似问题