当前位置: 首页 > news >正文

监听视频是否加载完毕

背景是最近我们在上线一个需求后,发现用户在发送AI指令获取视频的时候,打点显示部分用户(45%左右)都触发了发送指令,但是没有进行视频播放,所以就开始排查这个问题

排查后发现是没有触发视频的ready枚举,导致没有上报视频开始播放的点位,实际视频已经开始播放了只是没有上报而已

于是就开始看监听视频的hooks代码

import { useState, useEffect, useMemo } from 'react';export const playStatusEnum = {idle: 'idle', // 未加载loading: 'loading', // 加载中ready: 'ready', // 可以播放// loaded: 'loaded', // 加载完成playing: 'playing', // 播放中paused: 'paused', // 暂停中ended: 'ended', // 播放结束buffering: 'buffering', // 缓冲中error: 'error' // 播放错误
};export default function useVideoStatus(videoRef) {const [status, setStatus] = useState('idle');useEffect(() => {const video = videoRef.current;if (!video) return;const handleLoadStart = () => setStatus(playStatusEnum.loading);const handleCanPlay = () => setStatus(playStatusEnum.ready);const handlePlaying = () => setStatus(playStatusEnum.playing);const handlePause = () => setStatus(playStatusEnum.paused);const handleEnded = () => setStatus(playStatusEnum.ended);const handleWaiting = () => setStatus(playStatusEnum.buffering);const handleError = () => setStatus(playStatusEnum.error);video.addEventListener('loadstart', handleLoadStart);video.addEventListener('loadeddata', handleCanPlay);video.addEventListener('playing', handlePlaying);video.addEventListener('pause', handlePause);video.addEventListener('ended', handleEnded);video.addEventListener('waiting', handleWaiting);video.addEventListener('error', handleError);return () => {video.removeEventListener('loadstart', handleLoadStart);video.removeEventListener('loadeddata', handleCanPlay);video.removeEventListener('playing', handlePlaying);video.removeEventListener('pause', handlePause);video.removeEventListener('ended', handleEnded);video.removeEventListener('waiting', handleWaiting);video.removeEventListener('error', handleError);};}, [videoRef]);return useMemo(() => {return {playerStatus: status,isPlaying: [playStatusEnum.ready, playStatusEnum.playing, playStatusEnum.buffering].includes(status)};}, [status]);
}

控制视频切换状态为ready主要是这一行

video.addEventListener('loadeddata', handleCanPlay);

查了各种资料最后发现这里的 useVideoStatus 在 iOS Safari 上 永远监听不到 ready

iOS Safari 中,视频的事件触发顺序跟桌面端不一样:

  • 桌面 Chrome/Edge/Firefox 通常会触发:loadstart → loadeddata → canplay → canplaythrough

  • iOS Safari 有时 不会触发 loadeddata,特别是远程视频或者流式资源,只会触发 canplay

所以在 iOS或者部分 上根本没机会进入 setStatus(playStatusEnum.ready)

于是多加了两种监听方式

    video.addEventListener('canplay', handleCanPlay); //兼容部分手机浏览器video.addEventListener('loadedmetadata', handleCanPlay); //兼容部分手机浏览器

本地测试后看是可以触发了 ,提测后也是成功解决了 down~

http://www.lryc.cn/news/626903.html

相关文章:

  • 次短路P2865 [USACO06NOV] Roadblocks G题解
  • KubeBlocks for ClickHouse 容器化之路
  • 【机器学习深度学习】AI大模型高并发挑战:用户负载部署策略
  • OceanBase DBA实战营2期--SQL 关键字限流学习笔记
  • Angular由一个bug说起之十八:伴随框架升级而升级ESLint遇到的问题与思考
  • 文本智能抽取:如何用NLP从海量文本中“炼“出真金?-告别无效阅读,让AI成为你的“信息炼金师
  • springboot--用户访问系统的增删改查记录
  • 静/动态库 IIC(arm) day58
  • Docker在Linux中安装与使用教程
  • 【Android】Serializable和Parcelable序列化对象:传递自定义类数据
  • 无人机抗噪模块技术概述!
  • AI + 金融领域 + 落地典型案例
  • AI +金融 = 七大核心维度+ 落地典型困难
  • 基于深度学习CenterPoint的3D目标检测部署实战
  • 《GPT-OSS 模型全解析:OpenAI 回归开源的 Mixture-of-Experts 之路》
  • 使用 FastAPI 的 WebSockets 和 Elasticsearch 来构建实时应用
  • shell脚本——搜索某个目录下带指定前缀的文件
  • 标准解读——71页2025《数字化转型管理 参考架构》【附全文阅读】
  • C++11中的互斥锁,条件变量,生产者-消费者示例
  • Cyberduck (FTP和SFTP工具) v9.2.3.43590
  • SpringBoot3后端项目介绍:mybig-event
  • 华为云之基于鲲鹏弹性云服务器部署openGauss数据库【玩转华为云】
  • 网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
  • AutoGLM2.0背后的云手机和虚拟机分析(非使用案例)
  • 百度地图 添加热区(Hotspot)
  • Ubuntu_22.04安装文档
  • 应用在运行时,向用户索取(相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求--教你如何解决华为市场上架难题
  • 【数据库】Oracle学习笔记整理之六:ORACLE体系结构 - 重做日志文件与归档日志文件(Redo Log Files Archive Logs)
  • Ubuntu 虚拟显示器自动控制服务设置(有无显示器的切换)
  • 机器学习数据预处理总结(复习:Pandas, 学习:preprocessing)