当前位置:网站首页>Requestvideoframecallback() simple instance
Requestvideoframecallback() simple instance
2022-07-29 00:36:00 【InfoQ】
<template>
<div id="app">
<div class="player-container">
<div class="title">requestVideoFrameCallback() Simple example </div>
<div class="item-container left">
<div class="item-container-in">
<video controls playsinline muted autoplay></video>
<div class="item-header">Video</div>
</div>
</div>
<div class="item-container right">
<div class="item-container-in">
<canvas></canvas>
<div class="item-header">Canvas</div>
</div>
</div>
<div class="fps-info" v-if="fpsInfo">
<strong>FPS:</strong>
<i>{{ fpsInfo }}</i>
</div>
<div class="metadata-info" v-if="metadata">
<textarea readonly v-model="metadata"></textarea>
</div>
</div>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
fpsInfo: null,
metadata: null,
};
},
mounted() {
this.init();
},
methods: {
init() {
const video = document.querySelector("video");
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
video.addEventListener("play", () => {
if (
!("requestVideoFrameCallback" in HTMLVideoElement.prototype)
) {
return alert(
" Your browser does not support interfaces `Video.requestVideoFrameCallback()`"
);
}
});
let width = canvas.width;
let height = canvas.height;
let paintCount = 0;
let startTime = 0.0;
const updateCanvas = (now, metadata) => {
if (startTime === 0.0) {
startTime = now;
}
ctx.drawImage(video, 0, 0, width, height);
const elapsed = (now - startTime) / 1000.0;
const fps = (++paintCount / elapsed).toFixed(3);
this.fpsInfo = !isFinite(fps) ? 0 : fps;
this.metadata = JSON.stringify(metadata, null, 2);
video.requestVideoFrameCallback(updateCanvas);
};
video.src = "https://vjs.zencdn.net/v/oceans.mp4";
video.requestVideoFrameCallback(updateCanvas);
},
},
};
</script>
<style>
* {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
background: #000;
}
.title {
position: absolute;
left: 0;
top: 30;
height: 60px;
line-height: 60px;
font-size: 24px;
color: #fff;
text-align: center;
width: auto;
right: 0px;
background-color: #000;
z-index: 100;
border-bottom: 1px rgba(255, 255, 255, 0.6) solid;
}
.player-container {
width: 100%;
height: 100vh;
overflow: hidden;
position: relative;
}
.item-container {
position: absolute;
width: 50%;
height: 100%;
padding: 50px;
top: 0px;
z-index: 1;
}
.item-container.left {
left: -5px;
border-right: 1px rgba(255, 255, 255, 0.6) solid;
}
.item-container-in {
width: 100%;
height: 100%;
position: relative;
}
.item-header {
position: absolute;
width: 100%;
height: 100%;
top: 100px;
z-index: 9;
color: rgba(255, 255, 255, 0.8);
font-weight: 700;
}
.item-container.right {
right: -5px;
border-left: 1px rgba(255, 255, 255, 0.6) solid;
}
.item-container canvas,
.item-container video {
position: absolute;
left: 50%;
top: 50%;
margin: -180px 0px 0px -320px;
width: 640px;
height: 360px;
}
.item-container::before {
position: absolute;
content: "";
width: 1px;
height: 100%;
overflow: hidden;
background-color: rgba(#fff, 0.6);
}
.fps-info {
position: absolute;
width: 200px;
height: 50px;
line-height: 20px;
font-family: Arial, Helvetica, sans-serif;
left: 50px;
bottom: 50px;
z-index: 10;
padding: 15px;
background-color: rgba(255, 255, 255, 0.5);
text-align: left;
color: #000;
}
.fps-info i {
font-style: normal;
}
.metadata-info {
position: absolute;
width: 600px;
height: 180px;
line-height: 20px;
font-family: Arial, Helvetica, sans-serif;
right: 50px;
bottom: 50px;
z-index: 10;
padding: 15px;
background-color: rgba(255, 255, 255, 0.5);
text-align: left;
color: #000;
}
.metadata-info textarea {
display: block;
width: 100%;
height: 100%;
background-color: transparent;
border: none;
}
</style>

requestVideoFrameCallback()边栏推荐
- Mock.js essay
- Advanced area of attack and defense world web masters unserialize3
- Anti shake and throttling
- 【微服务~Nacos】Nacos服务提供者和服务消费者
- 动态规划问题(七)
- Advanced area of attack and defense world web masters -baby Web
- Common sparse basis and matlab code for compressed sensing
- I don't know how lucky the boy who randomly typed the log is. There must be a lot of overtime!
- PTA (daily question) 7-72 calculate the cumulative sum
- pnpm的安装与使用
猜你喜欢

【飞控开发基础教程8】疯壳·开源编队无人机-I2C(激光测距)

PHP语言基础知识(超详细)

DCAT in laravel_ Admin preliminary use record

vscode下链接远程服务器安装插件失败、速度慢等解决方法
![[ESN] learning echo state network](/img/8e/09cc2d2c0e0ee24e9bee13979b03cb.png)
[ESN] learning echo state network

“吃货联盟定餐系统”

2022dasctfjuly empowerment competition (reappearance)

MySQL 分库分表及其平滑扩容方案
![[basic course of flight control development 8] crazy shell · open source formation uav-i2c (laser ranging)](/img/0b/d6defd524f83e69b40b5878ffe2e3c.png)
[basic course of flight control development 8] crazy shell · open source formation uav-i2c (laser ranging)

MySQL transaction (this is enough...)
随机推荐
execute immediate 简单示例合集(DML)
Cause analysis of 12 MySQL slow queries
PTA (daily question) 7-70 diamond
[develop low code platform] low code rendering
2022dasctfjuly empowerment competition (reappearance)
MySQL的存储过程
【MySQL 8】Generated Invisible Primary Keys(GIPK)
Anti shake and throttling
Samsung asset management (Hong Kong) launched yuancosmos ETF to focus on investing in the future tuyere track
Calculate properties and listeners
How to solve the problems of MQ message loss, duplication and backlog?
flask与七牛云上传图片
15. Model evaluation and selection
Talk about seven ways to realize asynchronous programming
Soft test --- database (4) SQL statement
Do like and in indexes in MySQL go
分布式限流 redission RRateLimiter 的使用及原理
17.机器学习系统的设计
还在写大量 if 来判断?一个规则执行器干掉项目中所有的 if 判断...
Dynamic programming problem (1)