Управление частотой кадров VirtualDisplay

Я пишу приложение для 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 и ограничить кадры, которые подаются наMediaCodec черезunlockCanvasAndPost(Canvas canvas) но эта функция никогда не вызывается в моем случае, так что, возможно, некоторые странности в том, как я расширилSurface и взаимодействие сParcel какwriteToParcel функцияявляется вызывается в моем случае, но это единственная функция, которая вызывается в моем случае (что я могу сказать).

Другое чтение предполагает, что я могу перейти от encoder -> decoder -> encoder и ограничить скорость, с которой второй кодер подает кадры, но это много дополнительных вычислений, которые я предпочел бы не делать, если бы мог этого избежать.

Кто-нибудь успешно ограничил скорость, с которойVirtualDisplay кормит егоSurface? Любая помощь будет принята с благодарностью!

Ответы на вопрос(2)

Ваш ответ на вопрос