MediaProjection для захвата экрана - Как изменить разрешение? - PullRequest
0 голосов
/ 20 декабря 2018

Взять этот блок примера кода:

// from window manager
val recordWidth = screenWidth
val recordHeight = screenHeight

val projection: MediaProjection = // retrieved from API

val mediaRecorder = MediaRecorder().apply {
    setVideoSource(SURFACE)
    setOutputFormat(MPEG_4)
    setVideoFrameRate(frameRate) // e.g. 30
    setVideoEncoder(H264)
    setVideoSize(recordWidth, recordHeight)
    setVideoEncodingBitRate(videoBitRate)
    setOutputFile(outputFile)
    prepare()
}

val virtualDisplay: VirtualDisplay = projection?.createVirtualDisplay(
        "Example",
        screenWidth,
        screenHeight,
        screenDensity,
        VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
        mediaRecorder.surface,
        null,
        null
)

mediaRecorder.start()

Это все работает хорошо, если screenWidth и screenHeight соответствуют показаниям дисплея.

Если я изменю recordWidth и recordHeight (которые передаются в MediaRecorder с setVideoSize(Int, Int)), то все идет не так. Записанное видео обычно содержит только верхнюю левую часть общего экрана.

Итак, мои основные вопросы:

  1. Нужно ли что-то особенное сделать дляуменьшить разрешение при записи экрана?Даже если я сохраню соотношение сторон экрана, оно не будет работать.
  2. Некоторые значения ширины / высоты вызывают сбой - есть ли API для получения поддерживаемых размеров записи экрана?Я знаю, что Camera предоставляет один, но на самом деле он не использует API-интерфейсы камеры.

1 Ответ

0 голосов
/ 08 апреля 2019

Я думаю, что вы можете сослаться на этот this.mMediaProjection = mMediaProjectionManager.getMediaProjection (resultCode, resultData);

    Log.d(TAG, "startRecording...");

    this.mVideoBufferInfo = new MediaCodec.BufferInfo();
    MediaFormat mediaFormat = MediaFormat.createVideoFormat(format, width, height);

    mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
    mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, FPS);
    mediaFormat.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 0);
    mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
...