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

什么叫展示型网站青岛seo代理计费

什么叫展示型网站,青岛seo代理计费,wordpress多种设备网页生成,海宁高端网站设计在前面的文章说,说明了服务端如何生成雪碧图/WebVTT,那如何在 Web 点播播放器上加载缩略图呢? 无论使用西瓜播放器,Video.js,Shaka Player,Plyr,DPlayer 等,以下方法都可以参考,有…

在前面的文章说,说明了服务端如何生成雪碧图/WebVTT,那如何在 Web 点播播放器上加载缩略图呢?

无论使用西瓜播放器,Video.js,Shaka Player,Plyr,DPlayer 等,以下方法都可以参考,有些播放器内置了支持雪碧图,有些播放器通过插件支持 WebVTT,但都无法达到我们想要的效果,那就…自己实现吧!

以下方案以 DPlayer 为例。

在视频元数据加载完成时,加载缩略图

initializeThumbnailPreview 用于初始化缩略图,有 4 个参数,分别是

  • webvtt 文件路径
  • 播放器的 video 标签
  • 父级容器( 可以对 div 设置 ref,通过 ref 获取 )
  • 错误回调
    // 播放器基础事件player.on('loadedmetadata', async () => {logger.info('🍒 视频元数据加载完成', {duration: player.video.duration.toFixed(2),videoWidth: player.video.videoWidth,videoHeight: player.video.videoHeight});// 初始化缩略图预览功能if (vttPath && player.video && container) {try {const thumbnailState = await initializeThumbnailPreview({vttPath,videoElement: player.video,videoContainer: container,onError});resolve(thumbnailState);} catch (error) {logger.error('🍒 缩略图预览初始化失败', error);resolve(null);}} else {resolve(null);}});

重点要关注的是 setupThumbnailPreviewupdateThumbnailContent 函数,简单来说做了以下几个步骤

  1. 计算鼠标在进度条上的位置
  2. 在该位置上方显示缩略图
  3. 在缩略图里面显示进度

那么如何确定显示雪碧图中的哪个 tile 呢?

遍历 webvtt 文件,找到对应播放时间的缩略图,缩略图的后缀有 #xywh,之前的文章中有提到这个用于定位。图片元素显示是固定的 160*90,通过设置像素的位置对小图定位显示。

/*** 初始化缩略图预览功能* 这是主要的导出函数,供外部组件调用*/
export const initializeThumbnailPreview = async (config: ThumbnailPreviewConfig): Promise<ThumbnailPreviewState> => {const { vttPath, videoElement, videoContainer, onError } = config;try {logger.info('🍒 开始初始化缩略图预览功能', {vttPath,videoElementReady: !!videoElement,containerReady: !!videoContainer});// 设置容器为相对定位videoContainer.style.position = 'relative';// 创建缩略图预览元素const { thumbnailElement, timeElement } = createThumbnailElements(videoContainer);// 加载 WebVTT 轨道await loadWebVTTTrack(vttPath, videoElement);// 设置缩略图预览功能await setupThumbnailPreview(videoElement, thumbnailElement, timeElement, videoContainer);// 创建清理函数const cleanup = () => {if (thumbnailElement && thumbnailElement.parentNode) {thumbnailElement.parentNode.removeChild(thumbnailElement);logger.info('🍒 缩略图预览元素已清理');}};logger.info('🍒 缩略图预览功能初始化完成');return {thumbnailElement,timeElement,cleanup};} catch (error) {const errorMessage = `缩略图预览功能初始化失败: ${error}`;logger.error('🍒 缩略图预览功能初始化失败', { error, vttPath });onError?.(errorMessage);throw error;}
};

loadWebVTTTrack 在 video 标签中添加 dom 元素,用于存储 webvtt 信息,方便后续读取与显示。

/*** 加载 WebVTT 缩略图轨道*/
const loadWebVTTTrack = async (vttUrl: string, videoElement: HTMLVideoElement): Promise<void> => {try {logger.info('🍒 开始加载 WebVTT 缩略图', { vttUrl });// 使用 fetch 加载 WebVTT 内容const response = await fetch(vttUrl, {mode: 'cors',credentials: 'omit'});if (!response.ok) {throw new Error(`HTTP ${response.status}: ${response.statusText}`);}const vttContent = await response.text();logger.info('🍒 WebVTT 内容加载成功', {size: vttContent.length,firstLine: vttContent.split('\n')[0]});// 创建 Blob URLconst blob = new Blob([vttContent], { type: 'text/vtt' });const blobUrl = URL.createObjectURL(blob);// 创建轨道元素const track = document.createElement('track');track.kind = 'metadata';track.label = 'thumbnails';track.default = true;track.src = blobUrl;// 添加轨道到视频元素videoElement.appendChild(track);// 监听轨道加载事件return new Promise((resolve, reject) => {track.addEventListener('load', () => {logger.info('🍒 WebVTT 轨道加载完成', { vttUrl });URL.revokeObjectURL(blobUrl);resolve();});track.addEventListener('error', (e) => {logger.error('🍒 WebVTT 轨道加载失败', { vttUrl, error: e });URL.revokeObjectURL(blobUrl);reject(new Error('WebVTT 轨道加载失败'));});});} catch (error) {logger.error('🍒 加载 WebVTT 失败', { vttUrl, error });throw error;}
};

setupThumbnailPreview 用于设置缩略图预览功能,主要是操作 dom 元素,修改 css 等。

为保证代码的完整性,我将在此处贴出完整函数,并通过注释的方式讲解内部设计。

/*** 设置缩略图预览功能(带重试机制)*/
const setupThumbnailPreview = (videoElement: HTMLVideoElement,thumbnailElement: HTMLDivElement,timeElement: HTMLDivElement,videoContainer: HTMLElement
): Promise<void> => {return new Promise((resolve, reject) => {const attemptSetup = (attempt: number = 1): void => {const progressBar = findProgressBar();if (progressBar) {setupProgressBarEvents(progressBar, videoElement, thumbnailElement, timeElement, videoContainer);logger.info('🍒 缩略图预览功能设置成功', { attempt });resolve();return;}if (attempt <= RETRY_CONFIG.maxAttempts) {const delay = attempt * RETRY_CONFIG.baseDelay;logger.info('🍒 进度条元素未找到,延迟重试', {attempt,delay,maxAttempts: RETRY_CONFIG.maxAttempts});setTimeout(() => {// 调试信息:打印当前 DOM 中的相关元素const debugInfo = {dplayerElements: Array.from(document.querySelectorAll('[class*="dplayer"]')).map(el => ({tagName: el.tagName,className: el.className,visible: (el as HTMLElement).offsetParent !== null})),barElements: Array.from(document.querySelectorAll('[class*="bar"]')).map(el => ({tagName: el.tagName,className: el.className,visible: (el as HTMLElement).offsetParent !== null}))};logger.info('🍒 DOM 调试信息', { attempt, ...debugInfo });attemptSetup(attempt + 1);}, delay);} else {const error = new Error(`已达到最大重试次数 ${RETRY_CONFIG.maxAttempts},缩略图功能无法正常工作`);logger.warn('🍒 缩略图功能设置失败', { maxAttempts: RETRY_CONFIG.maxAttempts });reject(error);}};attemptSetup();});
};

更新缩略图的内容

/*** 更新缩略图内容和位置*/
const updateThumbnailContent = (videoElement: HTMLVideoElement,thumbnailElement: HTMLDivElement,timeElement: HTMLDivElement,seekTime: number,thumbnailX: number
): void => {// 获取视频的文本轨道const tracks = videoElement.textTracks;if (!tracks || tracks.length === 0) {logger.warn('🍒 没有找到文本轨道', { tracksLength: tracks?.length });return;}const track = tracks[0];if (track.mode !== 'showing') {track.mode = 'showing';}if (!track.cues) {logger.warn('🍒 文本轨道没有 cues', {trackMode: track.mode,trackKind: track.kind});return;}// 查找当前时间对应的缩略图信息let activeCue = null;for (let i = 0; i < track.cues.length; i++) {const cue = track.cues[i];if (seekTime >= cue.startTime && seekTime <= cue.endTime) {activeCue = cue;break;}}if (!activeCue) {logger.warn('🍒 未找到对应时间的缩略图', { seekTime: seekTime.toFixed(2) });return;}// @ts-expect-error - VTTCue.text 包含缩略图信息const cueText = activeCue.text;// 解析 WebVTT 缩略图信息// 格式:image.jpg#xywh=160,90,160,90 或 url(image.jpg)let imageUrl = '';let xywh = '';if (cueText.includes('#xywh=')) {const parts = cueText.split('#xywh=');imageUrl = parts[0];xywh = parts[1];} else {const match = cueText.match(/url\(([^)]+)\)/);if (match) {imageUrl = match[1];} else {imageUrl = cueText.trim();}}if (!imageUrl) {logger.warn('🍒 无法解析缩略图URL', { cueText });return;}// 设置缩略图样式和位置if (xywh) {// 雪碧图模式:使用坐标信息const [x, y, w, h] = xywh.split(',').map(Number);thumbnailElement.style.backgroundImage = `url(${imageUrl})`;thumbnailElement.style.backgroundPosition = `-${x}px -${y}px`;thumbnailElement.style.backgroundSize = 'auto';thumbnailElement.style.width = `${w}px`;thumbnailElement.style.height = `${h}px`;logger.info('🍒 缩略图更新(雪碧图模式)', {seekTime: seekTime.toFixed(2),imageUrl: imageUrl.substring(imageUrl.lastIndexOf('/') + 1),spritePosition: `${x},${y}`,spriteSize: `${w}x${h}`,thumbnailX: thumbnailX.toFixed(1)});} else {// 单图模式thumbnailElement.style.backgroundImage = `url(${imageUrl})`;thumbnailElement.style.backgroundSize = 'cover';thumbnailElement.style.backgroundPosition = 'center';thumbnailElement.style.width = '160px';thumbnailElement.style.height = '90px';logger.info('🍒 缩略图更新(单图模式)', {seekTime: seekTime.toFixed(2),imageUrl: imageUrl.substring(imageUrl.lastIndexOf('/') + 1),thumbnailX: thumbnailX.toFixed(1)});}// 设置位置和时间thumbnailElement.style.left = `${thumbnailX}px`;timeElement.textContent = formatTime(seekTime);
};

希望你会喜欢 EasyDSS 点播模块

上面贴了很多代码,作为用户可以直接嵌入 iframe, 接入我们实现的播放器,开发者可以使用 EasyPlayer 。

点击查看 easydss 论坛

欢迎来到论坛一起讨论

http://www.dtcms.com/wzjs/564978.html

相关文章:

  • 书荒小说阅读器是哪个网站做的网页设计实验报告重庆交通大学
  • 武进网站建设服务大连网络推广广告代理
  • 绍兴网站建设哪家好网站后期培训机构全国排名
  • 如何让网站被百度收录学做分类网站
  • 网站介绍词wordpress修改关键词
  • 手机移动端网站怎么做seo黑龙江建筑信息网
  • 微网站和h5有什么区别建筑云平台
  • 法拍房北京网站企业的管理系统有哪些
  • 自己的电脑可以做网站服务器西直门网站建设公司
  • 深圳创意设计网站个人网站前置审批项
  • 网站建设销售顾问开场白直播类网站怎么做
  • 建站公司怎么拓客网站开发概要设计模板
  • 网推项目平台百度推广优化方案
  • 淮北网站网站建设园林景观设计公司做抖音推广
  • 学院网站整改及建设情况报告成都旅游公司哪家好
  • 做照片的网站公司网站做推广支出分录
  • 班级网站的规划与建设wordpress设置用户访问个数据库
  • 微餐饮网站建设用途旧房改造装修翻新
  • 专业网站推广软件优秀设计集锦网站
  • 表白网站是怎么做的网站开发包含哪些类别
  • 上海大型网站设计公司网址大全实用网址
  • 山东城乡建设厅网站首页苏州园区一站式服务中心
  • 佛山哪里有做网站的wordpress弹框登陆
  • 内蒙古呼和浩特网站建设网络营销策划书怎么写
  • 兰州专业网站建设公司哪家好网站建设丿金手指谷哥14
  • 为什么要建设旅游网站局网站建设方案word
  • 福田网站建设龙岗网站建设wordpress文章模板代码
  • 室内设计师找图片的网站网站去哪里备案
  • 网站怎么做优化推广个体营业执照可以做网站搞推广吗
  • wordpress整站数据转移安装wordpress插件目录下