使用 canvas 绘制视频

使用 canvas 绘制视频

安卓/ios 对 video 兼容较差,使用 canvas 可以很好的解决播放/全屏/自定义控件问题

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=640,user-scalable=0,target-densitydpi=device-dpi" />
        <style>
            * {
                margin: 0;
                padding: 0;
            }
          .controls {
            margin: 10px;
          }
          .controls button {
            padding: 5px 10px;
            margin-right: 10px;
            border: none;
          }
          video {
            width: 375px;
            height: 160px;
          }
        </style>
    </head>

    <body>
      
      <div class="controls">
        <button id="play">播放</button>
        <button id="paused">暂停</button>
        <button id="hide-video">显示/不显示video</button>
      </div>
        
      <canvas
          id="canvas"
          width="375"
          height="160"
          style="background: #000"
      ></canvas>
      <video
          id="video"
          style="display: auto"
          width="100%"
          preload="auto"
          controls
          muted="true"
          playsInline="true"
          webkit-playsinline="true"
          x-webkit-airplay="true"
          x5-video-player-type="h5"
          x5-video-player-fullscreen="false"
          x5-video-orientation="portraint"
      >
          <source src="https://assets.monogogo.cn/video/1598320823944_cps.mp4" type="video/mp4"></source>
      </video>
    </body>

    <script>
      var canvas = document.getElementById('canvas')
      var video = document.getElementById('video')
      var play = document.getElementById('play')
      var paused = document.getElementById('paused')
      var hide = document.getElementById('hide-video')
      var ctx = canvas.getContext('2d')
      var animation = null;

      play.addEventListener('click', function() {
        video.play()
        draw(video, canvas, ctx)
      })

      paused.addEventListener('click', function() {
        video.pause()
      })

      hide.addEventListener('click', function() {
        if(video.style.display === 'none') {
          video.style.display = ''
        } else {
          video.style.display = 'none'
        }

      })

      function draw(video, canvas, ctx) {
        if(video.paused || video.ended) {
          cancelAnimationFrame(animation)
        }
        ctx.drawImage(video, 0, 0, 375, 160)
        animation = requestAnimationFrame(function() {
          draw(video, canvas, ctx)
        })
      }
    </script>

</html>

Read more

Flutter入门指南

Flutter入门指南

Flutter 是一个由 Google 开发的开源移动应用开发框架。它允许开发者使用一套代码同时构建 iOS 和 Android 应用,并且提供了丰富的 UI 组件和高效的开发工具,使得开发者能够快速构建出高性能的跨平台应用。 一、Flutter 的实现原理 Flutter 的核心在于其自带的高性能渲染引擎 Skia。不同于其他框架依赖于原生的 UI 组件,Flutter 直接通过 Skia 渲染引擎将所有组件绘制到屏幕上。这种方式保证了跨平台应用在 iOS 和 Android 上的表现完全一致。 1.1 结构概览 Flutter 的架构分为三层: 1. Framework(框架层): 这部分主要由 Dart 编写,提供了 Flutter 的各种 UI 组件(Widget)、手势检测、渲染层以及动画等。

By Lewis
Certbot Let's Encrypt 证书自动续期

Certbot Let's Encrypt 证书自动续期

安装 Certbot yum install epel-release -y yum install certbot -y certbot certonly //生成证书 certbot renew //续期 certbot certificates //查看证书 域名验证插件 https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au 下载 $ git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au $ cd certbot-letencrypt-wildcardcertificates-alydns-au $ chmod 0777 au.sh 配置 DNS API 密钥: 这个 API 密钥什么意思呢?由于需要通过 API 操作阿里云 DNS,

By Lewis