【发布时间】:2015-10-10 04:53:11
【问题描述】:
我正在编写一个 Android 应用程序,在其中,我有一个 VirtualDisplay 来镜像屏幕上的内容,然后我将屏幕上的帧发送到 MediaCodec 的一个实例。它可以工作,但是,我想添加一种指定编码视频的 FPS 的方法,但我不确定该怎么做。
根据我的阅读和实验,丢弃编码帧(基于呈现时间)效果不佳,因为它最终会出现块状/伪影,而不是较低帧速率的流畅视频。其他阅读表明,做我想做的事情(限制 FPS)的唯一方法是将传入的 FPS 限制为MediaCodec,但VirtualDisplay 只收到一个Surface,它是从MediaCodec 构造的下面
mSurface = <instance of MediaCodec>.createInputSurface();
mVirtualDisplay = mMediaProjection.createVirtualDisplay(
"MyDisplay",
screenWidth,
screenHeight,
screenDensity,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mSurface,
null,
null);
我还尝试对Surface 进行子类化,并限制通过unlockCanvasAndPost(Canvas canvas) 提供给MediaCodec 的帧,但该函数似乎从未在我的实例上调用过,因此,可能会有一些奇怪的方式我扩展了Surface 并与Parcel 的交互在我的实例上调用了writeToParcel 函数is,但这是在我的实例中调用的唯一函数(我可以说)。
其他阅读表明我可以从编码器 -> 解码器 -> 编码器开始并限制向第二个编码器馈送帧的速率,但如果可以避免的话,我宁愿不做很多额外的计算.
有没有人成功地限制了VirtualDisplay 向其Surface 提供信息的速率?任何帮助将不胜感激!
【问题讨论】:
标签: android android-mediacodec