代码之家  ›  专栏  ›  技术社区  ›  afollestad

用于屏幕捕获的MediaProjection-如何更改分辨率?

  •  0
  • afollestad  · 技术社区  · 6 年前

    以这段代码为例:

    // 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()
    

    只要 屏幕宽度 屏幕高度 与显示器的匹配。

    如果我改变 记录宽度 记录高度 (传递给 MediaRecorder 具有 setVideoSize(Int, Int) ),然后一切都错了。 录制的视频往往只包含整个屏幕的左上部分。

    所以我的主要问题是:

    1. 是否需要做一些特殊的事情来降低分辨率 录制屏幕?即使我保持长宽比 屏幕,好像没用。
    2. 某些宽度/高度值会导致 崩溃-是否有API来检索支持的屏幕录制 尺寸?我知道 Camera 提供了一个,但这并不是真正使用 相机API。
    0 回复  |  直到 5 年前
        1
  •  1
  •   Dong Thang    5 年前

    我想你可以参考一下。 this.mmediprojection=mmediprojectionmanager.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);