视频动态滚动水印制作,滚动的水印字幕

博客介绍了如何优化微信小程序中的水印滚动效果,从使用定时器每秒刷新30帧导致的性能问题,转变为利用CSS动画实现。在非全屏状态下水印15秒内匀速滚动,全屏状态下25秒内完成。通过这种方式,性能得到了显著提升,实现了丝滑流畅的滚动体验。同时,文章提到了在H5端的iOS全屏下可能遇到的显示问题。

先看整体效果水印效果

需求分析:

①要求水印每隔10秒钟出现一次

②水印每次出现的高度为随机值

②切换全屏也是一样

那么我们字幕可以给水印定位,然后充分用到定时器改变left值来完成
shuiyin() {
  // 获取屏幕宽和高
  var windowWidth = wx.getSystemInfoSync().windowWidth
  var screenHeight = wx.getSystemInfoSync().screenHeight
  console.log('屏幕宽和高',windowWidth, screenHeight);
  clearInterval(this.data.test_left);
  var flag = true; // 切换条件
  var start = 0; // 起始值
  let that = this;

  // 获取动态水印显示什么内容
  let nickName = wx.getStorageSync("userInfo").nickName;
  let phone = wx.getStorageSync("phone") || "";
  const date = new Date();
  const y = date.getFullYear();
  let m = date.getMonth() + 1;
  m = m < 10 ? `0${m}` : m;
  let d = date.getDate();
  d = d < 10 ? `0${d}` : d;
  let _timer = y + "-" + m + "-" + d;

  // 判断是否是全屏状态来确定水印要运行的宽度
  if (!that.data.controls_fullScreen) {
    var num = windowWidth; // 加到屏幕宽度最大值(非全屏)
    var _zNnm = Math.floor(Math.random() * (200 - 20 + 1)) + 10 // 随机高度
  } else {
    var num = screenHeight; // 全屏状态下手机高度就是水印要走的宽度
    var _zNnm = Math.floor(Math.random() * ((windowWidth - 50) - 20 + 1)) + 10;
  }
  function test() {
    if (flag) {
      ++start;
      // 水印滚到了屏幕的最边界处停止滚动,并且计时10秒
      if (start == num) {
        flag = false;
        clearInterval(that.data.test_left)
        // 水印走完后开始计时10秒
        that._waterMark()
      }
    }
    that.setData({
      left: start,
      top: _zNnm,
      shuiying_cont: nickName + "-" + phone + "-" + _timer,
    });
  }
  this.data.test_left = setInterval(function () {
    test(); // 每秒刷新30帧
  }, 1000 / 30);
},

判断是否是全屏状态
// 微信小程序video组件内部方法,监听是否全屏
bindfullscreenchange(e) {
  console.log(e.detail.detail.fullScreen);
  let fullScreen = e.detail.detail.fullScreen; //值true为进入全屏,false为退出全屏
  if (!fullScreen) {
    //退出全屏
    this.setData({
      controls_fullScreen: false,
    });
  } else {
    //进入全屏
    this.setData({
      controls_fullScreen: true,
    });
  }
  this.shuiyin();
},

计时每隔10秒种出现一次水印
// 每隔10秒重新调用一次水印
  _waterMark() {
      setTimeout(()=> {
        this.shuiyin() 
      },10000) 
  },

性能问题

此水印采用定时器每秒刷新30帧,性能消耗非常大,可能导致页面卡顿,体验很差

那么我们可以改良一下,丢弃定时器每秒刷新30帧,采用css动画来实现

实现思路。让每一次动画只执行完成一次就移除样式,js开始计时10秒重新添加当前动画样式,小编这里非全屏与动画保持一致 15秒后开始计时等待10秒下次出现的时间。全屏则为25秒后等动画结束开始等待10秒(与动画同步)
css部分
/* 非全屏状态下-15秒内匀速滚动完 */
.shuiyin_style {
  opacity: 0.45;
  white-space: nowrap;
  z-index: 998;
  position: absolute;
  color: #b9b8b8;
  font-size: 24rpx;
  animation: mymove 15s linear;
  /*Safari 和 Chrome:*/
  -webkit-animation: mymove 15s linear;
}

/* 全屏状态下-25秒内匀速滚动完 */
.shuiyin_style_y {
    opacity: 0.45;
    white-space: nowrap;
    z-index: 998;
    position: absolute;
    color: #b9b8b8;
    font-size: 24rpx;
    animation: mymove 25s linear;
    /*Safari 和 Chrome:*/
    -webkit-animation: mymove 25s linear;
}

/* 动画帧 */
@keyframes mymove {
    from {
        left: 0%
    }

    to {
        left: 100%
    }
}

/*Safari 和 Chrome:*/
@-webkit-keyframes mymove {
    from {
        left: 0%
    }

    to {
        left: 100%
    }
}
wxml部分
<!-- 非全屏状态下 -->
<text wx:if="{{!controls_fullScreen}}" class="{{shuiyin_style_display == true ? 'shuiyin_style' : 'shuiyin_display'}}" style="top: {{top}}px;">{{shuiying_cont}}</text>
<!-- 全屏状态下 -->
<text wx:else="{{controls_fullScreen}}" class="{{shuiyin_style_display == true ? 'shuiyin_style_y' : 'shuiyin_display'}}" style="top: {{top}}px;">{{shuiying_cont}}</text>
js部分
shuiyin() {
    // 切换视频或者等先清除掉定时器 
    clearTimeout(this.data.__sy1)
    clearTimeout(this.data.__sy2)
    // 获取屏幕宽和高
    var windowWidth = wx.getSystemInfoSync().windowWidth
    var screenHeight = wx.getSystemInfoSync().screenHeight
    console.log('屏幕宽和高', windowWidth,  screenHeight);
    let that = this;
    // 获取当前用户信息水印显示内容
    let nickName = wx.getStorageSync("userInfo").nickName;
    let phone = wx.getStorageSync("phone") || "";
    const date = new Date();
    const y = date.getFullYear();
    let m = date.getMonth() + 1;
    m = m < 10 ? `0${m}` : m;
    let d = date.getDate();
    d = d < 10 ? `0${d}` : d;
    let _timer = y + "-" + m + "-" + d;
    if (!that.data.controls_fullScreen) {
      var _zNnm = Math.floor(Math.random() * (200 - 20 + 1)) + 10
    } else {
      var _zNnm = Math.floor(Math.random() * (( windowWidth - 50) - 20 + 1)) + 10;
    }

    that.setData({
      top: _zNnm,
      shuiying_cont: nickName + "-" + phone + "-" + _timer,
      shuiyin_style_display: true
    });
    if (!this.data.controls_fullScreen) { // 非全屏下调用
        this.data.__sy1 = setTimeout(()=> { 
          that.setData({
              shuiyin_style_display: false
            },()=>{
              console.log("开始计时下次水印出现的时间~非全屏");
              that._waterMark()
            });
        },15000) 
    } else { //全屏下调用
      this.data.__sy1 = setTimeout(()=> {
          that.setData({
              shuiyin_style_display: false
            },()=>{
              console.log("开始计时下次水印出现的时间~全屏");
              that._waterMark()
            });
        },25000) 
    }
  },
  _waterMark() {
    this.data.__sy2 = setTimeout(()=> {
      this.shuiyin()
    },10000) 
  },

结束语

至此两种实现方式就完成了,css实现的效果性能要比定时器性能提升一倍不止,而且丝滑流畅

在h5网页端缺点(微信小程序较完美)

倘若再 h5端 ios全屏下,水印层级权限过低,导致无法显示,(微信小程序较完美)有解决办法还请积极留言~

<think>好的,用户想去除视频中的动态文字水印,我需要结合提供的参考资料和现有技术来给出解决方案。首先,用户提到的引用[1]说明了去除水印的一般方法,比如图像修复、遮罩生成和内容填充。动态文字水印通常位置固定,但可能随时间变化,比如滚动或闪烁,所以需要逐帧处理。 接下来,引用[2]提到使用FFmpeg加水印的方法,这可能对去水印有启发。虽然FFmpeg主要用于处理视频,但结合滤镜功能,比如用delogo滤镜覆盖水印区域,可能有效。需要确认delogo是否支持动态位置,如果水印位置固定,这方法可行。如果动态变化,可能需要更复杂的处理,比如跟踪水印位置。 引用[3]和[4]提到了Python和JS的工具,比如quququ.cn网站和Python脚本。Python的OpenCV库适合逐帧处理,通过图像修复算法(如inpaint)来去除水印。但动态水印可能需要每帧检测位置,可能需要机器学习模型来识别水印区域,这对普通用户来说可能复杂。 用户可能需要分步骤指导:固定位置水印用FFmpeg的delogo,动态位置则需要逐帧处理。此外,第三方工具如HitPaw或在线平台可能更方便,但可能有次数限制或费用问题。 还需要注意法律问题,去除水印可能侵犯版权,要提醒用户合法使用。最后,生成相关问题,比如优化效果、自动化处理或替代方案,帮助用户进一步探索。</think>### 去除视频动态文字水印的方法 #### 1. **固定位置水印:使用FFmpeg的`delogo`滤镜** 如果动态文字水印的位置固定(例如始终在左上角或右下角),可以使用FFmpeg的`delogo`滤镜覆盖水印区域。 **操作步骤**: ```bash ffmpeg -i input.mp4 -vf "delogo=x=100:y=50:w=200:h=50:show=0" output.mp4 ``` - `x`和`y`为水印区域的左上角坐标 - `w`和`h`为覆盖区域的宽度和高度 - `show=0`表示隐藏覆盖过程 此方法通过模糊或填充矩形区域遮盖水印,但可能导致画面局部模糊[^2]。 #### 2. **动态位置水印:逐帧修复(Python+OpenCV)** 若水印位置随时间变化(如滚动字幕),需逐帧检测并修复。 **示例代码框架**: ```python import cv2 video = cv2.VideoCapture("input.mp4") fps = video.get(cv2.CAP_PROP_FPS) width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) output = cv2.VideoWriter("output.mp4", cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height)) while True: ret, frame = video.read() if not ret: break # 检测水印区域(需自定义坐标或使用目标检测模型) x1, y1, x2, y2 = 100, 50, 300, 100 # 使用图像修复算法(如inpaint) mask = np.zeros(frame.shape[:2], np.uint8) mask[y1:y2, x1:x2] = 255 repaired_frame = cv2.inpaint(frame, mask, 3, cv2.INPAINT_TELEA) output.write(repaired_frame) video.release() output.release() ``` - **难点**:需精确识别水印位置,可能需要训练目标检测模型(如YOLO)[^3]。 #### 3. **使用第三方工具** - **HitPaw水印去除器**:支持视频动态水印擦除,通过AI自动识别并修复 - **在线工具(如quququ.cn)**:上传视频后框选水印区域,但可能有分辨率限制或付费要求。 #### 4.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值