设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 64|回复: 10

前端H5 Video常见使用场景简介

[复制链接]

1

主题

57

回帖

137

积分

注册会员

积分
137
发表于 2024-4-20 10:28:58 | 显示全部楼层 |阅读模式
1.原生H5 video标签
  1. <video id="mse" autoplay=true playsinline controls="controls">
  2.    <source src="实机视频地址" type="video/mp4">
  3.    你的浏览器不支持Video标签
  4. </video>
复制代码
2.第三方插件video.js
  1. _this.player = videojs(
  2.     _this.videoNode,
  3.     {
  4.         autoplay: true,
  5.         bigPlayButton : false,
  6.         controls: true,
  7.         preload: 'auto',
  8.         poster: poster,
  9.         notSupportedMessage: '视频加载失败,请刷新再试试',
  10.         sources: [
  11.             {
  12.                 src: videoUrl,
  13.                 type: 'video/mp4',
  14.             },
  15.         ],
  16.     },
  17.     function onPlayerReady() {
  18.         this.play();
  19.     }
  20. )

  21. <video
  22.   ref={(node) => (this.videoNode = node)}
  23.   className="video-js vjs-big-play-centered"
  24.   preload="auto"
  25.   autoplay="autoplay"
  26.   playsinline='true'
  27.   webkit-playsinline='true'
  28.   x5-video-player-type='h5'
  29.   x5-video-player-fullscreen='false'
  30.   x5-video-orientation='portraint'
  31. ></video>
复制代码
2.1 支持原生H5 video标签的所有配置参数,并且更加丰富的配置。

2.2 多环境兼容性
3.业务开发中的场景
目前基本表现良好
3.1 自动播放实现
3.1.1 非微信端
目前主要方法是在videojs 的onPlayerReady回调中调用play方法,以及特殊环境下需要用户手动触发
3.1.2 微信端
微信端(特别是ios)为了能够实现自动播放功能,目前主要通过增加微信WeixinJSBridgeReady事件回调的方式来触发
  1. document.addEventListener("WeixinJSBridgeReady", function () {
  2.     this.player.play();
  3. }, false);
复制代码
4.播放过程

一次播放三次请求
请求头信息

响应信息
  1. range: bytes=0-
复制代码
首部信息,该信息用于检测服务端是否支持 Range 请求
  1. Accept-Ranges
复制代码
首部(并且它的值不为 “none”),那么表示该服务器支持范围请求
  1. Content-Length
复制代码
也是有效信息,因为它提供了要下载的视频的完整大小
  1. Content-Range
复制代码
响应首部则表示这一部分内容在整个资源中所处的位置
range - 可以分片段请求,此时的Content-Range则返回的对应请求区间的大小
5.其他场景
5.1 如何实现视频本地预览
视频本地预览的功能主要利用 URL.createObjectURL() 方法来实现。URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的 URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的 URL 对象表示指定的 File 对象或 Blob 对象。
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6.     <title>视频本地预览示例</title>
  7.   </head>
  8.   <body>
  9.     <input type="file" accept="video/*" onchange="loadFile(event)" />
  10.     <video
  11.       id="previewContainer"
  12.       controls
  13.       width="480"
  14.       height="270"
  15.       style="display: none;"
  16.     ></video>

  17.     <script>
  18.       const loadFile = function (event) {
  19.         const reader = new FileReader();
  20.         reader.onload = function () {
  21.           const output = document.querySelector("#previewContainer");
  22.           output.style.display = "block";
  23.           output.src = URL.createObjectURL(new Blob([reader.result]));
  24.         };
  25.         reader.readAsArrayBuffer(event.target.files[0]);
  26.       };
  27.     </script>
  28.   </body>
  29. </html>
复制代码
5.2 如何实现播放器截图
播放器截图功能主要利用
  1. CanvasRenderingContext2D.drawImage()
复制代码
API 来实现。Canvas 2D API 中的 CanvasRenderingContext2D.drawImage() 方法提供了多种方式在 Canvas 上绘制图像。
drawImage API 的语法如下:
  1. void ctx.drawImage(image, dx, dy);
  2. void ctx.drawImage(image, dx, dy, dWidth, dHeight);
  3. void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6.     <title>播放器截图示例</title>
  7.   </head>
  8.   <body>
  9.     <video id="video" controls="controls" width="460" height="270" crossorigin="anonymous">
  10.       <!-- 请替换为实际视频地址 -->
  11.       <source src="请替换为实际视频地址" />
  12.     </video>
  13.     <button onclick="captureVideo()">截图</button>
  14.     <script>
  15.       let video = document.querySelector("#video");
  16.       let canvas = document.createElement("canvas");
  17.       let img = document.createElement("img");
  18.       img.crossOrigin = "";
  19.       let ctx = canvas.getContext("2d");

  20.       function captureVideo() {
  21.         canvas.width = video.videoWidth;
  22.         canvas.height = video.videoHeight;
  23.         ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
  24.         img.src = canvas.toDataURL();
  25.         document.body.append(img);
  26.       }
  27.     </script>
  28.   </body>
  29. </html>
复制代码
5.3 如何实现 Canvas 播放视频
使用 Canvas 播放视频主要是利用 ctx.drawImage(video, x, y, width, height) 来对视频当前帧的图像进行绘制,其中 video 参数就是页面中的 video 对象。所以如果我们按照特定的频率不断获取 video 当前画面,并渲染到 Canvas 画布上,就可以实现使用 Canvas 播放视频的功能。
  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.     <meta charset="UTF-8" />
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6.     <title>使用 Canvas 播放视频</title>
  7.   </head>
  8.   <body>
  9.     <video id="video" controls="controls" style="display: none;">
  10.       <!-- 请替换为实际视频地址 -->
  11.       <source src="请替换为实际视频地址" />
  12.     </video>
  13.     <canvas
  14.       id="myCanvas"
  15.       width="460"
  16.       height="270"
  17.       style="border: 1px solid blue;"
  18.     ></canvas>
  19.     <div>
  20.       <button id="playBtn">播放</button>
  21.       <button id="pauseBtn">暂停</button>
  22.     </div>
  23.     <script>
  24.       const video = document.querySelector("#video");
  25.       const canvas = document.querySelector("#myCanvas");
  26.       const playBtn = document.querySelector("#playBtn");
  27.       const pauseBtn = document.querySelector("#pauseBtn");
  28.       const context = canvas.getContext("2d");
  29.       let timerId = null;

  30.       function draw() {
  31.         if (video.paused || video.ended) return;
  32.         context.clearRect(0, 0, canvas.width, canvas.height);
  33.         context.drawImage(video, 0, 0, canvas.width, canvas.height);
  34.         timerId = setTimeout(draw, 0);
  35.       }

  36.       playBtn.addEventListener("click", () => {
  37.         if (!video.paused) return;
  38.         video.play();
  39.         draw();
  40.       });

  41.       pauseBtn.addEventListener("click", () => {
  42.         if (video.paused) return;
  43.         video.pause();
  44.         clearTimeout(timerId);
  45.       });
  46.     </script>
  47.   </body>
  48. </html>
复制代码
以上就是前端H5 Video常见使用场景简介的详细内容,更多关于前端H5 Video常见场景的资料请关注脚本之家其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  • 打卡等级:偶尔看看
  • 打卡总天数:10
  • 打卡月天数:0
  • 打卡总奖励:180
  • 最近打卡:2024-06-20 09:02:38

9

主题

80

回帖

605

积分

高级会员

积分
605

推广达人宣传达人热心会员付费会员

发表于 2024-5-7 18:55:06 | 显示全部楼层
感谢分享,受益匪浅!

1

主题

54

回帖

129

积分

注册会员

积分
129
发表于 2024-5-26 06:58:42 | 显示全部楼层
能给个链接吗?我想深入了解一下。

1

主题

63

回帖

149

积分

注册会员

积分
149
发表于 2024-8-22 14:35:20 | 显示全部楼层
谢谢你分享这个信息

5

主题

55

回帖

220

积分

中级会员

积分
220
发表于 2024-8-30 04:53:11 | 显示全部楼层
友善的讨论氛围是非常重要的。

0

主题

43

回帖

87

积分

注册会员

积分
87
发表于 2024-8-31 04:51:57 | 显示全部楼层
我不确定这个信息的准确性,请再确认一下

1

主题

48

回帖

117

积分

注册会员

积分
117
发表于 2024-9-16 09:10:48 | 显示全部楼层
友善的讨论氛围是非常重要的。

0

主题

37

回帖

75

积分

注册会员

积分
75
发表于 2024-9-19 22:30:31 | 显示全部楼层
非常感谢你的观点,让我受益良多!

1

主题

58

回帖

135

积分

注册会员

积分
135
发表于 2024-9-25 19:12:37 | 显示全部楼层
保持尊重和礼貌对待其他成员是必要的。

2

主题

67

回帖

153

积分

注册会员

积分
153
发表于 2024-10-12 03:06:37 | 显示全部楼层
能给个链接吗?我想深入了解一下。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-15 11:34 , Processed in 0.091550 second(s), 29 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表