我使用MediaProjection API在Android中录制屏幕。我想隐藏录制内容的视图,因此我制作了一个表面视图并制作了一个安全的视图。问题是视图出现在黑色背景的录制中而不是隐藏。
有没有办法完全隐藏视频...因为它是不可见的?
答案 0 :(得分:0)
我试图做同样的事情,但不幸的是我找不到干净的方法。我的解决方案需要对已记录的帧进行后处理,并且仅在您要隐藏的图层是半透明叠加层时才有效(所有像素必须具有alpha <1)。
我们的想法是反转Android视图合成器执行的Alpha混合。
让 Cred , Cgreen , Cblue 和 Calpha 成为叠加层的颜色组件,让 Bred , Bgreen , Bblue 是背景中任何内容的颜色成分。每个像素在帧中显示的最终颜色由以下公式给出:
Ored = Bred * (1 - Calpha) + Cred * Calpha
Ogreen = Bgreen * (1 - Calpha) + Cgreen * Calpha
Oblue = Bblue * (1 - Calpha) + Cblue * Calpha
如果您想要隐藏覆盖层的确切位图,则可以重建背景颜色,如下所示:
Bred = (Ored - Cred * Calpha) / (1 - Calpha)
Bgreen = (Ogreen - Cgreen * Calpha) / (1 - Calpha)
Bblue = (Oblue - Cblue * Calpha) / (1 - Calpha)
当然,在此过程中会丢失一些信息,因为颜色最终会转换为8位整数。因此,重建可以产生视觉伪像,但它应该总是看起来比黑色覆盖更好。根据覆盖的alpha通道,工件将或多或少地显着(alpha值接近0将允许您更准确地重建背景颜色。)
这仅适用于全分辨率图像。任何类型的缩放或有损压缩都会破坏这种技术。由于存储限制,如果在着色器传递中使用SurfaceTexture实时执行此后处理可能是可行的。