当前位置: 首页 > 科技观察

使用MASK实现视频弹幕角色的掩码过滤

时间:2023-03-20 13:47:13 科技观察

经常看一些LOL游戏直播的朋友一定知道,在一些弹幕网站(哔哩哔哩、虎牙),当角色和弹幕一起出现时,弹幕会“巧妙地”隐藏在下面人物,看起来很聪明。一个简单的截图例子:其实这是通过CSS中的MASK属性实现的。在介绍mask的简单用法之前,很多文章都提到了mask。更详细的是——精彩的CSSMASK[1]。本文不过多解释mask的基本概念。如果您对用法感到困惑,可以去看看。这里只是简单介绍一下mask的基本用法:mask最基本的使用方式就是使用图片,像这样:{/*Imagevalues*/mask:url(mask.png);/*使用位图作为图片mask*/mask:url(masks.svg#star);/*使用SVG图形中的shape做mask*/}当然,图片的使用方式后面会讲到。图片的使用方式其实还是比较繁琐的,因为我们要先准备好相应的图片素材。除了图片,mask还可以接受一个类似于background的参数,那就是gradient。类似于下面的使用方法:{mask:linear-gradient(#000,transparent)/*使用渐变做一个mask*/}如何使用呢?一个很简单的例子,上面我们创建了一个从黑色到透明的渐变色,我们在实践中使用,代码类似这样:下图叠加了一个从透明到黑色的渐变,{background:url(image.png);mask:linear-gradient(90deg,transparent,#fff);}应用mask后会变成这样:在这个DEMO中,你可以简单了解mask的基本用法。使用遮罩最重要的结论来了:添加了遮罩属性的元素,其内容会与遮罩所代表的渐变的透明部分重叠,重叠部分会变成透明。值得注意的是,上面的渐变使用的是linear-gradient(90deg,transparent,#fff),这里的#fff纯色部分其实可以换成任何颜色都不影响效果。CodePenDemo--MASK的基本使用[2]使用mask实现字符蒙版过滤了解了mask的用法之后,接下来我们使用mask来简单实现一下,在视频弹幕中,当弹幕碰到一个字符时,会自动隐藏和过滤的例子。首先,我简单模拟了一个召唤师峡谷和一些基本的弹幕:为了方便,这里使用了一张静态图片,展示了召唤师峡谷的地图,不是真实的视频,而且弹幕是一个一个的元素,一致与实际情况。伪代码大概是这样的:

6666
...6666
为了模拟实际情况,我们用一个div来添加一个实际的字符。如果我们不做任何处理,其实就是我们看视频打开弹幕时的感觉。角色被视频挡住:注意,这里我添加了一个角色亚索,用动画模拟了简单的移动,移动过程中,角色被弹幕覆盖。接下来,您可以索取口罩。我们用mask做一个radial-gradient,让角色附近透明,根据角色移动的动画,在mask的mask-position添加同样的动画。最后可以得到这样的效果:.g-barrage-container{position:absolute;mask:radial-gradient(circleat100px100px,transparent60px,#fff80px,#fff100%);animation:mask10sinfinitealternate;}@keyframesmask{100%{mask-position:85vw0;}}其实就是给放置弹幕的容器添加一个mask属性,标记角色的位置,根据角色的移动不断改变mask。我们把mask换成背景,原理一目了然。把蒙版换成背景示意图:背景的透明部分,也就是蒙版的透明部分,其实就是会隐藏弹幕的部分,其他的白色部分,弹幕是不会被隐藏的隐藏,这是一个完美的使用掩码属性。事实上,这项技术与视频本身无关。我们只需要根据视频计算,计算出需要屏蔽弹幕的位置,得到对应的mask参数即可。如果去掉背景和移动人物,只保留弹幕和遮罩,是这样的:需要明确的是,使用遮罩并不是遮住弹幕部分,而是用遮罩来指定哪些部分在下面弹幕容器正常显示,哪些部分透明隐藏。最后,完整的demo可以点击这里:CodePenDemo——mask实现弹幕字符屏蔽过滤[3]实际生产环境中的应用当然,上面我们只是简单还原了使用mask实现弹幕屏蔽过滤的效果。但实际情况比上面的场景要复杂得多,因为人物和英雄的位置是不确定的,每时每刻都在变化。所以在实际的生产环境中,mask图像的参数实际上是由后端对视频进行实时处理计算出来的,然后传递给前端进行渲染。对于使用该技术的直播网站,我们可以查看元素,包裹弹幕的容器mask属性每时每刻都在变化:返回的其实是一张SVG图片,长这样:,根据真实-视频人物的时间位置变化,不断计算新的掩码,然后实时作用于弹幕容器,实现掩码过滤。最后,本文到此结束,希望对你有所帮助:),本文介绍了一个非常有意义的cssmask在实际生产环境中的实践,同时也展示了很多新的css技术仍然可以带来商业收益如果使用得当。非常有帮助和帮助。更多精彩的CSS技术文章汇总在我的Github——iCSS[4],持续更新中。欢迎点个星订阅收藏。有什么问题或者建议可以多交流。原创文章文笔有限,知识匮乏。如果文章中有任何不准确的地方,请告诉我。参考资料[1]FantasticCSSMASK:https://github.com/chokcoco/iCSS/issues/80[2]CodePenDemo--MASK的基本使用:https://codepen.io/Chokcoco/pen/YzwZbLQ[3]CodePenDemo--mask实现弹幕字符屏蔽过滤:https://codepen.io/Chokcoco/pen/MWbyjoX[4]Github--iCSS:https://github.com/chokcoco/iCSS