背景

在逛b站的时候,发现一些视频的弹幕都在视频后面,不会遮挡人像,这样看起来很舒服。于是就想着,能不能自己实现一下呢?于是就有了这篇博客。

探究源码

1、通过调试控制台发现每个video标签都覆盖了个弹幕的div,这个div有个mask-image属性。这个属相包含了一张扣出的图片。推测就是通过这个属性实现的。

推测实现

  • 用户上传视频
  • b站后台通过AI将每一帧都进行语义分割,将人像扣出来,然后生成一张图片。
  • 将这张图片设置为mask-image属性,这样就可以实现弹幕不遮挡人像了。

实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <div class="test">
      <div class="video">
          <image src="./img_1.png"></image>
      </div>
      <div class="bpx-player-row-dm-wrap">
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>
          <p>丹佛爱死非农i阿富汗i哦21321死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2死非农i阿富汗i哦2</p>

      </div>

  </div>
</body>
<style>
    .test{
        width: 100%;
        height: 100vh;
        position: relative;
    }
    .video{
        position: absolute;
        width: 670px;
        height: 374px;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
    }
    .bpx-player-row-dm-wrap{
        position: absolute;
        width: 670px;
        height: 374px;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
        mask-image: url('./img_2.svg');
        mask-size: cover;
    }
</style>
</html>

效果图:

原图:

B站弹幕不遮挡人像实现_ide


遮罩图:

B站弹幕不遮挡人像实现_上传视频_02


效果图:

B站弹幕不遮挡人像实现_ide_03

长风破浪会有时,直挂云帆济沧海