在Android中记录屏幕的选定区域

时间:2019-02-20 05:59:24

标签: android opengl-es grafika android-mediacodec

我正在尝试实现屏幕录像机。我关注了grafika。只需将Surface从encoder.getInputSurface()分配给VirtualDisplay就可以了。现在,我的任务是对屏幕的特定部分进行编码。因此,我试图使用SurfaceTexture修改编码器的输入Surface(我认为这是正确的方法)。但是我无法使用创建的表面来记录屏幕,当我将此表面传递给VirtualDisplay时,我没有得到任何回调。 我也尝试过使用grafika的TextureMovieEncoder进行录制,但可能是我不知道正确的方法。

我试图通过下面的用户链接来理解。 How does an output surface of a Decoder is passed to an input surface of an Encoder?

Android: Is it possible to create a SurfaceTexture without a SurfaceView?

我确信grafika是一个很棒的教程,但是我被困住了。

请提出解决方案或其他可行方法。我现在呆了好几天。

1 个答案:

答案 0 :(得分:1)

我认为正确的方法如下:

  1. 创建具有oes纹理的SurfaceTexture。

  2. 将VirtualDisplay连接到在步骤1中创建的表面纹理,这样框架将转到oes纹理

  3. 在表面纹理上注册onFrameAvailable侦听器,然后您将连续获得回调

  4. 将oes纹理中的帧渲染到编码器的输入表面。

关键过程是步骤4。在渲染过程中,您可以通过修改纹理坐标来裁剪帧。

下面有一个裁剪示例: Crop video before encoding with MediaCodec for Grafika's "Continuous Capture" Activity