当前位置:网站首页>requestVideoFrameCallback() 简单实例
requestVideoFrameCallback() 简单实例
2022-07-28 22:41:00 【InfoQ】
<template>
<div id="app">
<div class="player-container">
<div class="title">requestVideoFrameCallback() 简单实例</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(
"你的浏览器不支持接口 `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()边栏推荐
- Camera Hal OEM模块 ---- cmr_preview.c
- Api 接口优化有哪些技巧?
- Idea2021.2 installation and configuration (continuous update)
- 聊聊异步编程的 7 种实现方式
- 16. Influence of deviation, variance, regularization and learning curve on the model
- 手把手教你安装Latex(保姆级教程)
- Dynamic programming problem (1)
- MySQL的存储过程
- Install mysql5.7 under Linux, super detailed complete tutorial, and cloud MySQL connection
- Where is sandbox's confidence in rejecting meta's acquisition of meta universe leader sand?
猜你喜欢

Samsung asset management (Hong Kong) launched yuancosmos ETF to focus on investing in the future tuyere track

NPM run serve stuck at 40%

Idea error running 'application' command line is too long solution

MySQL的存储过程

Sword finger offer 41. median in data flow

Locally connect to redis on Windows Server

ES6 operation tutorial

Why is it so difficult for the SEC to refuse the application for transferring gray-scale GBTC to spot ETF? What is the attraction of ETF transfer?

Newscenter, advanced area of attack and defense world web masters

手把手教你安装Latex(保姆级教程)
随机推荐
Anti shake and throttling
Applet verification code login
Dynamic programming problem (2)
Do like and in indexes in MySQL go
PHP语言基础知识(超详细)
[untitled]
[CNN] Why is the convolution kernel size of CNN usually odd
PTA (one question per day) 7-76 ratio
手把手教你安装Latex(保姆级教程)
Attack and defense world web master advanced area php2
12个MySQL慢查询的原因分析
MySQL安装配置教程(超级详细、保姆级)
还在写大量 if 来判断?一个规则执行器干掉项目中所有的 if 判断...
分布式限流 redission RRateLimiter 的使用及原理
Oracle实例无法启动的问题如何解决
PTA (daily question) 7-71 character trapezoid
Dynamic programming problem (6)
ACM SIGIR 2022 | interpretation of selected papers of meituan technical team
Idea2021.2 installation and configuration (continuous update)
MySQL transaction (this is enough...)