4

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

4

2 回答 2

5

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

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

==编辑回复:jesup

您可以在不久的将来使用 MediaCodec.setParameter 触发同步帧:

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

mCodec.setParameters(syncFrame);

不幸的是,除了通过检查字节码自行执行之外,没有(可靠的)方法可以在 MediaCodec 中判断编码缓冲区是否是同步帧。

于 2013-10-16T00:14:15.690 回答
1

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

于 2013-10-15T06:56:49.090 回答