Управление частотой кадров 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
? Любая помощь будет принята с благодарностью!