用于屏幕截图的MediaProjection-如何更改分辨率?

时间:2018-12-20 02:05:48

标签: android mediarecorder screen-capture mediaprojection

使用以下示例代码块:

// 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 :(得分:1)

我想你可以参考这个      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);