【前端】web移动端进行监控是否完播 | 视频完播率设计

1、整体设计

1、前端播放监控:

使用移动端的前端播放器,比如 HTML5 video 标签或者第三方播放器(如 Video.js 或者 H5Player)。
在播放器中添加事件监听器来监控播放状态,例如 timeupdate、ended 等事件。

2、记录播放状态:

通过 timeupdate 事件不断记录当前播放时间。
在 ended 事件触发时,记录视频播放完毕的状态。

3、数据上报:

将播放状态和相关数据(如视频ID、用户ID、播放时长等)上报到后端服务器。
可以使用 AJAX 或 Fetch API 进行数据上报。

4、后端处理:

后端服务器接收到上报的数据后,可以将这些数据存储到数据库中,以便后续分析和监控。

2、代码实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Video Monitoring</title>
</head>
<body><video id="myVideo" width="320" height="240" controls><source src="https://your-cos-url.com/your-video-file.mp4" type="video/mp4">Your browser does not support the video tag.</video><script>const video = document.getElementById('myVideo');let totalWatchTime = 0;let lastTime = 0;let isPlaying = false;video.addEventListener('play', function() {isPlaying = true;lastTime = video.currentTime;});video.addEventListener('pause', function() {if (isPlaying) {totalWatchTime += video.currentTime - lastTime;isPlaying = false;}});video.addEventListener('timeupdate', function() {if (!isPlaying) {// 如果用户拖动进度条,也需要计算观看时间totalWatchTime += Math.abs(video.currentTime - lastTime);lastTime = video.currentTime;}});video.addEventListener('ended', function() {if (isPlaying) {totalWatchTime += video.currentTime - lastTime;isPlaying = false;}console.log('Total Watch Time:', totalWatchTime);reportPlayStatus(video.src, 'user123', video.duration, totalWatchTime);});function reportPlayStatus(videoUrl, userId, duration, watchTime) {fetch('https://your-server-endpoint.com/report', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({videoUrl: videoUrl,userId: userId,duration: duration,watchTime: watchTime,status: 'ended'}),}).then(response => response.json()).then(data => {console.log('Success:', data);}).catch((error) => {console.error('Error:', error);});}</script>
</body>
</html>

video.duration 是按秒计算的。HTML5 视频元素的 duration 属性返回的是一个浮点数,表示视频的总时长,单位是秒。如果视频的时长是 5 分 30 秒,video.duration 将返回 330.0。

此外,video.currentTime 属性也以秒为单位,表示当前播放位置的时间点。

const express = require('express');
const app = express();
const port = 3000;app.use(express.json());app.post('/report', (req, res) => {const { videoUrl, userId, duration, watchTime, status } = req.body;// 处理上报的数据,例如存储到数据库console.log('Received report:', { videoUrl, userId, duration, watchTime, status });// 返回响应res.status(200).json({ message: 'Report received' });
});app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨境电商投放Facebook广告推广攻略!

在出海浪潮中&#xff0c;跨境电商已经成为企业连接不同市场、拓展国际业务的重要途径。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;拥有超过20亿的活跃用户&#xff0c;为跨境卖家提供了一个无与伦比的营销舞台。有效利用Facebook广告&#xff0c;不仅能帮助…

MySQL导入SQL脚本---超详细介绍

1.新建xxx数据库&#xff0c;字符集选对。 2.在mysql安装目录下cmd进入小黑窗 3.执行mysql -uroot -p123456 --default-character-setutf8命令 4.use xxx; 5.source xxx.sql 执行完上面的命令等待结束就可以了 需要注意的是--default-character-setutf8&#xff0c;要不然可…

如何选择一款开放式耳机?六大独家选购技巧超详细汇总!

​喜欢户外活动的朋友们&#xff0c;你们都是懂得享受生活的达人吧&#xff01;想象一下&#xff0c;在户外活动时&#xff0c;如果能有一副既适合场景又提供超棒音乐体验的耳机&#xff0c;那该多完美啊&#xff01;这时候&#xff0c;开放式耳机就闪亮登场了&#xff01;它的…

Android 多语言

0. Locale方法 Locale locale Locale.forLanguageTag("zh-Hans-CN"); 执行如下方法返回字符串如下&#xff1a; 方法 英文下执行 中文下执行 备注 getLanguage()zhzhgetCountry()CNCNgetDisplayLanguage()zh中文getDisplayCountry()CN中国getDisplayName()zh (…

微前端框架 之 定义全局状态管理库(五)

假设你正在使用基于单页面应用&#xff08;SPA&#xff09;的微前端框架。以下简化一个应用之间共享状态的例子。 1. 使用发布/订阅模式 // globalStateManager.js class GlobalStateManager { constructor() { this.subscribers {}; this.state {}; } subscribe(key…

XGBoost算法详解:机器学习分类中的强力工具

课程链接&#xff1a;AI小天才&#xff1a;让你轻松掌握机器学习 引言&#xff1a; XGBoost&#xff08;Extreme Gradient Boosting&#xff09;是一种高效的机器学习算法&#xff0c;被广泛应用于分类、回归、排序等任务中。其优秀的性能和灵活性使得它成为了数据科学领域的瑰…

RocketMQ实战教程之常见概念和模型

RocketMQ实战教程之常见概念和模型 常见概念与模型 官方文档: https://rocketmq.apache.org/zh/docs/introduction/02concepts 1 常见概念[重点] 消息&#xff08;Message) 消息是 Apache RocketMQ 中的最小数据传输单元。生产者将业务数据的负载和拓展属性包装成消息发送…

JavaWeb-JS

目录 学习重点 什么是 JavaScript? Web标准 JS的引入方式 JS的基本语法 JS的函数 JS的对象 JS事件监听 学习重点 js 引入方式 js 基础语法 js 函数 js 对象 js 事件监听 什么是 JavaScript? Web标准 Web 标准也称为网页标准 &#xff0c;由一系列的标准组成&#xff0…

七年之痒!一个 PHP 程序员职业生涯的自述

大家好&#xff0c;我是码农先森。 今年刚好是我毕业的第七个年头&#xff0c;在婚姻感情当中都有一种「七年之痒」的说法&#xff0c;这次我把这个词「七年之痒」用一次在我的职业生涯复盘上。七年前我从告别校园&#xff0c;踏入互联网编程行业&#xff0c;七年后我依旧在编…

FFmpeg之转码

文章目录 概述transcode小结 概述 上一篇说了主要的流程&#xff0c;也就是ffmpeg_parse_options的流程&#xff0c;如下图&#xff1a; 红色箭头的流程说的差不多了&#xff0c;接下来看看绿色框框&#xff0c;也就是transcode的流程。 transcode 还是先给出我画的流程图&…

如何利用InputStream类实现文件读取与处理?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

mysql - 为什么MySQL不建议使用NULL作为列默认值?

为什么MySQL不建议使用NULL作为列默认值&#xff1f; InnoDB有4中行格式&#xff1a; Redundant : 非紧凑格式,5.0 版本之前用的行格式,目前很少使用,Compact : 紧凑格式,5.1 版本之后默认行格式,可以存储更多的数据Dynamic , Compressed : 和Compact类似,5.7 版本之后默认使…

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理&#xff1a;通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用&#xff0c;比如haproxy,nginx&#xff0c;Mysql,Linux系统信…

C++质数的那些事(判断指数、区间筛质数、互质等等)

质数的定义&#xff1a;若一个正整数除了1和它自身之外不能被任何自然数整除&#xff0c;则该数称为质数&#xff0c;也叫素数。否则为合数。 质数的性质&#xff1a;质数的分布较为稀疏&#xff0c;对于一个足够大的数S&#xff0c;不超过S的质数大约有个&#xff0c;也就是说…

自组网实现

实现自组网的方法主要有以下几种&#xff0c;设备形态以及各自的特点归纳如下&#xff1a; 实现方法&#xff1a; 窄带自组网技术&#xff1a;以语音通信系统为代表&#xff0c;通常以12.5kHz和25kHz的信道间隔承载数据&#xff0c;能够支持包括语音、传感器数据等在内的低速…

有趣的css - 水波纹按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个好看有质感的水波纹按钮。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 &a…

Unity 代码实现Animator开始和结束播放动画回调

文章目录 1.代码2.使用方式3.注意事项 1.代码 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;// 播放Animator并加入播放完成回调。 [RequireComponent(typeof(Animator))] public class AnimatorCallback : MonoBehaviour {…

【Spring Cloud】远程调用

目录 Spring Cloud Netflix Feign简介前言Feign是什么OpenFeign组件和Spring Cloud OpenFeignOpenFeign组件Spring Cloud OpenFeign OpenFeign-微服务接口调用需求说明1. 启动Eureka Server服务2.创建两个项目&#xff0c;将其注册到Eureka Server3.在服务提供者中添加业务处理…

【UE Websocket】“WebSocket Server”插件使用记录

1. 在商城中下载“WebSocket Server”插件 该插件具有如下节点&#xff0c;基本可以满足WebSocket服务端的所有需求 2. 如果想创建一个基本的服务端&#xff0c;我们可以新建一个actor蓝图&#xff0c;添加如下节点 3. UE运行后&#xff0c;我们可以使用在线的websocket测试助手…

RuntimeError: CUDA out of memory. Tried to allocate 1.77 GiB?如何解决

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…