MediaCodec 编码忽略我的 BUFFER_FLAG_SYNC_FRAME 标志

Pet*_*ter 4 android android-mediacodec

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

encoder.queueInputBuffer(..., MediaCodec.BUFFER_FLAG_SYNC_FRAME);
Run Code Online (Sandbox Code Playgroud)

在代码的后面,我检查同步帧:

encoder.dequeueOutputBuffer(bufferInfo, 0);
boolean isSyncFrame = (bufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME);
Run Code Online (Sandbox Code Playgroud)

问题是 isSyncFrame 永远不会得到真正的值。

我想知道我是否在编码配置中犯了错误。可能有更好的方法告诉编码器偶尔创建一个同步帧。

我希望这不是 MediaCodec 中的错误。预先感谢您的帮助。

Laj*_*nar 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);
Run Code Online (Sandbox Code Playgroud)

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

  • “OMX [] 没有提供一种方法来指定哪个输入帧应该被编码为同步帧”——这太疯狂了......所以我如何生成一个 iframe/关键帧以响应 RTCP PLI(数据包丢失) ? (2认同)