android - 在android中记录屏幕的选定区域
问题描述
我正在尝试实现屏幕录像机。我跟着grafika。只需将 Surface 提供encoder.getInputSurface()
给 VirtualDisplay 即可。现在我的任务是对屏幕的某个部分进行编码。因此,我试图使用 SurfaceTexture 修改编码器的输入 Surface(我认为这是正确的方法)。但我无法使用创建的表面来记录屏幕,当我将此表面传递给 VirtualDisplay 时,我没有得到任何回调。我也尝试使用 TextureMovieEncoder(来自 grafika)进行录制,但可能我不知道正确的方法。
我试图通过以下有用的链接来理解。 解码器的输出表面如何传递到编码器的输入表面?
和
Android:是否可以在没有 SurfaceView 的情况下创建 SurfaceTexture?
而且我确信 grafika 是一个很棒的教程,但我被卡住了。
请提出解决方案或其他可行的方法。我现在被困了好几天。
解决方案
我认为正确的方法如下:
创建一个带有 oes 纹理的 SurfaceTexture。
将 VirtualDisplay 连接到步骤 1 中创建的表面纹理,因此 frame 将转到 oes 纹理
在surfacetexture上注册onFrameAvailable监听器,就会不断的得到回调
将 oes 纹理中的帧渲染到编码器的输入表面。
关键过程是第4步。在渲染过程中,可以通过修改纹理坐标来裁剪帧。
下面有一个裁剪示例: 使用 MediaCodec 为 Grafika 的“连续捕获”活动进行编码之前裁剪视频
推荐阅读
- vue.js - electronBuilder 根本无法捆绑我的资源
- github - 如何解决 docusaurus 纱线启动错误?
- rust - where 子句内的边界和“内联”边界之间的区别
- php - Whatsapp 分享链接未推送/打开至 whatsapp
- java - 在 JavaFX GraphicsContext 中禁用 alpha 混合
- python - Python Selenium 在后台不工作
- html - 视频背景无法在 iOS 设备上播放
- java - cassandra-env.sh 文件无法读取 JMX prometheus 参数
- java - 如何使用国家/地区时间明智地获取日期选择器日期时间
- javascript - 如何根据条件聚焦 JSF 组件?