Я пишу приложение для Android, и в нем у меня есть VirtualDisplay
, чтобы отразить то, что на экране, и затем отправлю кадры с экрана на экземпляр MediaCodec
. Он работает, но, Я хочу добавить способ указания FPS закодированного видео, но я не уверен, как это сделать.Управление частотой кадров в VirtualDisplay
Из того, что я читал и экспериментировал, отбрасывание закодированных кадров (в зависимости от времени представления) не очень хорошо работает, поскольку оно заканчивается видеоизображением с блочным/артефактом, а не гладким видео с меньшей частотой кадров. Другое чтение предполагает, что единственный способ сделать то, что я хочу (ограничить 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
функция вызвала мой экземпляр, но это это единственная функция, которая вызывается в моем экземпляре (что я могу сказать).
Другие чтения показывают, что я могу перейти от кодировщика -> декодер -> кодер и ограничить скорость, в которой второй кодер будет передаваться кадрами, но это много дополнительных вычислений, которые я бы предпочел не делать, если я могу избежать Это.
Кто-нибудь с успехом ограничил курс, по которому VirtualDisplay
4 передает свои Surface
? Любая помощь будет принята с благодарностью!
Благодарим вас за вход fadden! Звучит неплохо (почему я не подумал об этом?). Я инженер по графике, поэтому я должен быть хорошо настроен с помощью OpenGL-запросов на построение текстуры и т. Д. И т. Д. Я дам этот снимок и отчитаюсь. – EncodedNybble
Итак, я заметил, что SurfaceTexture обрабатывает свои обратные вызовы на фрейме, получая сообщение либо в текущем петлере, либо в петлевом потоке пользовательского интерфейса, либо в нет. Что ... интересно. Хотелось бы указать способ обработчика или петлителя. Поскольку я выполняю всю эту работу в HandlerThread, это потребует некоторой работы. – EncodedNybble
Просто отправьте сообщение. Типичная реализация 'onFrameAvailable()' выглядит следующим образом: https://github.com/google/grafika/blob/master/src/com/android/grafika/TextureFromCameraActivity.java#L668 – fadden