MediaCodec编码忽略我的BUFFER_FLAG_SYNC_FRAME标志

时间:2013-10-09 00:17:16

标签: android mediacodec

在我的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中的错误。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

使用MediaCodec编码器请求按需同步帧没有(Android 4.3的当前版本)方式。部分原因是由于OMX(Android中的底层编解码器实现),它没有提供指定哪个输入帧应编码为同步帧的方法;虽然它有一种方法可以“在不久的将来”触发同步帧。

feisal的答案是目前唯一支持控制同步帧的方法,但您必须在配置时进行此操作。

==编辑re:jesup

您可以使用MediaCodec.setParameter:

在不久的将来触发同步帧
Bundle params = new Bundle();
params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);

mCodec.setParameters(syncFrame);

不幸的是,没有(可靠的)方法告诉M​​ediaCodec编码缓冲区是否是一个同步帧,而不是通过检查字节码来自己做。

答案 1 :(得分:1)

您可以通过setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,int secs_between_iframes)设置编码器的MediaFormat对象中的I帧速率;