react中使用canvas播放视频

最近做个移动端视频需求,要求隐藏播放控件,并且可以自动播放而且隐藏播放控件(不太人性化),最后要有个定制的结束遮罩层用来人机交互。尝试直接用video标签做,但是各种坑啊,video永远是在页面的最顶层,所以播放控件的自定义化就凉凉了,怎么办呢?受以前做的一个利用canvas做视频直播的项目启发,尝试下canvas做视频播放,于是我抱着试一试的心态去查阅了相关资料,尼玛,还真的可以,而且原理很简单!

首先要解决在react中操作canvas的问题,众所周知,react和vue都是生成的虚拟dom,直接通过dom的API操作canvas是不现实的。npm上的一些库也是繁琐的像XX。。。我写了一个方法,在react的componentDidMount中利用react的ref把canvas直接传给这个方法,拿到了页面上的canvas,只要这个页面不卸载,我就可以为所欲为啦!直接上代码:

import React, { Component } from ‘react‘;
import ‘./App.css‘;
import {draw} from ‘./canvas‘
class App extends Component {

  componentDidMount() {
    if (this.canvas) {
        draw(this.canvas)
    }
  }

  render() {

    return <div style={{width: ‘100%‘,height: ‘auto‘}} id={‘scrollBox‘}>
      <canvas width=‘1280‘ height=‘720‘ ref={node => this.canvas = node} style={{width: ‘100%‘,height: ‘auto‘}}></canvas>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
      <p>我是测试我是测试</p>
    </div>;
  }
}

export default App;

   通过ref函数把canvas赋值给this.canvas,在componentDidMount钩子中传给canvas脚本文件绘制(注意,由状态动态生成的canvas可能拿不到这个dom,建议放到componentDidUpdate钩子中,不熟悉react生命周期的同学自行查阅官方文档),于是这个时候,我拿出了我的终极大杀器——canvas.js.好了,不吹牛皮,其实它就是一个非常简单的脚本,看看它的代码:

export const draw = (canvas) => {
    if (canvas) {
        //获取canvas上下文
        let ctx = canvas.getContext(‘2d‘);

        //创建video标签,并且设置相关属性
        let video = document.createElement(‘video‘);

        video.preload = true;
        video.autoplay = true;
        video.src=‘https://pic.ibaotu.com/00/92/91/90f888piCjkw.mp4‘;
        //document.body.appendChild(video);

        //监听video的play事件,一旦开始,就把video逐帧绘制到canvas上
        video.addEventListener(‘play‘,() => {
            let play = () => {
                ctx.drawImage(video,0,0);
                requestAnimationFrame(play);
            };

            play();
        },false)

        //暂停/播放视频
        canvas.addEventListener(‘click‘,() => {
            if (!video.paused) {
                video.pause();
            } else {
                video.play();
            }
        },false);
    }
}

  大概的思路就是我首先在内存中创建一个video标签并设置好相关属性,之后监听video的play事件,一旦开始播放,我就会通过requestAnimationFrame把video逐帧绘制到canvas上。由于真的有个video在播放视频,所以你会听到声音,但是,我并没有把它放到页面上,所以你看到的不是视频,而是一个没有声音的canvas!嘿嘿嘿O.o

  视频这样子处理,虽然依旧不能跨过谷歌和苹果爸爸对视频自动播放的限制,但是可以像操作普通div节点一样操作视频了,尤其是定制视频交互控件的样式,基本都可以满足产品的各种无厘头需求啦!最后献上我的页面

注意是有声音的‘视频’哦!

原文地址:https://www.cnblogs.com/zhangbob/p/10039440.html

时间: 2024-10-28 19:45:02

react中使用canvas播放视频的相关文章

对于微信内置浏览器中不能小窗播放视频原因的分析以及解决

菜鸟:微信内置浏览器中不能小窗播放视频肿么办??? 师傅:徒弟莫猴急,待师傅一一道来:首先,喺发生急事嘅情况下,我哋最要保持冷静,噉才可以施展出一个有思维.有智慧.有头脑嘅人,应该有嘅气质与才华. 菜鸟:哇,知啦,跟住我应该点做哩? 师傅:求百度啊!!!!!! ......以上是背景......以下是根据百度爬到的内容进行的分析与总结...... 分析webkit-playsinline为什么不能在微信内核中起作用的原因: 1:在不考虑微信内核的浏览器中用html5的video方式播放视频时:在

android中使用videoview播放视频

先是布局文件: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 a

Html5之高级-4 HTML5视频处理(H5中播放视频、编程实现视频播放器)

一.在 HTML5 中播放视频 在 HTML5 中播放视频 - HTML5 中提到最多的是视频处理,视频也是互联网中的重要应用.在HTML5中,增加了一个元素,以便在HTML文档中插入和播放视频,这个元素就是video元素 - video元素提供了播放.暂停和音量控件来控制视频,也提供了width和height属性控制视频的尺寸.如设置的高度和宽度等. - 使用video元素至少要提供两种视频格式的文件: OGG和MP4 - OGG: 包含Theora 视频和 Vorbis 音频解码器 - MP

朋友圈滚动播放视频功能

欢迎Follow我的GitHub, 关注我的CSDN. 在应用的信息流中, 用户会分享视频, 连续展示, 这就需要处理视频滚动播放. 然而, 在列表视图(RecyclerView)中使用MediaPlayer播放视频时, 会产生一些问题, 即无法同步控制视频的播放和停止. 使用控件库可以解决这一问题. 滚动播放功能: 在页面中, 判断视频的可视比例, 最大视频项开始播放, 其余视频项关闭, 滚动中自动控制切换视频状态. 让我们来看看如何实现这一功能. 本文示例的Github下载地址. 使用的视频

Unity3D两种方式播放视频

  Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上.第二种是在GUI层面上播放视频.播放视频其实和贴图非常相像,因为播放视频用到的MovieTexture属于贴图Texture的子类,那么本章我们就好好学习一下Unity中播放视频的这两种方式.哇咔咔-           Unity支持的播放视频格式有.mov..mpg..mpeg..mp4..avi和.asf.只需将对应的视频文件拖拽入Project视

HTML5中的audio在react中的使用----语音播放进度条、倍速播放、下载等

最近做了一个将通话记录,语音转文字并可以在聊天记录里标注动机和摘要的需求,上图只是一个小小的模块,第一次接到使用到语音相关的需求,记录一下 上图是一个客服聊天记录的模块,语音转文字,将录音展示出来,可以音频播放,可以滑动进度条,倍速播放等等,以前自己心血来潮,使用原生js写过一个类似于网易音乐,播放音乐的播放器,包括进度条,音量调节啥的.当然做项目吗,还是使用HTML自带的更好,省时省力高高效我们的service后台前端工程使用的是react + ant-design + node作为中间层后端

H5.video在微信中禁止全屏播放视频和直播流

这段时间在做一个直播项目,有直播需求,也有视频播放需求,要求能在微信中以半屏的方式播放,另外半屏可以做一些操作,还有些组件需要悬浮在视频上方.网上各种扒拉,各种实验,以求在微信中实现不全屏就能播放和自动播放,最终还是用了单纯的video标签.自动播放到目前还是没找到完美的解决方法. 非全屏播放视频 <video loop autoPlay src={url} controls={true} poster={pic} playsinline webkit-playsinline x5-video-

Unity中实现播放视频

突然想着在一个cube物体上播放视频会是怎样的情景.今天终于有时间来尝试下了.结果=>成功 下面来说说详细的步骤吧 准备阶段: 1.unity pro 专业版 =>  需正版(当然破解版也ok,你懂的). 2.安装QuickTime Player.必须要安装,否则导入movie资源时,unity会自动报错提醒的. 3.安装格式化工厂软件=>movie格式转换.其他工具也ok.我这里默认转换为MOV格式.100M的avi转换后大概7M. ====================== uni

在Winform中播放视频等【DotNet,C#】

在项目中遇到过这样的问题,就是如何在Winform中播放视频.当时考察了几种方式,第一种是直接使用Windows Media Player组件,这种最简单:第二种是利用DirectX直接在窗体或者控件上绘图,这种比较复杂.于是采用的是第一种方法. 先从VS的工具箱里添加Windows Media Player组件,方式是打开工具箱,在最下面的空白处点击右键,选择项,然后在弹出的对话框里切换到Com组件标签项,找到“Windows Media Player”项并选中,确定后将在工具箱中看到多出一个