在我的android应用程序中,我正在使用mediacodec以webm(vp8)格式编码一些媒体。编码按预期工作。但是,我需要确保偶尔创建一个同步帧。以下是我的工作:

encoder.queueInputBuffer(..., MediaCodec.BUFFER_FLAG_SYNC_FRAME);

稍后在代码中,我检查同步帧:
encoder.dequeueOutputBuffer(bufferInfo, 0);
boolean isSyncFrame = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME);

问题是issyncframe永远不会得到一个真正的值。
我想知道我的编码配置是否出错。也许有更好的方法告诉编码器每隔一段时间创建一个同步帧。
我希望这不是mediacodec中的错误。提前谢谢你的帮助。

最佳答案

使用Mediacodec编码器请求按需同步帧是没有办法的(从Android4.3开始)。这在一定程度上是由于omx,android的底层编解码器实现,它没有提供一种方法来指定哪些输入帧应该编码为同步帧;尽管它有一种方法可以“在不久的将来”触发同步帧。
feisal的答案是目前唯一支持的控制同步帧的方法,但您必须在配置时这样做。
==编辑Re:Jesup
您可以在不久的将来使用mediacodec.setparameter触发同步帧:

Bundle params = new Bundle();
params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);

mCodec.setParameters(syncFrame);

不幸的是,在mediacodec中没有(可靠的)方法来判断编码缓冲区是否是同步帧,而不是通过检查字节码来自己完成。

09-11 19:32
查看更多