我在我的项目中使用MediaCodec对来自相机的视频进行编码。由于某些原因,我需要将KEY_I_FRAME_INTERVAL设置为0,这意味着录制的mp4视频中的每一帧都将是一个关键帧(关键帧包含整个图像,而不仅仅是与前一帧的增量差异)。
在这里我遇到了问题:在nexus 10,nexus 7,xiaomi redmi 2,asus zenphone 5,galaxy a5一切正常。但lenovo vibe s1仅在关键帧间隔等于1秒的情况下进行录制。无论在mediaFormat中设置什么值,我在mediaCodec.configure()中使用的是什么。我试图设置0,1,5,10,但视频中的关键帧总是每30帧。
有任何想法如何解决这个问题?
有关详细信息,请参阅我的mediaCodec编码器设置:
REPLACE
答案 0 :(得分:0)
这个答案来晚了,而且是基于意见的,但可能会有所帮助。
至于 Android 中的许多其他内容,我认为此 KEY_I_FRAME_INTERVAL
更像是一种对编码器的“善意推荐”,而不是严格的设置。这个 API 背后可能有数百个硬件编码器实现,一些更“刚性”的和可能是旧的可能无法使用这个设置,这可能是您遇到问题的设备的情况。不过这纯属猜测。
如果您的问题是增加编码流中的 I 帧频率,您可以考虑定期向 MediaCodec 实例提交 PARAMETER_KEY_REQUEST_SYNC_FRAME
设置。如果编码器能够使用其他中间模式,而不仅仅是 I 帧之间的“零秒”和“一秒”间隔,这可能是实现更频繁 I 帧的一种方式(尽管不一定是它们的精确频率)。
还值得注意的是,由于 Android 7.1 KEY_I_FRAME_INTERVAL
接受浮点值。
答案 1 :(得分:-2)
你应该将KEY_I_FRAME_INTERVAL设置为1,这意味着每个KEY_FRAME_RATE一个关键帧。