在我的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中的错误。提前感谢您的帮助。
答案 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);
不幸的是,没有(可靠的)方法告诉MediaCodec编码缓冲区是否是一个同步帧,而不是通过检查字节码来自己做。
答案 1 :(得分:1)
您可以通过setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,int secs_between_iframes)设置编码器的MediaFormat对象中的I帧速率;