我正在尝试实现屏幕录像机。我关注了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是一个很棒的教程,但是我被困住了。
请提出解决方案或其他可行方法。我现在呆了好几天。
答案 0 :(得分:1)
我认为正确的方法如下:
创建具有oes纹理的SurfaceTexture。
将VirtualDisplay连接到在步骤1中创建的表面纹理,这样框架将转到oes纹理
在表面纹理上注册onFrameAvailable侦听器,然后您将连续获得回调
将oes纹理中的帧渲染到编码器的输入表面。
关键过程是步骤4。在渲染过程中,您可以通过修改纹理坐标来裁剪帧。
下面有一个裁剪示例: Crop video before encoding with MediaCodec for Grafika's "Continuous Capture" Activity