首页 > 其他分享 >js显示视频和弹幕

js显示视频和弹幕

时间:2022-11-01 13:59:34浏览次数:57  
标签:视频 canvas js danmu video context 弹幕

HTML:

<!DOCTYPE html> <html lang="en">
<head>     <meta charset="UTF-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <!-- 请将页面title修改为你的姓名 -->     <title>lp</title>     <style>         canvas {             border: 3px solid black;         }     </style> </head>
<body>     <canvas id="myCanvas" width="600" height="400"></canvas>     <script src="todo.js"></script>     <video id ='myvedio' src="video" controls loop hidden width="600" height="300"></video> </body>
</html>  JS: /*     Functions :代码题-视频弹幕     Author    :周二班-lp     Build_Date:2022.11.1     Version   :1.0     要求:补充代码来实现demo效果     1、初始化时显示TXT     2、鼠标点击开始播放视频     3、随着视频播放在canvas上逐帧绘制视频内容     4、播放过程中,按回车键出现弹幕(内容、位置随机)
    说明:     1、原则上不能大幅修改提供的程序段     2、在上方Author区注明完成者中文姓名和教学班级,例如“周二班-张三”
 */ //=========================================================================
//=========================变量定义区======================================= // 此块内容如非必要,请勿修改,可增加或使用该区域变量 let canvas = document.getElementById("myCanvas"),     context = canvas.getContext('2d'); let video = document.createElement('video');
const W = canvas.width,     H = canvas.height; // canvas的大小 const TXT = 'Click to Start'; // 初始化时显示的文本 const FPS = 24; // 视频fps const TXT2 = ['Good', 'Nice', 'Bad', 'Wow']; // 弹幕文字数组
// let danmu = { //     show: false, //     txt: '', //     x0: 0, //     y0: 0 // }; // 当前弹幕的文字及位置
let playing = true;
let dArray = [];    //弹幕池
//=========================变量定义区 end=======================================

//=========================函数定义区=======================================
//============待完成的代码区域====================== // 请编写函数,绘制每一帧的绘制内容 function drawInterval() {     // 清屏     context.clearRect(0, 0, W, H);     // 绘制视频帧     //context.drawImage(video, 0, 0, W, H);     context.save(); //先在底层放图片     context.globalAlpha = 0.2;     context.drawImage(video, 0, 0, W, H);   //对于视频元素,是一帧一帧取的     context.restore();
    context.save();     //要剪辑的区域形状     context.beginPath();     context.arc(W / 2, H / 2, 50, Math.PI / 180 * 0, Math.PI / 180 * 360);     //剪辑     context.clip();     context.drawImage(video, 0, 0, W, H);   //这里对原先的覆盖只会是剪辑的区域进行覆盖     context.restore();
    // if (danmu.show) {     //     x -= 20;     //     context.fillText(danmu.txt, x,danmu.y0);     // }
    //每播放一帧,就显示之前的全部弹幕     for (i = 0; i < dArray.length; ++i) //这里不懂     {         temp = dArray[i];         temp.x -= temp.dx;         //当danmu.show为真是,绘制弹幕         if (temp.show)             context.fillText(temp.txt, temp.x, temp.y0);     } }



// 请编写函数,开始播放视频并在canvas上逐帧绘制视频 function startAnimation() {     console.log('播放'); // 此句不要删     // 开始播放视频     video.play();   //播放视频之前先写一个play     // 开始逐帧绘制     interval = setInterval(drawInterval, 1000 / FPS);   //播放动画 }
function pauseAnimation() {     video.pause();  //要暂停视频之前先pause一下video     clearInterval(interval);    //停止动画 }
// 请编写函数,初始化时显示文本 function showTxt() {     context.save();     context.fillStyle='black';     context.lineWidth=2;     context.strokeText(TXT, W / 2,H / 2);     context.restore(); }
// ------ 事件响应函数 ------ // 请编写函数,鼠标点击后开始动画, 鼠标再次点击暂停 canvas.onmousedown = function () {     playing = !playing;     if (!playing)         startAnimation();       else         pauseAnimation();     }
// 请补全函数,键盘按回车键发送弹幕 window.addEventListener("keydown", function (e) {     if (e.key == "Enter") {         console.log("回车键!");                 //设置当前弹幕的文本和位置         var danmu = {             show: false,             txt: '',             x0: 0,             y0: 0,             dx: 20,             x: 0         }; // 当前弹幕的文字及位置
        danmu.show = true;  //显示为true         idx = Math.floor(Math.random() * TXT2.length); // 随机从弹幕文本数组中选取一个下标         // 请补全代码,设置当前弹幕的文本和位置         danmu.txt=TXT2[idx];         danmu.x0=Math.random() * W;         danmu.y0=Math.random() * H;         danmu.x = danmu.x0;         //填充弹幕池         dArray.push(danmu);     } });

//============待完成的代码区域 end ====================

//============初始化 ==================== // init,如非必要,请勿修改 function init() {     console.log('初始化');     context.font = '60px sans-serif';     context.textAlign = 'center';     context.textBaseline = 'middle';     context.fillStyle = 'red';
    video.src = 'video.mp4';     video.loop = true;
    showTxt();  //先显示文本 }
//=========================函数定义区 end======================================= init();              

标签:视频,canvas,js,danmu,video,context,弹幕
From: https://www.cnblogs.com/roses-blooming/p/16847394.html

相关文章

  • 如何用小黄鸟(HttpCanary)下载微信视频号的直播回放?
    目前微信视频号直播只在手机端才会显是,PC端不会显示,为此我们需要手机端抓包工具进行抓包,找到直播回放的的m3u8地址,用相应的工具下载即可。 下面开始教学: 第一步:下载......
  • js多种方法取数组的最后一个元素
    1.pop()方法,删除数组最后一个并返回该元素利用这个方法可以取到数组的最后一个,同理shift()可以取到数组的第一个(shift()删除数组第一个并返回该元素vararr=[1,2,3];......
  • PowerShell 获取虎扑步行街热榜json数据
    代码(curl"https://bbs.hupu.com/all-gambia").ParsedHtml.getElementsByClassName('t-info')|%{$texts=$_.getElementsByTagName('span')@{url=......
  • (转)js正则表达式验证大全
    js正则表达式验证大全(转)/判断输入内容是否为空    functionIsNull(){       varstr=document.getElementById('str').value.trim();       if(s......
  • js判断数据类型
    ES5中,js中数据类型:number、string、boolean、undefined、null、objectjs中获取数据类型常用的四种方式实例:vara=123,b=true,c="123",d=undefi......
  • Jsch远程执行shell脚本命令
    分享知识传递快乐JSch是JavaSecureChannel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成......
  • AJAX基础+Axios快速入门+JSON使用+综合案例
    目录1、AJAX1.1概述1.1.1作用1.1.2同步和异步1.2快速入门1.2.1服务端实现1.2.2客户端实现1.3案例1.3.1需求1.3.2分析1.3.2后端实现1.3.3前端实现2、Axios异步......
  • Unity反序列天气API的JSON
    心知天气:https://www.seniverse.com/JSON:{"results":[{"location":{"id":"C23NB62W20TF","name":"西雅图","country":......
  • js、jquery获取不到input输入值
    http://www.mizuiren.com/blog/349.html这篇文章中是说赋值不行,取值可以的原因和处理方法,我遇到的情况不一样,但还是想分享一下这个问题花了将近一天时间怎么回事???最后原因......
  • Hive系列之解析JSON数据
    概述在数据处理中,经常遇到的一个数据类型就是JSON,MySQL数据库解析JSON,参考​​MySQL5.7JSON函数学习​​,​MySQLjson_mergewithgroupby​​。在大数据执行引擎Hive中,......